【问题标题】:Prop change not triggering useEffect道具更改未触发 useEffect
【发布时间】:2020-09-07 15:29:32
【问题描述】:

我有一个带有 useEffect 的 react 组件,它在 props 更改时不会被触发。我希望这个组件根据道具更新它显示的内容。但是,当 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;

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

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

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

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}
        ...
    />
)

【问题讨论】:

  • 你能说明你是如何更新 formContext 的吗?
  • @AtinSingh,我已经更新了我的帖子以显示它是如何更新的。

标签: reactjs react-props use-effect react-jsonschema-forms


【解决方案1】:

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

更新您的 onChange

const onChange = (e: IChangeEvent<any>) => {
    setFormDataAndIncludings(prev => ({
            ...prev ,
            queryData : [
                e.formData,
                ...prev.queryData.slice(0,1)
            ]
        }))

    //const newFormDataAndIncludings = { ...formDataAndIncludings };
    //newFormDataAndIncludings.queryData[0] = e.formData;
    //setFormDataAndIncludings(newFormDataAndIncludings);
};

照常提供useEffect依赖

React.useEffect(() => {
        setValue(firstName());
    }, [formContext]);

【讨论】:

  • 您好,谢谢您的建议。不幸的是,我也尝试过,但没有奏效。我觉得真的很奇怪。另外,我很乐意只传递我想要的道具,但是,我正在处理一个不允许我这样做的库(react-jsonschema-form)。
  • 知道了...刚刚看到您更新的问题...我现在将更新答案
  • 大功告成!非常感谢。我会投票给你的答案,但我太菜鸟不能给分。再次非常感谢!编辑:显然我现在可以投票了。
猜你喜欢
  • 2022-06-14
  • 2020-11-06
  • 2021-03-29
  • 2019-07-04
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多