【问题标题】:A component is changing a controlled input of type text to be uncontrolled (useEffect)组件正在将文本类型的受控输入更改为不受控制(useEffect)
【发布时间】:2019-09-17 17:51:24
【问题描述】:

问题

我正在进行 API 调用,然后在获取数据后设置字段数据,但问题是它向我显示了错误(这篇文章的标题)。现在,我知道它的错误是针对其值未定义但我无法找到值何时未定义的输入

代码

这是我在渲染中的输入字段。

 <input
            type="text"
            placeholder="Company"
            name="company"
            value={company}
            onChange={e => onChangeHandler(e)}
          />

这是一个初始值

 const [formData, setFormData] = useState({
    company: ""
  });
 const {
    company
  } = formData;

这是我的useEffect

useEffect(() => {
    props.onFetched();

    setFormData({
      company:
        props.loading || !props.profile.company ? "" : props.profile.company,
    });
  }, [props.loading]);

formData 包含许多值,但为了简单起见,我在这里只粘贴了公司。 props.onFetched() 是获取数据并将其存储在 Redux 状态的 API 调用。

【问题讨论】:

    标签: reactjs input react-hooks


    【解决方案1】:

    我发现这有一些问题。首先这个错误 A component is changing a controlled input of type text to be uncontrolled (useEffect) 并不意味着您的价值未定义。这意味着您的组件正在尝试将输入更改为不受控制的输入。

    其次,如果 props.loading 由 redux saga/thunk 等设置,当您调用 props.onFetched() 并且您没有任何限制或验证时,它将在您的 useEffect 中创建无限循环

    useEffect(() => {
        props.onFetched();
    
        setFormData({
          company:
            props.loading || !props.profile.company ? "" : props.profile.company,
        });
      }, [props.loading]);
    

    第三,你真的不应该 setState 基于道具。如果您的输入组件需要 props.profile.company 的值,请直接使用该道具。像这样:

     <input
                type="text"
                placeholder="Company"
                name="company"
                value={props.profile.company}
                onChange={e => onChangeHandler(e)}
              />
    

    【讨论】:

    • 在 useEffect 中,您可以看到我添加了 props.loading 作为重新渲染的条件,所以这没有问题。直接或通过 props 使用 props.profile.company 基本上是一样的,我也尝试过,但它不起作用
    • 您将props.loading 添加为useEffect 的依赖项,但这意味着useEffect 将在props.loading 更改时运行。这就是为什么我说如果它由props.onFetched() 控制,它将创建一个无限循环。另外,直接将其用作 props 与基于 props 设置和控制状态不是一回事,实际上被认为是一种反应反模式。
    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2020-11-04
    • 2019-11-16
    • 2018-01-13
    • 2020-11-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多