2016-09-28 100 views
1

我有兩個組件。一個名爲「GenerateRecipesFromList」的是一系列包含食譜標題的「框」,另一個是稱爲「AddButon」的子組件。現在,Add按鈕可以更新localStorage,但爲什麼它不會「觸發」父組件中的狀態更改和重新呈現?React JS - 獲取單獨的組件以在localStorage狀態發生更改時重新渲染

我CodePen這是here

var GenerateRecipesFromList= React.createClass({ 
    getInitialState: function(){ 
     const defaultData = [["Spaghetti", "pasta, oil, sauce, parsely, cheese"], ["PB&J", "PB, J"]] 
     const localData = JSON.parse(localStorage.getItem('reclist')); 
     return { 
     reclist: localData ? localData : defaultData 
     } 
    }, 
    render: function(){ 
    var testData = JSON.parse(localStorage.getItem('reclist')); 
    if(testData === null){ 
     localStorage.setItem('reclist', JSON.stringify(this.state.reclist)); 
     } 
     var currentData = JSON.parse(localStorage.getItem('reclist')); 
     var rows = []; 
      for(var i=0; i<currentData.length; i++){ 
     var thedivname = i; 
      rows.push(<div id= {this.thedivname} className="individual"> <span><h2>{this.state.reclist[i][0]}</h2></span> 
     </div>); 
     } 
     return(
     <div className="centerMe"> 
      <AddButton /> 
      {rows} 
     </div> 
    ); 
    }, 
}); 

var AddButton = React.createClass({ 

     overlayAdd: function() { 
     var el = document.getElementById("overlay"); 
     el.style.visibility = (el.style.visibility === "visible") ? "hidden" : "visible"; 
     }, 

     exposeAddRecipe: function(){ 
      var exposeCurrentData = []; 
      var userInput = []; 
      exposeCurrentData = JSON.parse(localStorage.getItem('reclist')); 
     var newTitle = document.getElementById("title").value; 
     var newIngredients = document.getElementById("ingredients").value; 

     userInput.push(newTitle); 
     userInput.push(newIngredients); 
     exposeCurrentData.push(userInput); 
      localStorage.setItem('reclist', JSON.stringify(exposeCurrentData)); 
      this.setState({ reclist: exposeCurrentData}); 
     this.overlayAdd(); 
     }, 

     render: function(){ 
     return(
     <div> 
      <button type="button" id="btnAdd" onClick={this.overlayAdd}>Add a New Recipe</button> 
      <div id="overlay"> 
      <div> 
      <form > 
      <p>Add a new recipe.</p> 
      Recipe Title: <input type="text" name="title" id="title" /><br/> 
      Ingredients: <input type="text" name="ingredients" id="ingredients" /><br/> 
      <button type="button" className="normalBtn" onClick={this.exposeAddRecipe}>Save</button> 
      </form> 
      <p>Click here to <a href='#' onClick={this.overlayAdd}>close</a></p> 

      </div> 
     </div> 
     </div> 
    ); 
    } 
    }); 

    var Footer = React.createClass({ 
    render() { 
    return (
     <footer> 
     <div id="containerfooter"> 
      <p>Written by <a href="http://codepen.io/profaneVoodoo/full/dXBJzN/">John Gillespie</a> for FreeCodeCamp Campers. Happy Coding!</p> 
    </div> 
     </footer> 
    ); 
    } 
    }); 


var MyApp = React.createClass({ 
    render: function() { 
    return(
     <div className = "mainDiv"> 
     <div className="titleDiv"> 
     <h1>Recipe Box</h1> 

      <GenerateRecipesFromList /> 
      <Footer /> 
     </div>   
     </div> 
    ); 
}, 
}); 

ReactDOM.render(
    <MyApp />, 
    document.getElementById('Recipes') 
); 

回答

2

通過調用AddButton組件setState,你在更新這個組件,而不是父母的狀態的狀態。

要更新父級的狀態,請在父級組件中定義一個函數,並將其傳遞到AddButton的道具中。然後你可以在AddButton中調用該函數來更新GenerateRecipesFromList的狀態。

var GenerateRecipesFromList = React.createClass({ 
    // ... 
    updateRecList: function (reclist) { 
    this.setState({ reclist: reclist }); 
    }, 
    render: function(){ 
    // ... 
    return(
     <div className="centerMe"> 
     <AddButton updateRecList={ this.updateRecList } /> 
     { /* ... */ } 
     </div> 
    ); 
    }, 
}); 

var AddButton = React.createClass({ 
    // ... 
    exposeAddRecipe: function(){ 
    // ... 
    this.props.updateRecList(exposeCurrentData); 
    // ... 
    }, 
    // ... 
}); 

這是您的corrected code

+0

這是有道理的,我得到它的工作。謝謝! –

相關問題