2015-11-12 4 views
10

प्रतिक्रिया मूल निवासी ListView: पंक्तियाँ फिर से प्रतिपादन नहीं कर रहे हैं डेटा स्रोत राज्य बदल गया है के बाद।प्रतिक्रिया मूल निवासी ListView पंक्ति नहीं फिर से प्रतिपादन राज्य परिवर्तन के बाद

यहाँ मेरी कोड का एक सरलीकृत संस्करण है:

render(): { 
    return <ListView 
    dataSource={this.state.DS} 
    renderRow={this.renderRow}/> 
} 

renderRow(item): { 
    return <TouchableOpacity onPress={() => this.handlePress(item)}> 
    {this.renderButton(item.prop1)} 
    </TouchableOpacity> 
} 

renderButton(prop1): { 
    if (prop1 == true) { 
    return <Text> Active </Text> 
    } else { 
    return <Text> Inactive </Text> 
    } 
} 

handlePress(item): { 
    **Change the prop1 of *item* in an array (clone of dataSource), then** 
    this.setState({ 
    DS: this.state.DS.cloneWithRows(arrayFromAbove) 
    }) 
} 

फेसबुक के उदाहरण के अनुसार, ListView हर बार डेटा स्रोत बदल गया है rerender माना जाता है। क्या ऐसा इसलिए है क्योंकि मैं केवल डेटा स्रोत में किसी आइटम की संपत्ति बदल रहा हूं? ऐसा लगता है कि रेंडररो फ़ंक्शन दोबारा प्रतिपादन नहीं कर रहा है, लेकिन रेंडर() फ़ंक्शन डेटासोर्स परिवर्तन से है।

धन्यवाद।

उत्तर

1

सबसे पहले आप getInitialState समारोह में datasource सेट करना होगा। फिर, this.setState({}) पर कॉल करके और नए डेटास्रोत में गुजरकर डेटास्रोत बदलें। ऐसा लगता है कि आप उपरोक्त दाएं ट्रैक पर हो सकते हैं, लेकिन मैंने सूची दृश्य डेटासोर्स here बदलते हुए एक कामकाजी उदाहरण स्थापित किया है। मुझे आशा है कि इस मदद करता है

https://rnplay.org/apps/r3bzOQ

+1

धन्यवाद और अधिक पढ़ सकते हैं! मैंने निश्चित रूप से मेरी परियोजना में भी ऐसा ही किया है। मेरा मानना ​​है कि समस्या यह है कि जब सूची स्रोत ऑब्जेक्ट्स की सरणी है और केवल एक ऑब्जेक्ट की एक संपत्ति बदल जाती है तो ListView एक पंक्ति को फिर से प्रस्तुत नहीं करता है। कंसोल मुझे बताता है कि डेटा स्रोत में एक ऑब्जेक्ट की संपत्ति वास्तव में बदल गई है, लेकिन ListView इसे पहचानता है और बदली गई पंक्ति को पुन: प्रस्तुत नहीं करता है। क्या आपके पास इसके लिए एक संभावित कामकाज है? – skleest

+0

अगर आप इसे कॉल करते हैं तो यह फिर से प्रस्तुत होगा .सेटस्टेट। क्या आप यहां इस मुद्दे को डुप्लिकेट कर सकते हैं: https://rnplay.org/apps/Dw08-g। –

+0

निश्चित रूप से, इसे यहाँ दोहराया गया है (https://rnplay.org/apps/1-sNcQ)। ऐसा लगता है कि डेटासोर्स बदल रहा है लेकिन रेंडररो फ़ंक्शन नहीं चल रहा है। धन्यवाद। – skleest

6

प्रतिक्रिया बहुत चालाक डेटा स्रोत में है और यदि सूची फिर से रेंडर किया जाना चाहिए परिवर्तन का पता लगाने के लिए है। यदि आप listView को अपडेट करना चाहते हैं, तो मौजूदा ऑब्जेक्ट्स के गुणों को अपडेट करने के बजाय नई ऑब्जेक्ट बनाएं। कोड कुछ इस तरह दिखेगा:

let newArray = this._rows.slice(); 
newArray[rowID] = { 
    ...this._rows[rowID], 
    newPropState: true, 
}; 
this._rows = newArray; 

let newDataSource = this.ds.cloneWithRows(newArray); 
this.setState({ 
    dataSource: newDataSource 
}); 

आप के बारे में सुझाव/उदाहरण के लिए समान issue on Github

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