1. ホーム
  2. reactjs

[解決済み] ReactJS: 子コンポーネント内の親コンポーネントへのsetState

2022-11-12 14:44:16

質問

子コンポーネントから親コンポーネントに setState を行うための推奨されるパターンは何でしょうか。

var Todos = React.createClass({
  getInitialState: function() {
    return {
      todos: [
        "I am done",
        "I am not done"
      ]
    }
  },

  render: function() {
    var todos = this.state.todos.map(function(todo) {
      return <div>{todo}</div>;
    });

    return <div>
      <h3>Todo(s)</h3>
      {todos}
      <TodoForm />
    </div>;
  }
});

var TodoForm = React.createClass({
  getInitialState: function() {
    return {
      todoInput: ""
    }
  },

  handleOnChange: function(e) {
    e.preventDefault();
    this.setState({todoInput: e.target.value});
  },

  handleClick: function(e) {
    e.preventDefault();
    //add the new todo item
  },

  render: function() {
    return <div>
      <br />
      <input type="text" value={this.state.todoInput} onChange={this.handleOnChange} />
      <button onClick={this.handleClick}>Add Todo</button>
    </div>;
  }
});

React.render(<Todos />, document.body)

親の状態に保持されているTodoアイテムの配列があります。 親の状態にアクセスして新しいTodo項目を追加したい。 TodoForm 's handleClick コンポーネントを使用します。 私のアイデアは、親にsetStateを行い、新しく追加されたTodo項目をレンダリングすることです。

どのように解決するのですか?

親プロセスで、以下のような関数を作成します。 addTodoItem のような関数を作成して、必要な setState を実行し、その関数を子コンポーネントに props として渡します。

var Todos = React.createClass({

  ...

  addTodoItem: function(todoItem) {
    this.setState(({ todos }) => ({ todos: { ...todos, todoItem } }));
  },

  render: function() {

    ...

    return <div>
      <h3>Todo(s)</h3>
      {todos}
      <TodoForm addTodoItem={this.addTodoItem} />
    </div>
  }
});

var TodoForm = React.createClass({
  handleClick: function(e) {
    e.preventDefault();
    this.props.addTodoItem(this.state.todoInput);
    this.setState({todoInput: ""});
  },

  ...

});

を呼び出すことができます。 addTodoItem を呼び出すことができます。これにより、親に setState が実行され、新しく追加された ToDo アイテムがレンダリングされます。アイデアをつかんでいただければ幸いです。

ここで操作してください。