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

reactjs-为什么表单值状态通过父道具和组件onChange更新?

楚俊杰
2023-03-14

我正在阅读Fullstack React一书,在他们关于表单验证的示例中,他们创建了自己的字段组件(第204-212页),然后将字段值存储在字段状态和父状态中,这让我感到困惑。它们的字段组件有一个属性以及一个包含的状态。父组件需要知道每个字段值,这样它就可以作为一个整体进行表单验证,并且它还有一个包含的状态。

在字段内,它们通过在输入值更改时设置字段状态,以及在值属性更改时使用getDerivedStateFromProps来处理值更改:

//(within Field)
getDerivedStateFromProps(nextProps) {
     return {value: nextProps.value}
}

onChange = evt => {
    const name = this.props.name;
    const value = evt.target.value;
    const error = this.props.validate ? this.props.validate(value) : false;

    this.setState({value, error});

    this.props.onChange({name, value, error});
};

它们还通过调用父级的onInputChange函数(作为onChange prop传递),将另一个方向上的值状态同步到父级:

//(within parent component)
onInputChange = ({name, value, error}) => {
    const fields = Object.assign({}, this.state.fields);
    const fieldErrors = Object.assign({}, this.state.fieldErrors);

    fields[name] = value;
    fieldErrors[name] = error;

    this.setState({fields, fieldErrors});
};

这本书并没有真正解释为什么他们会这样复制这个州,除了说,

字段只需要两段数据,即当前值和错误。与前面几节中表单组件的render()方法需要这些数据一样,字段组件也需要这些数据

而且还

“一个关键的区别是,我们的字段有一个父字段,有时这个父字段会想更新字段的值属性。为此,我们需要创建一个新的生命周期方法getDerivedStateFromProps(),以接受新值并更新状态。”

我只是一个初学者,但在我看来,在Field中完全抛弃value状态并将其作为道具传递进来会更有意义。当输入更改时,使用Field调用onChange方法,并在其中调用父方法的onInputChange。让onInputChange更新有关字段值的父状态,并将字段值作为道具传递给字段。现在这样做似乎有点多余,更容易出错。知道他们为什么这样做吗?

共有1个答案

隗瑞
2023-03-14

我还没有读过这本书,但在这里我将解释我为什么要写这样的代码。

拥有这两种状态的要点是使字段组件更通用。

在这种情况下,父级碰巧也将值保存在他的状态中,并且Field组件通过从getDerivedStateFromProps上接收的props更新他的状态而成为受控组件。

然而,仍然有可能使用Field组件作为不受控制的组件,那么Field的状态将是唯一的真相来源。

在这两种情况下,只有一个真相来源,它维持React的做事方式,但是字段组件可以以受控和非受控的形式使用。

 类似资料:
  • 我实际上正在学习reactjs,并且实际上正在开发一个小的TODO列表,包装在一个名为TODO的“父组件”中。 我决定将初始化移到componentDidMount内部,但这似乎是一个反模式,我需要另一个解决方案。你能帮我吗? 下面是我的实际代码:

  • 我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。 我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。 它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。 如何根据应用程序中的更新状态更新道具? 还是我处理这整件事的方式错了?

  • 以下是: code>button.jsx的来源并不重要,它有一个常规的HTML单选按钮,触发本机DOM事件 预期流量为: null 尝试:在的onChange处理程序中: 问题: 尝试:在的onChange处理程序中:

  • 我是新手,基本上我正在尝试立即更新父组件的状态及其子组件(和)道具。当前仅更新父组件的状态。我会一步一步地解释清楚。 这里我有一个父组件 这个组件有两个对象数组(和),分别作为道具发送到和组件。接收selectedPlayer和setSseltedPlayer。两个组件都有一个组件和一个选择输入。在组件中,用户将选择一个团队,他们将显示所选团队的球员,而在组件中,将选择一个球员,他们将显示选中的玩

  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 我有一个父状态,它有一个“主题”状态。 尝试将子元素的样式内联到 但问题是,当父组件状态更改时,子组件不会更新。当按下切换按钮在亮/暗之间改变状态时,我控制台记录父状态。父状态更新良好,但内联样式不变。指示子组件在加载页时被锁定为当前的任何状态。 这有什么原因吗? 我是新反应,所以很抱歉,如果这是一个愚蠢的问题! 家长 儿童