当前位置: 首页 > 知识库问答 >
问题:

ReactJS:setState位于子组件内的父组件上

岳浩
2023-03-14

从子组件对父组件执行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项数组,它在父级状态下维护。我想从TodoFormhandleClick组件访问父级状态并添加新的todo项。我的想法是在父对象上执行setState,这将呈现新添加的todo项。

共有3个答案

郎泰平
2023-03-14

对于那些使用React HookuseState维护状态的人,我调整了上面的建议,以制作下面的演示滑块应用程序。在演示应用程序中,子滑块组件维护父滑块的状态。

演示还使用了useffecthook。(不太重要的是,useRefhook)

import React, { useState, useEffect, useCallback, useRef } from "react";

//the parent react component
function Parent() {

  // the parentState will be set by its child slider component
  const [parentState, setParentState] = useState(0);

  // make wrapper function to give child
  const wrapperSetParentState = useCallback(val => {
    setParentState(val);
  }, [setParentState]);

  return (
    <div style={{ margin: 30 }}>
      <Child
        parentState={parentState}
        parentStateSetter={wrapperSetParentState}
      />
      <div>Parent State: {parentState}</div>
    </div>
  );
};

//the child react component
function Child({parentStateSetter}) {
  const childRef = useRef();
  const [childState, setChildState] = useState(0);

  useEffect(() => {
    parentStateSetter(childState);
  }, [parentStateSetter, childState]);

  const onSliderChangeHandler = e => {
  //pass slider's event value to child's state
    setChildState(e.target.value);
  };

  return (
    <div>
      <input
        type="range"
        min="1"
        max="255"
        value={childState}
        ref={childRef}
        onChange={onSliderChangeHandler}
      ></input>
    </div>
  );
};

export default Parent;
百里秋月
2023-03-14

这些基本上都是正确的,我只是想我要指出新的(ish)官方反应留档,基本上建议:-

对于React应用程序中更改的任何数据,都应该有一个“真实来源”。通常,状态首先添加到渲染所需的组件中。然后,如果其他组件也需要它,您可以将它提升到它们最近的共同祖先。您应该依赖自顶向下的数据流,而不是尝试在不同组件之间同步状态。

请参见https://reactjs.org/docs/lifting-state-up.html.该页面还通过一个示例进行工作。

郝原
2023-03-14

在父组件中,您可以创建一个函数,如addTodoItem,它将执行所需的setState,然后将该函数作为道具传递给子组件。

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: ""});
  },

  ...

});

您可以在TodoForm的handleClick中调用addTodoItem。这将在父级上执行设置状态,以呈现新添加的todo项。希望你能明白。

在这里拉小提琴。

 类似资料:
  • 我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在中不建议使用这种方法,我必须执行emit,这非常糟糕。所以我的代码是这个。 正如您所看到的,在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。 什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。

  • 我有一个父组件从API获取一些数据,并将数据存储在状态中,然后将其传递给子组件,如下所示: 在我的子组件中,我有两个问题,一个是:我想在componentDidMount中接收一个道具(ratingsAverage),但在render()函数中接收ratingsAverage时未定义。另一个是:在我的render()函数中,我只能接收非对象或数组的数据,当我接收到一个对象并希望访问该对象的属性时,

  • 问题内容: 在子组件的父项上执行setState的推荐模式是什么? 我有一个待办事项数组,保持在父母的状态。我想访问父项的状态,并从的组件中添加新的待办事项。我的想法是在父对象上执行setState,这将呈现新添加的待办事项。 问题答案: 在您的父级中,您可以创建一个类似的函数,该函数将执行所需的setState,然后将该函数作为prop传递给子组件。 您可以在TodoForm的handleCli

  • 我有两个组件:父组件,我想改变子组件的状态: 和子组件: 我需要从父组件更改子组件的打开状态,或者当单击父组件中的按钮时,从父组件调用子组件的toggleMenu()?

  • 假设我的父组件有两个子组件: 我从Child2获得一个输入,并将其传递给父组件(到目前为止,我知道该怎么做)。但是,我需要将该输入传递给Child1,以更新它的状态。 我怎么能那么做?

  • 父组件中如何处理子组件内点击事件