如何从 parent 组件更改 child 的状态

How can I change a child's state from the parent component

所以我有一个 React 网页。

parent 组件包含所有 children 组件(drop-downs、单选按钮、表格等)一旦我使用按钮提交所有表单,我想要所有组件状态为 return 为空。

如果没有 Redux,这可能吗?我知道此时我绝对应该使用 Redux,并且我将在接下来的几天内开始学习它,但是在开始之前我想先想一想如果我想做的是 possible/impossible 没有反应。

只为安心,充分了解。

您可以将所有状态值保留在父组件中,并将它们作为带有更改处理程序的道具传递给您的展示组件。然后你可以在提交表单时重置整个状态。这可能是最 "react-y" 的方法。

如果你不想这样做,你可以将一种 "reset" 属性传递给你的每个子组件,当这个属性变为真时,重置状态,然后重置父组件"reset" 支持返回 false。但是,我个人认为这不是一个很好的方法,强烈推荐第一个选项。

编辑:你绝对不需要引入 redux 来完成你想要做的事情

几个简单的选项:

1) 重新加载整个页面:

  location.reload();

2) 重新挂载App组件:

 reactDOM.unmount(document.body);
 reactDOM.render(<App />, document.body);

Parent 组件可以有一个由表单提交按钮触发的 reset 状态,并将其作为道具传递给它的 children,在您的情况下是所有表单元素(drop-downs、单选按钮、表格等)。

然后 children 可以在其 life-cycle 钩子(componentWillReceiveProps 或 getDerivedStateFromProps)中对这个 reset 道具做出反应。

正如我所赞成的那样,我推荐@Nick Swope 的逻辑。不过,我想举两个例子。我不确定这是否适合您的情况,但这里是示例。

class App extends React.Component {
  state = {
    name: "",
    select: "",
  }

  defaultState = {
    name: "",
    select: "",
  };


  handleChane = e => this.setState( {
    [ e.target.name ]: e.target.value,
  } );

  handleSubmit = ( e ) => {
    e.preventDefault();
    alert( JSON.stringify( this.state ) );
    this.setState( this.defaultState );
  }

  render() {
    console.log( this.state );
    return (
      <form onSubmit={this.handleSubmit} >
        <Input onChange={this.handleChane} />
        <Select onChange={this.handleChane} />
        <button>Send</button>
      </form>
    );
  }
}

const Input = props => (
  <div>
    <input onChange={props.onChange} name="name" />
  </div>
);

const Select = props => (
  <div>
    <select onChange={props.onChange} name="select">
      <option>Choose one</option>
      <option>Foo</option>
      <option>Bar</option>
      <option>Baz</option>
    </select>
  </div>
);

ReactDOM.render(
  <App />,
  document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

在此示例中,您保持默认状态,并在提交表单后重置状态。如您所见,表单值仍然存在。现在,这是第二个选项:

class App extends React.Component {
  state = {
    name: "",
    select: "",
  }

  defaultState = {
    name: "",
    select: "",
  };

  formRef = React.createRef();

  handleChane = e => this.setState( {
    [ e.target.name ]: e.target.value,
  } );

  handleSubmit = ( e ) => {
    e.preventDefault();
    alert( JSON.stringify( this.state ) );
    this.setState( this.defaultState );
    this.formRef.current.reset();
  }

  render() {
    console.log( this.state );
    return (
      <form ref={this.formRef} onSubmit={this.handleSubmit} >
        <Input onChange={this.handleChane} />
        <Select onChange={this.handleChane} />
        <button>Send</button>
      </form>
    );
  }
}

const Input = props => (
  <div>
    <input onChange={props.onChange} name="name" />
  </div>
);

const Select = props => (
  <div>
    <select onChange={props.onChange} name="select">
      <option>Choose one</option>
      <option>Foo</option>
      <option>Bar</option>
      <option>Baz</option>
    </select>
  </div>
);

在这里,您可以休息您的状态并使用 ref 清除您的表单。我不能把它放到代码片段中,因为这里的 React 版本有点旧。