2017-09-04 10 views
0

この質問には恥ずかしがりやがっかりするが、なぜ私はli要素にキーをバインドしようとすると、IcantはDOMをレンダリングした後にそれを見つけるのか分からない。コンソールで
React key cant要素に追加

<ul><br /> 
    <li>I dont know why</li><br /> 
    <li>cant find the key</li><br /> 
</ul><br /> 

:のように見えます 。
クリックイベントでe.target.getAttribute( 'key')を使用して '未定義'になりました。
ここに私のコード(シンプルtodolistの):

class Write extends React.Component { 
 
    constructor(props){ 
 
     super(props); 
 
     this.handle=this.handle.bind(this); 
 
    } 
 
    handle(){ 
 
     const text=document.getElementById('todoIn').value; 
 
     this.props.onWriteDown(text); 
 
    } 
 
    render(){ 
 
    return (
 
    <div> 
 
    <input type="text" id="todoIn" /> 
 
    <button onClick={this.handle}>confirm</button> 
 
    </div> 
 
    ); 
 
    } 
 
    } 
 

 
class Todolist extends React.Component { 
 
    constructor (props) { 
 
     super(props); 
 
     this.n=0; 
 
     this.state={list:[]}; 
 
     this.todolist=[]; 
 
     this.handle=this.handle.bind(this); 
 
     this.handle_del=this.handle_del.bind(this); 
 
    } 
 
    handle (m) { 
 
     this.todolist.push({thing:m,vid:this.n++}); 
 
     this.setState({list:this.todolist}); 
 
    } 
 
    handle_del (e) { 
 
     var d = this.todolist.forEach((v,i)=>{ 
 
     if(v.vid==e.target.getAttribute('key')){ 
 
      return i; 
 
     } 
 
     }); 
 
     this.todolist.splice(d,1); 
 
     this.setState({list:this.todolist}); 
 
    } 
 
    render(){ 
 
     var that = this; 
 
     var todo=[]; 
 
     //here I create React Element for each todo and bind some attribute BUT ONLY CLICK EVENT is ACCESSIBLE.I JUST WONDER... 
 
     this.state.list.forEach(function(v,i,a){ 
 
     let temp=<li key={v.vid.toString()} onClick={that.handle_del} >{v.thing}</li>; 
 
     todo.push(temp); 
 
     }); 
 
     return(
 
     <div> 
 
     <Write onWriteDown={this.handle} /> 
 
     <ul> 
 
     {todo} 
 
     </ul> 
 
     </div> 
 
    ); 
 
    } 
 
    } 
 

 
    ReactDOM.render(
 
     <Todolist />, 
 
    document.getElementById('root') 
 
    );
<div id="root"></div>

答えて

2

keyが内部でそのように使用されるコンポーネントは、追加、変更または削除されたかを知っている反応します。 また、キーが通過しません。

詳細については、ReactJSのドキュメントを参照してください。

https://facebook.github.io/react/docs/lists-and-keys.html#keys

+0

^うんを。あなたは、とにかく要素のキーで物事をしようとしてはいけません。リスト要素の一意の識別子が必要な場合は、自分で追加してください(ちょうど 'key'の名前を付けないでください) – Jayce444

+0

私はこの部分を学び、前の鍵の意味を誤解していることが分かりました。ありがとう。レンダリングされたDOMには、文字列として設定されていても{}に置かれていても、自己定義属性のどれも見ることができません。それらはすべてReactによって破棄されましたか?seltを設定する必要があるか、定義する属性。 –

+0

あなたが話している属性によって異なります。通常、ReactJSコンポーネントは、自己定義属性を必要とせずにほとんどのコモンシナリオを処理できます。 – mersocarlin

0

としては、あなたは、それが通過していないkey属性にアクセスしようとすべきではない、とだけオブジェクトへの内部参照として使用されているHemersonの答えで述べています。

代わりに、あなたはほど、あなたのコードを書くことができます。


let id = v.vid.toString(); 
let temp=<li key={id} onClick={() => that.handle_del(id)}>{v.thing}</li>; 

handle_del (id) { 
    var d = this.todolist.forEach((v,i)=>{ 
    if(v.vid==id){ 
     return i; 
    } 
    }); 
    this.todolist.splice(d,1); 
    this.setState({list:this.todolist}); 
} 
+0

ありがとうございました。私は助けてくれます。今はローカルで試しています。コードがforEach()に移動したとき、dは定義されておらず、私のコードで間違いを犯したことに気付きました。 をd = 0とする。 this.todolist.forEach((v、i)=> { if(v.vid == id){ d = i; } }); –

関連する問題