React: معالجة DOM في componentDidUpdate

تم إنشاؤها على ٢٣ سبتمبر ٢٠١٦  ·  3تعليقات  ·  مصدر: facebook/react

مرحبًا ، هذا أشبه بسؤال ، أود أن أفتح مناقشة بخصوص معالجة DOM في componentDidUpdate .

أنا أقوم بإنشاء مكون إضافي لـ React. يجب أن يقوم ببعض حسابات DOM ، لأن CSS ليست قوية بما يكفي لتغطية كل ما يحتاجه هذا المكون الإضافي. تكمن المشكلة في أنني بحاجة إلى ضبط بعض خصائص CSS اعتمادًا على القيمة المرجعة لـ getBoundingClientRect () لبعض عناصر DOM الأخرى التي يقدمها نفس المكون .

من الناحية الفنية ، لدينا 3 خيارات:

1) احسب getBoundingClientRect في componentDidUpdate واستدعاء setState مع القيم المحسوبة. أخشى الحلقة اللانهائية التي يمكن أن تحدث في حالات معينة ، لذلك لن أذهب إلى هذه الحلقة.

2) افعلها كما في 1) والعب قليلاً بـ shouldComponentUpdate ، لكن هذا يبدو معقدًا للغاية وغير قابل للقراءة. تنبثق الكثير من الأسئلة التي تعتمد على حالة استخدام معينة.

3) تحديث DOM من componentDidUpdate. هذا هو الحل الذي قررت البحث عنه ، إنه يعمل ، إنه بسيط ومستقر ويعمل على النحو المنشود. ومع ذلك ، أشعر أنني على حافة الهاوية ، لذلك أردت التحقق مرة أخرى من أن هذه طريقة جيدة للقيام بالأشياء. هل من المقبول التلاعب بـ DOM في componentDidUpdate ؟ يتم استدعاؤها في كل مرة يتم فيها render ، وأنا موافق على التخلص من التغييرات الخاصة بي ، لأنه بالنسبة لـ render ، سأقوم بتعديل DOM مرة أخرى.

هذا جزء من الكود

componentDidMount() {
  this.recalculateIndent();
}

componentDidUpdate() {
  this.recalculateIndent();
}

recalculateIndent() {
  // calculate indent based on getBoundingClientRect of some DOM reference
  this.textareaRef.style.textIndent = `${indent}px`;
}

render() {
   return (
   ...
   <textarea ref={ref => this.textareaRef = ref}/>
   ...
   );
}

التعليق الأكثر فائدة

jvorcak باستخدام componentDidUpdate هو المكان الصحيح لمعالجة DOM يدويًا بعد تصيير. في المستندات:

استخدم هذا كفرصة للعمل على DOM عندما يتم تحديث المكون.

أيضًا ، نحاول استخدام أداة تعقب المشكلات فقط لطلبات الميزات وتقارير الأخطاء. يجب توجيه أسئلة الاستخدام إلى مكان آخر ، مثل Discuss.reactjs.org أو StackOverflow. شكرا!

ال 3 كومينتر

كل حل (طريقة دورة حياة المكون) مناسب للحالة الملموسة ، لكن معالجة DOM خاطئة. استخدام الحالة وإعادة تصيير المكون. مثال لحالة الاستخدام الأخيرة "العنوان الثابت للجدول + التمرير الافتراضي لجسم الجدول" ، آمل أن يساعدك هذا في فهم التدفق الصحيح.

  1. مُنشئ المكون: قيمة الحالة الأولية: bodyHeight = 0 (أو فارغ ، كما تريد).
  2. التجسيد الأول ، يعرض رأس الجدول ولكن نص الجدول فارغًا (0 صفوف).
  3. componentDidMount - اقرأ ارتفاع DOM والحاوية (+ بعض العمليات الحسابية ...) و setState لـ bodyHeight (إعادة تصيير).
  4. التصيير الثاني ، bodyHeight! == 0 ، سيتم تقديم جسم الجدول. الآن ، معلمة الارتفاع معروفة ( يمكنني تعيينها باستخدام خاصية مكون "النمط" ، بدلاً من معالجة DOM ) ، يمكنني إضافة مكونات للصفوف.
  5. مستمع إضافي للأحداث لـ "تغيير الحجم" (تغيير حجم المستند / المتصفح) ، إضافة في componentDidMount ، وإزالة في componentWillUnmount. في معالج الحدث ، أفعل نفس الشيء كما هو الحال في componentDidMount - اقرأ قيم ارتفاع DOM الجديدة و setState.
  6. لا يوجد أي تلاعب في DOM يدويًا ، رد فعل يقوم بالمهمة.

jvorcak باستخدام componentDidUpdate هو المكان الصحيح لمعالجة DOM يدويًا بعد تصيير. في المستندات:

استخدم هذا كفرصة للعمل على DOM عندما يتم تحديث المكون.

أيضًا ، نحاول استخدام أداة تعقب المشكلات فقط لطلبات الميزات وتقارير الأخطاء. يجب توجيه أسئلة الاستخدام إلى مكان آخر ، مثل Discuss.reactjs.org أو StackOverflow. شكرا!

ماذا لو كنت تريد تحديث أحد المكونات بعد تغيير عنصر في آخر؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات