2017-01-30 73 views
0

下面的代碼按預期工作,除非單擊可點擊列表項目。所以,當我們添加項目時,映射的id是很好的,當單擊<li>時是undefined。 請問,這個非常基礎的代碼有什麼問題?Redux:無法讀取未定義的屬性「ID」

let nextId = 0; 
export default React.createClass({ 
    addItem(){ 
     let text = ReactDOM.findDOMNode(this.refs.doos).value; 
     store.dispatch({ 
      type: 'ADD_TODO', 
      text, 
      id: nextId++ 
     }) 
     ReactDOM.findDOMNode(this.refs.doos).value = ''; 
    }, 
    render(){ 
     return <div> 
      <p>Toddos!</p> 
      <input ref="doos" type="text"/> 
      <button onClick={this.addItem}>Add Item</button> 
      <ul> 
      {this.props.todos.map(todo => 
       <li key={todo.id} // Can not read property when clicked! 
       onClick={() => { 
        store.dispatch({ 
         type: 'TOGGLE_TODO', 
         id: todo.id 
        }); 
       }} 
       style={{ 
         textDecoration: todo.completed ? 
         'line-through' : 'none', 
         cursor: 'pointer' 
        }}> 
         {todo.text} 
       </li> 
      )} 
      </ul> 
     </div> 
    } 
}); 

回答

0

它可能與您的減速器不返回狀態有關。在映射到所有待辦事項的Reducer中,檢查它是否返回每個待辦事項的狀態。

什麼可能是一個可能的問題是,您在您的todosReducer的map函數中使用大括號。但是,在ES6中使用大括號表示您應該明確地返回值。省略大括號會自動返回值。

在你todosReducer:

case 'TOGGLE_TODO': 

    return state.map(todo => { 
    todoReducer(todo, action) // You should use return here 
    }); 

或者:

case 'TOGGLE_TODO': 

    return state.map(todo => 
    todoReducer(todo, action) // Omitted curly brackets 
); 
+0

'情況 'TOGGLE_TODO': 回報state.map(T =>待辦事項(T,動作));' 代碼如下像這樣...... –

+0

你能在你的todos減速器中註銷你的狀態並告訴我說了什麼嗎? –

+0

請看看這個工作示例http://redux.skepton.ru/和Gitub回購 –