2016-10-04 7 views
1

ToDoリストを作成しようとしました。ユーザーとクリックを追加してアイテムを追加できますが、悲惨に失敗しました。コンポーネント間で値を渡します。

https://jsfiddle.net/nc84n7px/2

私は小道具を経由してTodoInputからTodo_listにデータを渡す方法を迷ってしまいました。

var TodoInput = React.createClass({ 
    render() { 
    return (
    <div> 
    <input type="text" /> 
    <button onClick={this.props.addItem}>Add</button> 
    </div> 
    ); 
    } 
}); 

var Todo_list = React.createClass({ 
    getInitialState(){ 
    return { items:[]} 
    }, 
    addItem(items){ 
    this.setState(this.state.items.push(item)) 
    }, 
    render() { 
    return (
    <div> 
    <li>{this.state.items}</li> 
    </div> 
    ); 
    } 
}); 

ReactDOM.render(
    <div> 
    <TodoInput /> 
    <Todo_list /> 
    </div>, 
    document.getElementById('container') 
); 
+0

です。 )http://redux.js.org/ –

+0

@SteevePitisなぜですか? todoリストアプリをやるためには還元が必要ですか? –

+0

あなたは無理なくすることができますが、もっと簡単です;)反応の仕組みを理解していますか?https://github.com/tastejs/todomvc/tree/gh-pages/examples/react –

答えて

0

あなたのコード内で提示されるようあなたは2つの「兄弟」のコンポーネント間の値を渡すことはできません。

ReactDOM.render(
    <div> 
    <TodoInput /> 
    <Todo_list /> 
    </div>, 
    document.getElementById('container') 
); 

しかし、あなたは、2つの方法でこれを達成することができます:

第一オプション<Todo_list />render()メソッドの<TodoInput />を含む。 https://jsfiddle.net/petebere/0wqLhaqu/

第二オプション:親コンポーネント内<TodoInput /><Todo_list />をレンダリングここでは、このに近づくことができる方法の例です。親コンポーネントは、状態と値を<TodoInput /><Todo_list />の間で維持する責任があります。

オプション1つのコードは:

var TodoInput = React.createClass({ 
    getInitialState() { 
    return { 
     userInput: '' 
    }; 
    }, 

    handleChange(event) { 
    this.setState({ 
     userInput: event.target.value 
    }); 
    }, 

    handleSubmit(event) { 
    event.preventDefault(); 
    this.props.addItem(this.state.userInput); 
    this.setState({ 
     userInput: '' 
    }); 
    }, 

    render() { 
    return (
     <form onSubmit={this.handleSubmit}> 
     <input type="text" 
        onChange={this.handleChange} 
        value={this.state.userInput} /> 
     <input type="submit" /> 
     </form> 
    ); 
    } 
}); 

var Todo_list = React.createClass({ 
    getInitialState() { 
    return { 
     items: [] 
    }; 
    }, 

    addItem(item) { 
    this.setState({ 
     items: this.state.items.concat(item) 
    }); 
    }, 

    render() { 
    const renderTodos = this.state.items.map((item, index) => { 
     return <li key={index}>{item}</li>; 
    }); 

    return (
     <div> 
     <TodoInput addItem={this.addItem} /> 
     {renderTodos} 
     </div> 
    ); 
    } 
}); 

ReactDOM.render(
    <Todo_list />, 
    document.getElementById('container') 
); 
+0

JSFiddleへのリンクを更新しました。また、送信ボタンをクリックしたときに入力フィールドがクリアされる機能を追加しました。このデモでは、単純なReact JS(無償)を使用しています。コード内で何が起こっているのか理解するのに役立つ必要がありますか? –

+0

私は入力を再利用したい、私はリスト内のinputComponentを入れて簡単ですが、私の質問は、値btw複数のコンポーネントを渡す方法です –

+0

あなたは、3つの入力フィールドと唯一の1つのボタンを送信したいと思いますか?ユーザーがサブミットをクリックすると、入力フィールドのすべてのデータが親コンポーネントに渡されますか? –

0

おそらくこれを行う方法が清掃されていますが、ここでは、この

var Todo_list = React.createClass({ 

    render() { 
    return (
    <div> 
     {this.props.items.map (i => <div>{i}</div>)} 
    </div> 
    ); 
    } 
}); 

var TodoInput = React.createClass({ 
    getInitialState(){ 
    return { 
     inputValue: "", 
     items: [] 
    } 
    }, 

    addItem: function(){ 
    this.setState({ 
     items: this.state.items.concat([this.state.inputValue]) 
    }) 

    }, 

    onChange: function(event){ 
    this.setState({inputValue: event.target.value}) 
    }, 

    render() { 
    return (
     <div> 
      <input type="text" onChange={this.onChange}/> 
      <button onClick={this.addItem}>Add</button> 
      <Todo_list items={this.state.items} /> 
     </div> 
    ); 
    } 
}); 



ReactDOM.render(<TodoInput />, document.getElementById('container') 
); 

ような何かを行うことができますReduxのを見てみましょうjsfiddle

+0

Todo_listコンポーネントをTodoInput内に配置する必要がありますか? –

+0

、concatは?私は連結部分を取得していない、私は項目にまっすぐ新しい値を割り当てることができないのですか? –

+0

jsfiddleを更新しました。あなたは連動せずにそれを行うことができます。これがあなたが望むものでなければ、reduxを使うよりも必要です。 – Boky

関連する問題