2017-02-16 24 views
1

我想我的變異與組件在此代碼繼電器,但我不知道爲什麼我不能把onClick事件上我無法在我的反應組件中傳遞一個onClick事件?

handleSubmit = (e) => { 
    e.preventDefault(); 
    Relay.Store.commitUpdate(
     new createTodoMutation({ 
     text: this.refs.textForNewTodo.value, 
     store: this.props.store 
     }) 
    ); 
    this.refs.textForNewTodo.value=""; 
    } 
    handleOnClick = (id) => { 
    id.preventDefault(); 
    Relay.Store.commitUpdate(
     new toggleTodoStatus({ 
     id: id, 
     store: this.props.store 
     }) 
    ); 
    } 
    render() { 
    let todolist = this.props.store.todoConnection.edges.map((edge) => { 
     return (
     <li key={edge.node.id} onClick={this.handleOnClick(edge.node.id)}> 
      <p>{edge.node.text}</p> 
     </li> 
    ); 
    }); 
    return (
     <div> 
     <h3>Todos</h3> 
     <form onSubmit={this.handleSubmit} > 
      <input type="text" placeholder="Todo text" ref="textForNewTodo" /> 
      <button type="submit">Add</button> 
     </form> 
     Showing: &nbsp; 
     <select onChange={this.setLimit} defaultValue={this.props.relay.variables.limit}> 
      <option value="5">5</option> 
      <option value="10">10</option> 
     </select> 
     <ul> 
      {todolist} 
     </ul> 
     </div> 
    ); 

handleSubmit是工作,但handleOnClick上列出了名單是不是和我我有這個錯誤「Uncaught TypeError:無法讀取未定義的屬性」ID「,但我通過onClick = {this.handleOnClick(edge.node.id)}調用edge.node.id。我看不出這個代碼有什麼問題。幫幫我?

回答

1

這是傳遞onClick事件的錯誤方法。當您執行onClick={this.handleOnClick(edge.node.id)}時,該事件將僅在渲染過程中被調用一次。

嘗試onClick={() => this.handleOnClick(edge.node.id)}

+0

我仍然有Uncaught TypeError:無法讀取未定義錯誤的屬性'id':( –

+0

@iamnewbie從'onClick'這行錯誤嗎?這意味着您的'edge'沒有一個名爲'node'的屬性。嘗試將其註銷? –

1

在你的情況,你在呼喚,而不是將它傳遞給的onClick所以它可以調用它,每當你點擊該元素的handleOnClick後立即每個渲染。

,因爲你需要一個參數傳遞給你的函數你不能簡單的功能傳遞到的onClick

<... onClick={this.handleOnClick} /> 

因此,要解決這個問題,你可以創建一個箭頭功能和通過箭頭功能的onClick

<... onClick={() => this.handleOnClick(edge.node.id)} /> 

你也不需要id.preventDefault();不再有

相關問題