اذهب إلى المحتوى

السؤال

نشر

 

تطبيقي هو في الأساس قائمة بفلاتر filters وزر لتغيير التخطيط. في الوقت الحالي ، أستخدم ثلاثة مكونات: <list /> و <Filters /> و <TopBar /> ،  عندما أقوم بتغيير الإعدادات في <Filters /> أريد تشغيل بعض الدوال الموجودة في <list /> لتحديث الواجهة، كيف يمكنني عمل ذلك؟ كيف يمكنني جعل هذه المكونات الثلاثة تتفاعل مع بعضها البعض، أو هل أحتاج إلى نوع من إدارة الحالة state management في المكون الأب لهذه المكونات الثلاثة؟

Recommended Posts

  • 0
نشر

مرحباً بك: 
تحتاج ال stateManagement فقط في حالة كانت ال state مشتركة في مكونات كثيرة ولكن هنا هي فقط state ما بين الثلاث مكونات كالآتي: 
 

function App() {
  state= {
	isFilterChanged: false
  };
  // عند تغيير الفلاتر تقوم بتحديث ما تريد في ال state
  updateFilterState = () => {
  // تقوم بتحديث كمثال isFilterChanged
    this.setState({ isFilterChanged: true });
  }
  
  render() {
  	const { isFilterChanged } = this.state; // تمرير الخاصية للمكونات الأخرى
    
  	return(
      <>
    	<TopBar isFilterChanged={isFilterChanged} />
      	/* عند تغيير الفلاتر نقوم بتحديث ال state 
        وتمريرها للمكونات الأخرى
        */
      	<Filters onChangeFilter={updateFilterState} /> 
      </>
    );
  }
}

وعندما تريد الإستفادة من التغيير الحاصل يجب أن تستقبل isFilterChanged بداخل المكونات الأخرى ومقارنة قيمتها الحالية بقيمتها السابقة فإذا كانت مختلفة تقوم بتنفيذ كود معين 

function TopBar() {
  componentDidUpdate(prevProps) {
  	const { isFilterChanged } = this.props;
    // التحقق ما إذا كانت القيمة تغيرت أم لا 
    if(prevProps.isFilterChanged !== isFilterChanged) {
    	// نقوم بتنفيذ دالة هنا أو أي شيئ تريده لأن القيمة اتغيرت
      console.log('isFilterChanged', isFilterChanged)
    }
  }
  
  render() {
    
  	return(
      <>
			<nav>Header</nav>
      </>
    );
  }
}

 

  • 0
نشر

أنصح في هذه الحالة استعمال هيكلة مرفوقة ب state managment وأقترح استخدام ال context api لأنه بسيط ويتفق مع حجم التطبيق الحالي الخاص بك يمكنك الاطلاع على تعليقي هنا ﻷخذ فكرة 

https://academy.hsoub.com/questions/14018-تغير-مكون-بناءًا-على-حالة-مكون-react-آخر؟/#comment-39584

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...