【问题标题】:form with default values in React.FC在 React.FC 中具有默认值的表单
【发布时间】:2021-01-12 01:21:48
【问题描述】:

我是使用 React.FC 的新手,并且一直在使用 redux,所以我不熟悉 React 本身的生命周期,但由于项目限制而无法使用它们,所以请帮助我。

我有一个作为 React.FC 组件的表单,它将在创建新内容和编辑时使用,我控制父状态中默认值的默认值并将它们作为道具传递。

export const Form: React.FC<Props> = props => {

  const [title, setTitle] = React.useState(props.defaultValues.title)

  const onChangeTitle = (event: React.ChangeEvent<HTMLInputElement>) => {
    setTitle(event.target.value)
  }



  return (
  <div>

                  <input
                    type="text"
                    value={title}
                    onChange={onChangeTitle}
                  />

    </div>
  )
}

问题是当我将新的默认值传递给组件以更新它们时,标题不会出现在输入中,表单输入不会相应更新,我放了一个

console.log(title)

在 const 声明的正下方,查看它们是否已正确更新,只是它们没有显示在输入值中。

我觉得在这种情况下我没有做我应该做的事情并且误解了重新渲染在 FC 中的工作原理,我查看了示例,其中大多数只是具有空白默认值的表单,我真的找不到我想要的东西。

编辑:我已经从代码中删减了太多并删除了回调

【问题讨论】:

  • 应该更新状态的onChangeTitle 回调在哪里?功能组件仍然是反应组件,因此渲染和组件生命周期与基于类的组件相同。有点不清楚你认为你的问题是什么。你真正想做什么?你能分享你的完整组件代码吗?
  • 对不起,我的问题不是我不能编辑输入,我的意思是我有一个我想通过这个组件更改的数据列表,以及我想在什么时候输入他们没有更新的当前数据值,为了清楚起见,我现在将更多地编辑问题。

标签: reactjs forms


【解决方案1】:

如果你的功能组件需要响应 props 的变化,那么它需要使用一个 useEffect 挂钩,并依赖于 prop 的值。带有适当依赖数组的useEffect 等效于基于类的组件的componentDidUpdate 生命周期方法。

export const Form: React.FC<Props> = props => {
  const [title, setTitle] = React.useState(props.defaultValues.title);

  useEffect(() => {
    setTitle(props.defaultValues.title);
  }, [props.defaultValues.title]);

  const onChangeTitle = (event: React.ChangeEvent<HTMLInputElement>) => {
    setTitle(event.target.value)
  }

  return (
    <div>
      <input
        type="text"
        value={title}
        onChange={onChangeTitle}
      />
    </div>
  )
}

【讨论】:

  • 感谢这成功了,但这是正确的用例吗?我真的需要阅读钩子,因为我没有处理过它们,但我现在正处于紧要关头,它真的很有帮助!
  • @Saifis 是的。虽然在本地组件状态中存储传递的道具通常是一种反模式,但在一些用例中它是可以接受的,我相信更新表单字段的初始/默认值(在受控输入的情况下)是有效用途之一.
  • 这是一个救命稻草,我四处询问人们,他们经常不理我,告诉我你不应该这样做,没有人告诉我有关 UseEffect 的事,我的截止日期很短不熟悉的技术,越来越绝望,感谢您听到我的声音。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多