我正在阅读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更新有关字段值的父状态,并将字段值作为道具传递给字段。现在这样做似乎有点多余,更容易出错。知道他们为什么这样做吗?
我还没有读过这本书,但在这里我将解释我为什么要写这样的代码。
拥有这两种状态的要点是使字段
组件更通用。
在这种情况下,父级碰巧也将值保存在他的状态中,并且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的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?
我有一个父状态,它有一个“主题”状态。 尝试将子元素的样式内联到 但问题是,当父组件状态更改时,子组件不会更新。当按下切换按钮在亮/暗之间改变状态时,我控制台记录父状态。父状态更新良好,但内联样式不变。指示子组件在加载页时被锁定为当前的任何状态。 这有什么原因吗? 我是新反应,所以很抱歉,如果这是一个愚蠢的问题! 家长 儿童