بدأت رحلتي في React منذ أربع سنوات مع المكونات الوظيفية والخطافات. ثم جاء "Siswe"، زميل مشارك في المعسكر التدريبي ومتحمس لمكونات الفصل الدراسي المقيم لدينا. بينما كان الباقون منا يتعاونون في مشاريع جماعية ذات مكونات وظيفية، تشبث سيسوي بالمكونات الطبقية بولاء لا يتزعزع.
فكر فيها على أنها مكعبات ليغو - يمكنك دمجها بطرق مختلفة لإنشاء هياكل معقدة. إنها أجزاء مستقلة وقابلة لإعادة الاستخدام من التعليمات البرمجية التي تغلف واجهة المستخدم والمنطق.
عادةً ما تبدو إعادة استخدام مكون داخل مكون آخر كما يلي:
import MyComponent from './MyComponent'; function ParentComponent() { return (); }
مكونات الفئة والمكونات الوظيفية هما الطريقتان الأساسيتان لإنشاء المكونات في React.
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } handleClick = () => { this.setState({ count: this.state.count 1 }); }; render() { return (); } } export default Counter;You clicked {this.state.count} times
هذا مكون فئة، تم إنشاؤه باستخدام فئات JavaScript التي توسع فئة React.Component.
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count 1); }; return (); } export default Counter;You clicked {count} times
من ناحية أخرى، يعد هذا مكونًا وظيفيًا، مكتوبًا كوظيفة جافا سكريبت بسيطة.
تقوم مكونات الفئة بإدارة حالتها الداخلية باستخدام this.state. تتم تهيئة هذا عادةً في المُنشئ، ويتم الوصول إليه باستخدام كائن this.state، ويتم تحديثه باستخدام أسلوب this.setState، كما هو موضح في مقطع التعليمات البرمجية أعلاه.
كانت المكونات الوظيفية عديمة الجنسية في البداية. ولكن مع تقديم الخطافات، اكتسبوا القدرة على إدارة منطق الحالة ودورة الحياة. باستخدام الخطاف useState لإدارة الحالة، فإنه يُرجع زوجًا من القيم: الحالة الحالية ووظيفة لتحديثها، كما هو موضح أعلاه. وهذا يكفي لإدارة الدولة البسيطة. للحصول على منطق حالة أكثر تعقيدًا يتضمن قيمًا فرعية متعددة، أو عندما تعتمد الحالة التالية على الحالة السابقة، فأنت تريد استخدام useReducer.
على سبيل المثال:
import React, { useReducer } from 'react'; const initialState = { count: 0, step: 1, }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { ...state, count: state.count state.step }; case 'decrement': return { ...state, count: state.count - state.step }; case 'setStep': return { ...state, step: action.payload }; default: throw new Error(); } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); const increment = () => dispatch({ type: 'increment' }); const decrement = () => dispatch({ type: 'decrement' }); const setStep = (newStep) => dispatch({ type: 'setStep', payload: newStep }); return (); } export default Counter;Count: {state.count}
Step: {state.step}
setStep(Number(e.target.value))} />
هنا، useReducer يدير قيم الحالة المتعددة ومنطق التحديث المعقد بطريقة منظمة وقابلة للصيانة. الخطافات مخصصة حصريًا للمكونات الوظيفية.
لا تقم مطلقًا بتعديل أو تغيير كائن الحالة بشكل مباشر، بغض النظر عن نوع المكون. بدلاً من ذلك، قم بإنشاء كائن جديد بالقيم المحدثة. يساعد هذا الأسلوب React على تتبع التغييرات بكفاءة وتحسين عمليات إعادة العرض.
مثال للمكون الوظيفي:
import React, { useState } from 'react'; function UserProfile() { const [user, setUser] = useState({ name: 'Jane Doe', age: 30 }); const handleNameChange = (newName) => { setUser({ ...user, name: newName }); // Create a new object with updated name }; return (); } export default UserProfile;Name: {user.name}
Age: {user.age}
handleNameChange(e.target.value)} />
مثال على مكون الفصل:
import React, { Component } from 'react'; class UserProfile extends Component { state = { user: { name: 'Jane Doe', age: 30 } }; handleNameChange = (newName) => { this.setState(prevState => ({ user: { ...prevState.user, name: newName } // Create a new object with updated name })); }; render() { return (); } } export default UserProfile;Name: {this.state.user.name}
Age: {this.state.user.age}
this.handleNameChange(e.target.value)} />
في كلا المثالين، نقوم بتحديث خاصية الاسم لكائن المستخدم مع الحفاظ على سلامة الكائن الأصلي. يضمن ذلك إنشاء كائن حالة جديد، مع الحفاظ على الثبات ومنع المشكلات المحتملة في تحديثات الحالة. ويضمن الالتزام بهذا السلوك الذي يمكن التنبؤ به، وتحسين الأداء، وتصحيح الأخطاء بشكل أسهل.
يعتبر النهج الوظيفي بشكل عام أكثر إيجازًا وقابلية للقراءة، وغالبًا ما يكون كافيًا بسبب بساطته وكفاءته. ومع ذلك، توفر مكونات الفئة مزيدًا من التحكم في إدارة الحالة وأساليب دورة الحياة، خاصة عند التعامل مع المنطق المعقد أو تحسين الأداء. وهذا يعني بنية أفضل لتنظيم المنطق المعقد.
لا يكون الاختيار بين المكونات الوظيفية والفئوية واضحًا دائمًا، حيث لا توجد قاعدة صارمة. قم بتقييم متطلبات المكون الخاص بك واختار النوع الذي يتوافق بشكل أفضل مع متطلبات مشروعك.
ما هو المكون الذي تستمتع بالعمل معه أكثر؟
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3