مرحبا جميعا،
أثناء العمل على بعض تحسينات الأداء ، اكتشفت أنه لم يتم استدعاء rowHasChanged
في أي من قوائمنا. هذه القوائم عبارة عن قوائم تمرير لا نهائية ، مما يعني أنه عندما تصل إلى النهاية ، ستجلب المزيد من العناصر لعرضها ثم تفريغها في القائمة.
يبدو أنه يتم تحديث جميع الإدخالات في القائمة كلما قمنا بتغيير محتوى مصدر البيانات. لدينا shouldComponentUpdate
في مكانه لجميع الصفوف ، ولكن من خلال فهمي لـ rowHasChanged
، لن تكون هناك حاجة لعرض هذه الصفوف مرة أخرى.
لقد أنشأت مثالًا بسيطًا يوضح كيف نلحق العناصر بالقائمة: https://gist.github.com/janmonschke/c9c84b6050683da0c64f
ما نقوم به في الأساس هو:
constructor() {
// (...)
this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => {
console.log('rowHasChanged');
return r1 !== r2;
}});
// (...)
}
onEndReached = () => {
// append data to the end
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.ds.cloneWithRows(setData)
});
console.log('onEndReached');
};
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow}
onEndReached={this.onEndReached}
/>
);
}
لكن rowHasChanged
لا يُسجّل أبدًا.
هل أستخدمه بطريقة خاطئة؟ هل هناك طرق أفضل للإلحاق بـ ListView؟
نفس السلوك في 0.18.0
و 0.19.0
مرحبًا janmonschke ، شكرًا للإبلاغ عن هذه المشكلة!
إن React Native ، كما سمعت على الأرجح ، تزداد شعبية حقًا والحقيقة هي أننا نشعر بالإرهاق قليلاً من النشاط المحيط بها. هناك الكثير من المشكلات التي يتعين علينا التعامل معها بشكل صحيح.
react-native
أو لمزيد من التفاعلات في الوقت الفعلي ، اسأل على Discord في # قناة رد فعل أصلية.حسنًا ، وجدت الحل في: http://stackoverflow.com/a/33871118.
يبدو أنه من المهم الاستنساخ من مثيل DataSource الصحيح ؛)
لذلك يجب أن يكون الكود من الجوهر:
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(setData)
});
يبدو هذا كخطأ يتسلل بسهولة إلى قاعدة بياناتك. أتساءل عما إذا كان يجب التأكيد بشكل أكبر على الاستخدام الصحيح لـ DataSource
في الوثائق.
شكرا janmonschke! أوافق على أنه كان لدي مجموعة من المشاهدات يتم إعادة عرضها باستمرار ولم أستطع معرفة سبب حدوث ذلك ولماذا لم يتم استدعاء الوظيفة rowHasChanged
مطلقًا. 👊
التعليق الأكثر فائدة
حسنًا ، وجدت الحل في: http://stackoverflow.com/a/33871118.
يبدو أنه من المهم الاستنساخ من مثيل DataSource الصحيح ؛)
لذلك يجب أن يكون الكود من الجوهر:
يبدو هذا كخطأ يتسلل بسهولة إلى قاعدة بياناتك. أتساءل عما إذا كان يجب التأكيد بشكل أكبر على الاستخدام الصحيح لـ
DataSource
في الوثائق.