通过上下文共享多个值或一个对象
Sharing multiple values or an object through contexts
我正在尝试与显示格式化内容“预览”的组件共享用户输入的表单数据。类似于 Whosebug 在此文本输入框下方显示降价预览,但在我的例子中,数据来自多个文本字段。
为了同步数据,我使用了上下文(根据我的研究,这似乎是正确的方法)但我的问题是我不确定如何共享多个值。
我认为每个表单字段都可以将数据作为对象的一部分发送,对于 receiving 组件,可能如下所示:
{
firstname: (input from first name field component)
address: (input from address field component)
other: (input from other field component)
}
接收组件然后可以只读取此数据 {preview.firstname}
。
在用户更新字段后设置值时,我使用展开运算符将现有数据合并到一个新对象中。
但是,我觉得这是一种有问题的方法。 linter 抱怨 preview
对象不在 useEffect
依赖项中,但如果我把它放在那里,它会创建一个无限渲染循环。
const [field] = useField('firstname');
const { preview, setPreview } = useContext(MyContext);
useEffect(() => {
setPreview({
...preview,
name: field.value
});
}, [field.value, setPreview]);
我想我可以为每个表单字段创建不同的上下文,但这会变得冗长,而且我认为这也不是正确的解决方案。
我仍在学习 React/Contexts,所以我不确定“正确”的解决方案是什么。我是为每个要共享的“状态”值使用一个上下文,还是可以安全地共享一个“状态”对象?
您可以使用功能设置状态:
setPreview(ps=>({
...ps,
name: field.value
}));
不再需要 preview
作为依赖。
我正在尝试与显示格式化内容“预览”的组件共享用户输入的表单数据。类似于 Whosebug 在此文本输入框下方显示降价预览,但在我的例子中,数据来自多个文本字段。
为了同步数据,我使用了上下文(根据我的研究,这似乎是正确的方法)但我的问题是我不确定如何共享多个值。
我认为每个表单字段都可以将数据作为对象的一部分发送,对于 receiving 组件,可能如下所示:
{
firstname: (input from first name field component)
address: (input from address field component)
other: (input from other field component)
}
接收组件然后可以只读取此数据 {preview.firstname}
。
在用户更新字段后设置值时,我使用展开运算符将现有数据合并到一个新对象中。
但是,我觉得这是一种有问题的方法。 linter 抱怨 preview
对象不在 useEffect
依赖项中,但如果我把它放在那里,它会创建一个无限渲染循环。
const [field] = useField('firstname');
const { preview, setPreview } = useContext(MyContext);
useEffect(() => {
setPreview({
...preview,
name: field.value
});
}, [field.value, setPreview]);
我想我可以为每个表单字段创建不同的上下文,但这会变得冗长,而且我认为这也不是正确的解决方案。
我仍在学习 React/Contexts,所以我不确定“正确”的解决方案是什么。我是为每个要共享的“状态”值使用一个上下文,还是可以安全地共享一个“状态”对象?
您可以使用功能设置状态:
setPreview(ps=>({
...ps,
name: field.value
}));
不再需要 preview
作为依赖。