【发布时间】:2021-03-16 21:50:12
【问题描述】:
过去几天我一直在尝试解决一个问题:
我正在为表单字段使用上下文提供程序,并且无论出于何种原因,当我使用备忘录时,字段都会相互覆盖。
提供者:
export const Context = React.createContext();
function Form_Provider({ values, onChange, children }) {
return (
<Context.Provider value={{ values, onChange }}>
{children}
</Context.Provider>
)
});
export default Form_Provider
字段:
function Field({ label, name }) {
const { values, onChange } = useContext(Context);
return (
<Memorable
label={label}
onChange={({ target: t }) => onChange({ name, value: t.value })}
value={values[name]}
/>
);
}
const Memorable = React.memo(props => {
return (
<Form.Item label={props.label}>
<Input
value={props.value}
onChange={props.onChange}
/>
</Form.Item>
</>
)
}, ({ value: newValue}, { value: oldValue }) => newValue == oldValue)
表格
const [formValues, setFormValues] = useState({ field1: 'Foo', field2: 'Bar' });
<Form.Provider
values={formValues}
onChange={({ name, value }) => setFormValues({...formValues, [name]: value }))
>
<Form.Field name='field1' label="Field 1" />
<Form.Field name='field2' label="Field 2" />
</Form.Provider>
(尽量简化)
在我的实际代码中,我添加了一个 json 打印美化器来跟踪每个字段的状态,并且当我只编辑一个字段时,它会一直运行到每个字段。但是,一旦我开始编辑另一个字段,我编辑的第一个字段就会恢复到其原始状态和/或过去状态之间的其他一些奇怪的状态。
如果我不使用备忘录,它可以工作,但这不是解决方案,因为我将处理很多字段,这会导致大量重新渲染。
有人知道这里发生了什么吗?
加法:
我已经尝试过为此使用内部 reducer 并传递一个 dispatch 函数。只要我不尝试在提供者之外管理状态,一切正常。
【问题讨论】:
标签: javascript reactjs react-state-management use-context