2016-10-04 5 views
1

Попытка сделать список задач, который позволяет пользователю и добавлять к нему добавление, но неудачно провалился.Значение передачи между компонентами

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

Посмотрите Redux;) http://redux.js.org/ –

+0

@SteevePitis почему? Вам нужно уменьшить, чтобы сделать приложение списка задач? –

+0

Вы можете обойтись без, но это проще;) Кстати, у вас есть это, чтобы понять, как реагируют работы https://github.com/tastejs/todomvc/tree/gh-pages/examples/react –

ответ

0

Ваши не может передать значение между компонентами два «родным братом», как представлены в вашем коде:

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

Но вы можете добиться этого два способов:

первого Вариант: в том числе <TodoInput /> в методе render()<Todo_list />. Вот пример того, как можно подойти к этому: 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') 
); 

Вот это jsfiddle

+0

Должен ли я помещать компонент Todo_list в TodoInput? –

+0

и конкат для? Я не получаю часть concat, не могу ли я присвоить новое значение прямо элементам? –

+0

Я обновил jsfiddle. Вы можете сделать это без concat. Если это не то, что вы хотите, вам нужно, чем использовать redux. – Boky

Смежные вопросы