2016-11-07 4 views
1

私はできるだけ簡潔にこれを保つために一生懸命努力します。どのようにして、onループをReactのforループの中に組み込むのですか?

jsonのデータ状態(ライブラリ)からアイテムを削除したいと思っていますが、現時点では、「削除」ボタンがクリックされたときに簡単なconsole.logを起動できません。

すべてのものが負荷で完全に表示されます。 "Delete"ボタンのonClick={this.deleteClickHandler.bind(this)}イベントに書き込むとエラーが発生します。

親コンポーネント:

constructor(){ 

    super(); 
    this.state = { 
    test: "SiteFront State", 
    library : { 
     "copy" : { 
     "name" : "Copy", 
     "input" : "CMD + C", 
     "os" : "All" 
     }, 
     "paste" : { 
     "name" : "paste", 
     "input" : "CMD + V", 
     "os" : "All" 
     } 
    }, 
    libraryKeys:null 
    }; 
}; 

子コンポーネント:

componentDidMount(){ 
    this.SetUpItemsHandler(); 
}; 

componentWillReceiveProps(){ 
    this.SetUpItemsHandler(); 
} 

deleteClickHandler(e){ 
    console.log("delete Button Clicked"); 
}; 

SetUpItemsHandler(){ 
    var libraryKeys = Object.keys(this.props.library); 
    document.getElementById("libraryInner").innerHTML = ""; 
    for(var i = 0;i < libraryKeys.length;i++){ 
    document.getElementById("libraryInner").innerHTML += "<li key={i}>"+ 
     "<h2>Name: "+ this.props.library[libraryKeys[i]].name +"</h1>"+ 
     "<button onClick={this.deleteClickHandler.bind(this ,i)}>Delete</button>" 
    "</li>"; 
}; 
}; 

The onClick={this.deleteClickHandler.bind(this)}イベントは、コンソールにエラーを発生させます:

(index):16 Uncaught TypeError: Cannot read property 'bind' of undefined(…)

私は正しくキー値を含むだろうか?私は何が欠けていますか? 私は配列で.map関数を使用しましたが、jsonキーオブジェクトでそれを行う理想的な方法がわからないので、代わりにforループを使用しようとしました。これは間違っていますか?

ご迷惑をおかけして申し訳ありません。 は、 萌え

EDITありがとう: を私は含めることを試みたが、それは取っていない私のレンダリング機能の中では、何もコンソールにエラーなしで表示されなかっ:

render(){ 

    var listItems = function(){ 
     var libraryKeys = Object.keys(this.props.library); 
     document.getElementById("libraryInner").innerHTML = ""; 
     for(var i = 0;i < libraryKeys.length;i++){ 
     document.getElementById("libraryInner").innerHTML += "<li key={i}>"+ 
     "<h2>Name: "+ this.props.library[libraryKeys[i]].name +"</h1>"+ 
     "<button onClick={this.deleteClickHandler.bind(this)}>Delete</button>"+ 
     "</li>" 
     }; 
    }; 

    return(
     <div> 
     Library Here<br/><br/> 
     <div id="library"> 
      <ul id="libraryInner"> 
      {listItems} 
      </ul> 
     </div> 

     <AddItemForm 
     inputUpdateHandler={this.props.inputUpdateHandler.bind(this)} 
     nameInputUpdateHandler={this.props.nameInputUpdateHandler.bind(this)} 
     inputInputUpdateHandler={this.props.inputInputUpdateHandler.bind(this)} 
     osInputUpdateHandler={this.props.osInputUpdateHandler.bind(this)} 
     addItemHandler={this.props.addItemHandler.bind(this)} 
     /> 

     </div> 
    ); 
    } 
+0

ダイレクトHTMLを操作するためにエラーが発生します。bindを使用すると、bindを使用すると、htmlがreact HTML要素を使用して生成される必要があります。なぜレンダリングメソッドを使ってhtmlをレンダリングしなかったのですか? – abhirathore2006

+0

私は、私がレンダリング機能の中に関数を含めたアップデートを使って投稿を編集しました。それはかかりませんでした。コンソールエラーなしでは何も表示されません。 –

+0

私の答えを確認 – abhirathore2006

答えて

0

あなたにはまた、あなたのSetUpItemsHandler()をバインドする必要がありますあなたの編集あなたは関数listItemsを作成したことがわかりますが、それを関数として呼び出すことも、関数から何も返さないこともあります。マップの使用

SetUpItemsHandler =() =>{ 

    Object.keys(this.props.library).map(function(keyValue, index){ 
     return (
     <li key={index}> 
      <h2>Name: {this.props.library[keyValue].name}</h2> 
      <button onClick={this.deleteClickHandler.bind(this, i)}>Delete</button> 
     </li> 
    ) 
    }.bind(this)) 
}; 

あなたの

render(){ 

    return(
     <div> 
     Library Here<br/><br/> 
     <div id="library"> 
      <ul id="libraryInner"> 
      {this.SetUpItemsHandler()} 
      </ul> 
     </div> 

     <AddItemForm 
     inputUpdateHandler={this.props.inputUpdateHandler.bind(this)} 
     nameInputUpdateHandler={this.props.nameInputUpdateHandler.bind(this)} 
     inputInputUpdateHandler={this.props.inputInputUpdateHandler.bind(this)} 
     osInputUpdateHandler={this.props.osInputUpdateHandler.bind(this)} 
     addItemHandler={this.props.addItemHandler.bind(this)} 
     /> 

     </div> 
    ); 
    } 

P.S.としてレンダリングするには、この関数を呼び出すことができますを作る

SetUpItemsHandler =() =>{ 
     var libraryKeys = Object.keys(this.props.library); 
     document.getElementById("libraryInner").innerHTML = ""; 
     for(var i = 0;i < libraryKeys.length;i++){ 
      document.getElementById("libraryInner").innerHTML += "<li key={i}>"+ 
     "<h2>Name: "+ this.props.library[libraryKeys[i]].name +"</h1>"+ 
     "<button onClick={this.deleteClickHandler.bind(this ,i)}>Delete</button>" 
    "</li>"; 
    } 
    }; 

上記のコードはテストされていないので、確実に私にはthis.props.libraryのオブジェクト構造を提供する必要があり、上記のコードはforループの実装方法に基づいています。

+0

私は自分のビルドにあなたのメソッドを含めることを試みた。残念ながら運はありません。 キャッチされないエラー:モジュールが見つかりません "./Library.js"(...) –

+0

はファイル名であるLibrary.jsです。 yesの場合、このエラーはファイルの構文エラーのために発生し、そうでない場合は発生しません。Webpackを使用している場合は、構文エラーが表示されている正確な場所を表示してください。 –

+0

更新されたコードを試してみてください –

0

これでレンダリングメソッドを置き換えます。

render(){ 
     return(
      <div> 
      Library Here<br/><br/> 
      <div id="library"> 
       <ul id="libraryInner"> 
       {(()=>{ 
       let listItems = []; 
       for(var i = 0;i < Object.keys(this.props.library);i++){ 
        listItems.push(<li key={i}> 
             <h2>Name:{this.props.library[libraryKeys[i]].name} </h2> 
             <button onClick={this.deleteClickHandler.bind(this)}>Delete</button> 
            </li>); 
        } 
        return listItems;  
       })()} 
       </ul> 
      </div> 

      <AddItemForm 
      inputUpdateHandler={this.props.inputUpdateHandler.bind(this)} 
      nameInputUpdateHandler={this.props.nameInputUpdateHandler.bind(this)} 
      inputInputUpdateHandler={this.props.inputInputUpdateHandler.bind(this)} 
      osInputUpdateHandler={this.props.osInputUpdateHandler.bind(this)} 
      addItemHandler={this.props.addItemHandler.bind(this)} 
      /> 

      </div> 
     ); 
     } 
関連する問題