2015-10-23 8 views
8

के साथ सूची में आइटम को हाइलाइट करते समय प्रदर्शन मेरे पास एक बड़ी सूची है, मान लें कि 3k सदस्य हैं। मेरे पास एक घटक है जो इस सूची और प्रत्येक सूची आइटम के लिए एक घटक प्रस्तुत करता है। बाहरी घटक में हम इस तरह कोड है:प्रतिक्रिया

const list = _.map(this.props.items, (item) => { 
    return <ListItem key={item.key} {...item} /> 
}); 

और फिर हमारे JSX में हम सूची जगह:

<div> 
    <h3>Check out my sweet list </h3> 
    { list } 
</div> 

यहाँ रगड़ है: मैं उपयोगकर्ता को दिखाने के लिए जब वे एक आइटम पर क्लिक करें कि आइटम का चयन किया गया है। तो मेरे ListItem घटक में मेरे पास कोड है, इस पर आधारित है कि व्यक्तिगत आइटम में selected संपत्ति है या नहीं, स्वयं को हाइलाइट करता है। मैं पूरी सूची को फिर से प्रस्तुत करने से प्रतिक्रिया कैसे रोकूं, जब केवल एक ही आइटम पर चयनित संपत्ति बदल जाती है? मुझे यकीन है कि मुझे किसी भी तरह से मेरे कोड को पुन: स्थापित करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि इस समस्या को कौन सी संरचना हल करेगी। किसी भी और सभी सवालों का जवाब देने में अग्रिम धन्यवाद और अग्रिम धन्यवाद!

नोट्स:

  • मैं किसी सूची में 3k आइटम प्रतिपादन यह नहीं कह रहा हूँ अच्छा, बस का मानना ​​है इस होना चाहिए, सिद्धांत रूप में, प्रतिक्रिया के साथ क्या करना संभव।
  • सूची वास्तविक डोम पर सचमुच पुन: प्रस्तुत नहीं की जा रही है, लेकिन वर्चुअल डोम सब कुछ की तुलना करने का काम कर रहा है, और इसमें बहुत समय लगता है।
+0

यहां तक ​​कि आप एक पूरी सूची मिलता है, मेरा मानना ​​है कि प्रतिक्रिया उन्हें आभासी डोम में तुलना करते हैं और केवल चुने हुए लोगों को बदल फिर से प्रस्तुत करना, कि तुम भी आभासी डोम ऐसा नहीं करने के लिए की तुलना कि करना चाहते हैं? – fuyushimoya

+0

बस ऑफटॉपिक - मैं क्यों देख रहा हूं "प्रतिक्रिया 1000 वस्तुओं की सूची के साथ निष्पादक नहीं है" - किस तरह का यूएक्स एक साथ कई प्रकार के आइटम प्रदर्शित करता है? जब तक कि यह कुछ दुर्लभ मामला नहीं है, मुझे खोज/फ़िल्टरिंग/अंकन/प्रगतिशील लोडिंग/सीमाओं का उपयोग न करने का कोई कारण नहीं दिखता है, और यदि सदस्य सूची बढ़ती है तो यह हमेशा अंततः निष्पादित हो जाएगी यदि आप सबकुछ प्रदर्शित करते हैं –

+0

@fuyushimoya हाँ वर्चुअल डोम है जगह लेना, इसलिए यह पूरी सूची है जो डोम पर सचमुच पुनः प्रस्तुत नहीं हो रही है, अगर उत्सुकता से बचने के लिए कोड को ढांचा बनाने का कोई तरीका है, तो यह उत्सुक है, क्योंकि यह सेकंड के क्रम में है (और हाँ, हाँ मुझे पता है कि यह एक है बड़ा उदाहरण और आपको सूची में 3k आइटम प्रस्तुत नहीं करना चाहिए)। –

उत्तर

5

ठीक है, मैं यह पता लगा। प्रत्येक व्यक्तिगत आइटम पर shouldComponentUpdate को सफलतापूर्वक कार्यान्वित करने से भारी प्रदर्शन में वृद्धि आती है। मैं इसे एक साधारण कारण से करने में असफल रहा था।

shouldComponentUpdate(nextProps) { 
    return !_.isEqual(nextProps, this.props); 
} 

हालांकि ... मैं प्रत्येक आइटम के अपने घोषणा पर इस कर रहा था:

onClick={this.handleItemClick.bind(this, item.key)} 

मतलब कौन सा है कि this.props.onClick === nextProps.onClick हमेशा अवास्तविक लौटाते हैं, तो हर एक आइटम हमेशा खुद होने के लिए की आवश्यकता होगी, के रूप में घोषणा करेंगे rerendered। एक कस्टम चेक लागू करने के बाद, यह अब बहुत तेज है!