2017-01-11 9 views
6

प्राप्त करते समय राज्य अपडेट नहीं हो रहा है मैं प्रतिक्रिया के लिए नया हूं। मैं इस पर अटक गया हूं, वास्तव में कुछ मदद की सराहना करता हूं!नया प्रोप (ReactJS)

एक मूल घटक इस बच्चे के घटक में एक सरणी पास करेगा। जब मैं console.log (this.props.repairs) यह मुझे 4 की एक सरणी दिखाता है। मैं इस .state.sortedDataList को अद्यतन करने का प्रयास कर रहा हूं जब भी मरम्मत की सरणी पास हो जाती है। Console.log (this.state) अभी भी है एक खाली सरणी के रूप में sortedDataList दिखा रहा है।

मैं क्या गलत कर रहा हूं? बहुत बहुत धन्यवाद, किसी भी मदद की सराहना करते हैं।

class Repairs extends React.Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     sortedDataList: [] 
    }; 
    } 

    componentWillReceiveProps(nextProps) { 
    if(this.props != nextProps) { 
     this.setState({ 
     sortedDataList: this.props.repairs 
     }); 
    } 
    } 

    render() { 
    console.log(this.props); 
    console.log(this.state); 

    return (
     <div></div> 
    ); 
    } 
} 
+2

जयसे 444 और शुभम से उत्तर सही हैं। मैं जोड़ूंगा कि आपको वास्तव में यह निर्धारित करना चाहिए कि आपको पृष्ठ पर जो दिखाना है, उसका प्रतिनिधित्व करने के लिए राज्य की आवश्यकता है या यदि आप सख्ती से प्रोप का उपयोग कर सकते हैं। 'शुद्ध' कार्यात्मक प्रतिक्रिया घटक (घटक जो केवल प्रोप में है के आधार पर प्रस्तुत करते हैं) हमेशा एक अच्छा लक्ष्य है। –

+0

आप राज्य के लिए प्रोप क्यों सेट कर रहे हैं? यह आपके लिए क्या अच्छा करता है? अब आपके पास राज्य के साथ-साथ प्रोप में संग्रहीत एक ही डेटा की छाया है। उस प्रोप को जोड़ने के लिए अपरिवर्तनीय अर्थ माना जाता है, जिसे आप नहीं बदलते और उन्हें नहीं बदलना चाहिए। इस तरह के राज्य के लिए प्रोप सेट करना अब आपके अपरिवर्तनीय डेटा को परिवर्तनीय बना रहा है, जो एक विरोधी पैटर्न है और यह कोई बड़ा नंबर नहीं है। अधिक जानने के लिए इसे पढ़ें http://stackoverflow.com/a/28785276/2733506 –

उत्तर

1

componentWillReceiveProps पहले प्रस्तुत करने पर नहीं कहा जाता है। यही कारण है कि यह है कि आप किसी भी अद्यतन राज्य में

से देख पा रहे हैं है React Docs:

"।। लागू जब एक घटक नए मंच प्राप्त कर रहा है इस विधि प्रारंभिक प्रस्तुत करना के लिए बुलाया नहीं है"

यदि आप केवल पहली बार परिवर्तन करना चाहते हैं तो आप componentWillMount लाइफसाइकिल फ़ंक्शन का उपयोग कर सकते हैं और राज्य को अपडेट कर सकते हैं। बाद में आपको घटक बदल दिया WillReceiveProps कहा जाएगा।

class Repairs extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 

 
    this.state = { 
 
     sortedDataList: [] 
 
    }; 
 
    } 
 

 
    componentWillMount() { 
 
    
 
     this.setState({ 
 
     sortedDataList: this.props.repairs 
 
     },() => console.log(this.state.sortedDataList)); 
 
    
 
    } 
 
    componentWillReceiveProps(nextProps) { 
 
    if(this.props != nextProps) { 
 
     this.setState({ 
 
     sortedDataList: nextProps.repairs 
 
     }); 
 
    } 
 
    } 
 

 
    render() { 
 
    console.log("r",this.props); 
 
    console.log("r",this.state); 
 

 
    return (
 
     <div></div> 
 
    ); 
 
    } 
 
} 
 

 
class App extends React.Component { 
 
    render() { 
 
    var arr = ["1", "2", "3"]; 
 
    return (
 
     <div > 
 
     <Repairs repairs={arr}/> 
 
     </div> 
 
    ) 
 
    } 
 
} 
 
ReactDOM.render(<App/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script> 
 
<div id="app"></div>

+0

उत्तर के लिए धन्यवाद। असल में, मैंने देखा, जब मैंने पहली बार रूट मारा, तो सभी console.logs खाली सरणी के प्रारंभिक चरण के रूप में जाते हैं। लेकिन एसिंक कॉल के बाद माता-पिता को प्रोप भेजता है और यह पारित हो जाता है, और यह घटक WillReceiveProps फ़ंक्शन को हिट करता है। लेकिन इसने मुझे जीवन चक्र पर सवाल उठाया, और मुझे मेरी मूर्खतापूर्ण गलती मिली। यह होना चाहिए .सेटस्टेट ({ सॉर्टेडडेटालिस्ट: nextProps.repairs }); –

0

अपने निर्माता में

this.state = { 
    sortedDataList: [] 
}; 

आप शुरू में राज्य एक खाली सरणी के लिए सेट इतने पर पहले प्रस्तुत करना यह खाली हो जाएगा। फिर, जब भी प्रोप बदल जाते हैं, तो यह घटक WillReceiveProps() के माध्यम से अपडेट हो जाएगा।

जैसा कि शुभम ने कहा, घटकविल्लरसेवप्रॉप() को पहले प्रस्तुत करने पर नहीं कहा जाता है। आप सही से पहले प्रस्तुत करना रंगमंच की सामग्री को प्रतिबिंबित करने के राज्य चाहते हैं, आप तो जैसे निर्माता में रख करना होगा:

this.state = { 
    sortedDataList: this.props.repair 
}; 
+2

प्रारंभिक राज्य को प्रोप असाइन करना एक विरोधी पैटर्न है और हमें इसका पालन नहीं करना चाहिए। http://stackoverflow.com/questions/28785106/reactjs-why-is-passing-the-component-initial-state-a-prop-an-anti-pattern।हालांकि मैं इसे एक सरल समाधान से सहमत हूं, लेकिन मैंने जानबूझकर उपर्युक्त कारण –

+0

के लिए इसका उल्लेख नहीं किया है, ठीक है – Jayce444

4

कोई बात नहीं, मेरी मूर्खतापूर्ण गलती मिल गया! यदि भविष्य में कोई और इस पर फंस जाता है ...

componentWillReceiveProps(nextProps) { 
    if(this.props != nextProps) { 
    this.setState({ 
     sortedDataList: nextProps.repairs 
    }); 
    } 
} 
+0

संक्षेप में, समस्या सेट है सेट को अगले प्रोप के बजाय वर्तमान प्रोप के साथ बुलाया गया था। – Aaron