2015-12-23 9 views
7

क्या सबसे अच्छा तरीका है एक गहरी नोड जो भी एक माता पिता के नोड द्वारा नियंत्रित किया जा करने की जरूरत है में राज्य परिवर्तनों को संभाल है।प्रतिक्रिया घटना पदानुक्रम मुद्दा

<Table> 
 
    <Row prop={user1}> 
 
    <Column prop={user1_col1} /> 
 
    <Column prop={user1_col2} /> 
 
    </Row> 
 
    <Row prop={user2}> 
 
    <Column prop={user2_col1} /> 
 
    <Column prop={user2_col2} /> 
 
    </Row> 
 
    <TableFooter> 
 
    <FooterColumn prop={sum1} /> 
 
    <FooterColumn prop={sum2} /> 
 
    </TableFooter> 
 
</Table>

जब भी किसी स्तंभ संपत्ति में कुछ भी बदल रहा है मैं केवल कि स्तंभ घटक के भीतर इस मूल्य के राज्य बनाए रखने के लिए है: यहाँ मेरी स्थिति है। हालांकि, अब मुझे FooterColumn घटक में इन मानों का योग चाहिए। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?

मैं राज्य परिवर्तन मैं कई स्थानों में राज्यों रखने के लिए और फिर इसे नीचे से गुजरना होगा पारित करने जा रहा हूँ, तो यह कठिन बहुत काम है। क्या EventEmitters का उपयोग करना सबसे अच्छा है या क्या मुझे कुछ याद आ रहा है?

उत्तर

5

तो, आप सभी की जरूरत बच्चों के साथ माता-पिता घटक में राज्य का ट्रैक रखने के लिए, और साझा राज्य अद्यतन समारोह है:

var Parent = React.createClass({ 
    getInitialState: function() { 
    return { 
     users: [ 
     {name: 'Matt', values: [1, 2]}, 
     {name: 'user517153', values: [4, 5]} 
     ] 
    }; 
    }, 
    updateValue: function(rowId, colId, newValue) { 
    var newUsersState = this.state; 
    newUsersState.users[rowId].values[colId] = newValue; 
    this.setState({users: newUsersState}); 
    }, 
    render: function() { 
    var rows = this.state.users.map(function(user, r) { 
     var cols = user.values.map(function(value, c) { 
     return (
      <Column key={c} prop={value} rowId={r} colId={c} onChange={this.updateValue}/> 
     ); 
     }); 

     return (
     <Row key={r} prop={user}> 
      {cols} 
     </Row> 
    ); 
    }); 

    // Yes, it could be more efficient if you did it all in one map/forEach - doing this in a second one for clarity 
    var footerCols = this.state.users.map(function(user) { 
     var sum = 0; 
     user.values.forEach(function(value) { sum+= value; }); 
     return (
     <FooterColumn prop={sum} /> 
    ); 
    }); 

    return (
     <Table> 
     {rows} 
     <TableFooter> 
      {footerCols} 
     </TableFooter> 
     </Table> 
    ); 
    } 
}); 

अपने Column कक्षा में, आप बस पंक्तियों के साथ कुछ चाहिए का:

var Column = React.createClass({ 
    onChange: function(event) { 
    var props = this.props; 

    var newValue = event.target.value; // Get the new value somehow - this is just an example 
    props.onChange(props.rowId, props.coldId, newValue); 
    }, 
    render: function() { 
    var props = this.props; 

    return (
     <td onChange={this.onChnage}>{props.prop}</td> 
    ); 
    } 
}); 

आशा है कि यह समझ में आता है।

+0

मैं इसे दूसरा करता हूं। आपको सभी अनुप्रयोग तर्क को शीर्षतम घटक में रखने का प्रयास करना चाहिए, और घोंसला वाले घटक केवल उनके गुणों और आग घटनाओं को प्रस्तुत करते हैं जब उनके भीतर कुछ होता है, ताकि माता-पिता कॉलबैक के साथ परिवर्तनों का जवाब दे सकें। – juandemarco

+0

धन्यवाद! लेकिन बात यह है कि मेरे बीच एक पंक्ति घटक भी है, इसका मतलब यह है कि इसे 2 बार गुजरना है। अगर मुझे एक और सबकंपोनेंट बनाना चाहिए, तो यह 3 गुना होगा, ये वास्तव में थकाऊ लगता है। क्या यह वह बिंदु है जहां आपको पहले से ही फ्लक्स की तरह कुछ उपयोग करना चाहिए? – user517153

+0

तो, पहले इस्तेमाल किए गए मामले में 'पंक्ति' वास्तव में 'कॉलम' का अभिभावक नहीं है, और इसलिए 'पंक्ति' को 'कॉलम' के प्रोप के बारे में कुछ भी जानने की आवश्यकता नहीं है। वास्तव में, एक घटक दूसरे घटक का अभिभावक होता है यदि वह घटक सीधे उसके बच्चे को प्रस्तुत करता है। तो, आपके पास 100 नेस्टेड divs के साथ 'DivMaker' नामक एक घटक हो सकता है, लेकिन उन सभी divs के लिए माता-पिता उनके नेस्टेड गहराई के बावजूद, 'DivMaker' होगा। –

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