2016-07-24 6 views
5

मूल निवासी के ListView documentation प्रतिक्रिया के अनुसार, एक ListView डेटा स्रोत निर्धारित में rowHasChanged के मानक कार्यान्वयन निम्नलिखित के साथ घोषित किया जाना चाहिए जब भी पंक्ति बदल गया है:रिएक्टिव मूल सूची दृश्य का 'rowHasChanged' का उद्देश्य क्या है?

var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 

मेरा प्रश्न यहाँ है: क्या प्रदान करने के लिए होने के पीछे विचार यह है एक पंक्ति बदल गई है या नहीं, यह पता लगाने का एक स्पष्ट और मामूली कार्यान्वयन? क्या ऐसे कोई मामले हैं जहां यह कार्यान्वयन सच नहीं है? मैंने कल्पना की होगी कि ListViewDataSource कम से कम एक डेटासेट बनाने के लिए हर बार इस कोड को कॉपी और पेस्ट करने के बजाय इस तरह के एक छोटे से फ़ंक्शन के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करता।

उत्तर

1

मैं बात नहीं कर सकता कि क्यों कोई डिफ़ॉल्ट प्रदान नहीं किया गया था, लेकिन यह उपलब्ध क्यों है यदि आपके पास जटिल वस्तुओं के साथ एक सूची दृश्य है और यह जानने के लिए एक और अधिक प्रभावी तरीका है कि कोई पंक्ति बदल गई है ... उदाहरण के लिए यदि आपकी सूची आइटम के सभी एक आईडी संपत्ति थी और आप जानते थे कि यदि आईडी एक ही तो था संपूर्ण वस्तु ही था तुम कर सकते हो:

var ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1.id !== r2.id }); 
+0

आईडी की तुलना में सभी वस्तुओं की तुलना से अधिक कुशल नहीं है, वास्तव में यह शायद कम कुशल है (जावास्क्रिप्ट मुख्य रूप से जाँच में वस्तु तुलना करता है, तो स्मृति पते समान हैं): यहाँ एक व्याख्या है। वे जो प्लेसहोल्डर कार्यान्वयन प्रदान करते हैं वह संभवतः उतना ही कुशल है जितना आप प्राप्त कर सकते हैं, इसलिए मुझे यकीन नहीं है कि यहां उद्देश्य दक्षता है या नहीं। – Tarek

+0

मेरी राय में @ rmevans9 स्पष्टीकरण सही है https://github.com/facebook/react-native/issues/4104 –

0

rowHasChanged में मदद करता है घटक अधिक कुशल जब फिर से प्रतिपादन किया पूरी सूची यह पूरी सूची को पुनः प्रस्तुत नहीं करके प्रदर्शन हासिल करने का एक तरीका प्रदान करता है।

https://facebook.github.io/react-native/docs/performance.html

संबंधित मुद्दे