道具更改不触发 useEffect

Len*_*ood 6 reactjs react-props react-jsonschema-forms use-effect

我有一个带有 useEffect 的 React 组件,当 props 更改时,该组件不会被触发。我希望这个组件根据 prop 更新它所显示的内容。然而,当 prop 改变时,什么也没有发生。

为了调试,我添加了一个可以手动更新值的按钮,效果很好。我只是无法让 useEffect 终生运行。

const ReadOnly = (props: WidgetProps) => {
    const [value, setValue] = React.useState('No Value');
    const { formContext } = props;

    const firstName = () => formContext.queryData[0]?.basicInformation?.firstName ?? 'No value';

    // This only runs once when the component is first rendered never fired when formContext updates.
    React.useEffect(() => {
        setValue(firstName());
    }, [formContext]);

    // This correctly updates the value
    const onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
        e.preventDefault();
        setValue(firstName());
    };

    return (
        <>
            <p>{value}</p>
            <Button onClick={onClick}>Update Value</Button>
        </>
    );
};

export default ReadOnly;
Run Code Online (Sandbox Code Playgroud)

我尝试将 useEffect 函数监视的值从 更改formContextformContext.queryData[0].basicInformation.firstName无效。我也尝试过使用props。我什至尝试完全删除手表阵列,希望它只是垃圾邮件更新,但什么也没有。

关于如何实现这一目标有什么建议吗?我知道该值正在传递到组件,因为当我按下按钮时它就会起作用。当我在网页上的 React 检查器中查看它时,我可以清楚地看到该值就在那里。干杯。

编辑:该组件被用作react-jsonschema-form的小部件。基本上发生的情况是每次formData更新时我都会将其传递回formContext. formContext这是我可以将其他数据获取到该小部件的唯一方法。下面是我正在做的事情的精简版本。

const [formDataAndIncludings, setFormDataAndIncludings] = React.useState<any>(null);

ClientRect.useEffect(() => {
    ...
    // Initial loading of formDataAndIncludings
    ...
}, [])

const onChange = (e: IChangeEvent<any>) => {
    const newFormDataAndIncludings = { ...formDataAndIncludings };
    newFormDataAndIncludings.queryData[0] = e.formData;
    setFormDataAndIncludings(newFormDataAndIncludings);
};

return (
    <Form
        ...
        onChange={onChange}
        formContext={formDataAndIncludings}
        ...
    />
)
Run Code Online (Sandbox Code Playgroud)

gdh*_*gdh 4

状态直接在父级中发生变化onChange,因此组件中的 useEffectReadOnly不会被触发。

\n\n

更新你的 onChange

\n\n
const onChange = (e: IChangeEvent<any>) => {\n    setFormDataAndIncludings(prev => ({\n            ...prev ,\n            queryData : [\n                e.formData,\n                ...prev.queryData.slice(0,1)\n            ]\n        }))\xe2\x80\xa9\n    //const newFormDataAndIncludings = { ...formDataAndIncludings };\n    //newFormDataAndIncludings.queryData[0] = e.formData;\n    //setFormDataAndIncludings(newFormDataAndIncludings);\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

照常提供 useEffect 依赖项

\n\n
React.useEffect(() => {\n        setValue(firstName());\n    }, [formContext]);\n
Run Code Online (Sandbox Code Playgroud)\n