【问题标题】:How to use useEffect deps when page reload?页面重新加载时如何使用useEffect deps?
【发布时间】:2020-12-14 11:04:16
【问题描述】:

我有一个带有文章的简单博客,当用户点击编辑按钮时,他会得到一个充满文章数据的表单——标题、描述、正文和标签。当我得到“id”时,我使用 useEffect 获取数据并填写表格。如果没有“id”表格应该是空白的。这是我的useEffect:

useEffect(() => {
    if (id) {
      isLoading = true;
      return props.onLoad(userService.articles.get(id));
    }
    props.onLoad(null);
    }, [id]
  );

但是当我重新加载页面 id 并没有改变,并且 func userService.articles.get(id) 没有运行时,所有数据都消失了。我需要建议如何解决它?可能是我需要使用其他部门来实现 useEffect,但现在我不知道我可以使用哪些部门来使用 exept id。

更新: 谢谢大家的帮助。我想要的只是:

  1. 当编辑页面加载/重新加载和“id”存在时 -> 填写表单字段
  2. 当“id”不存在时 -> 空白表单字段

现在,当我重新加载编辑页面时,我得到了 id - 但所有数据都消失了,我得到了空白表单:(

这里是完整代码:codesandbox

附言我使用免费的 API - 因此您可以在几秒钟内使用任何想象的电子邮件、用户名和密码创建用户。您不需要邮件确认。

【问题讨论】:

  • 我想你可能需要console.log(id) 看看是否有任何变化:> 但是当我重新加载页面 id 时没有改变,并且 func userService.articles.get(id) 没有运行
  • props.onLoad 期望接收什么作为参数,array 可能?
  • @NemanjaLazarevic,props.onLoad 工作正常,我在控制台中获得了所有需要的数据。但是重新加载页面时表单字段为空白。
  • 您应该发布更多代码,我们不知道id 来自哪里。当没有id 来获取articles 时,看到一个空表单是预期的行为吗?
  • ty,发布更新,添加了完整代码的链接。

标签: javascript reactjs react-hooks


【解决方案1】:

您应该使用this.props.match.params 访问来自该网址的id

    useEffect(() => {
      if (props.match.params.id) {
        setIsloading(true);
        userService.articles.get(props.match.params.id)
          .then((resp) => {
            setIsloading(false);
            props.onLoad(resp)
         })
    } else {
      props.onLoad(null);
    }
  }, [props.match.params.id]);

您还应该依靠useState 来管理您的isLoading 变量。

 const [isLoading, setIsloading] = useState(false);

我对您提供的代码进行了更多挖掘。 initialValues 将首先为空,因为来自 props 的数据尚不存在。而且一旦设置了initialValues,你就不能动态改变它们,你必须求助于antd Form api。

您不能通过 value 或 defaultValue 为每个表单控件设置 value 道具,您应该使用表单的initialValues 设置默认值。注意initialValues不能被setState动态更新,你 在这种情况下应该使用setFieldsValue

这里的关键是使用另一个 useEffect 依赖于来自 props 的表单值,并使用它们通过 setFieldsValue 重置表单值。

【讨论】:

  • tnx 很多。但是当按下编辑按钮时出现错误“无法读取未定义的属性'then'”。
  • 依赖列表中可能缺少 props。我已经更新了答案。我无法访问编辑页面,因为我无法登录。尝试使用更新的答案。
  • 如果onLoad 没有返回promise,您可能还会遇到您提到的错误。
  • 再次使用它的免费 API - 您可以使用任何想象的电子邮件、用户名和密码在几秒钟内创建用户。
【解决方案2】:

尝试不带选项的useEffect,它会在页面第一次加载时运行

useEffect(() => {
    if (id) {
      isLoading = true;
      return props.onLoad(userService.articles.get(id));
    }
    props.onLoad(null);
    }, []
  );

【讨论】:

  • 嗯,我想我误解了这个反应钩子:(当我从 deps 中删除 id 时,我的表单总是空白。但是当第一次加载页面时,id 作为 deps 它会填充表单。
【解决方案3】:

基于您希望 props.onLoad 在定义的“id”或定义的“id”更改时运行的假设:

从 useEffect 挂钩返回函数(就像使用 return props.onLoad(...) 所做的那样)专门用于“清理”副作用或订阅等内容。在 useEffect 挂钩中返回的函数只会在组件卸载时运行。请参阅文档here。此外,您似乎甚至没有传递一个在清理时运行的函数。您正在传递 props.onLoad 的结果以在清理时运行,根据函数名称,它似乎并不打算返回另一个函数。

因此,如果您希望 props.onLoad() 在定义了“id”的情况下运行,请删除 props.onLoad 之前的返回。该返回告诉 React 保留(它认为是一个函数)以在卸载时进行清理。如果它仍然不起作用,我想我们需要更多关于 props.onLoad 到底在做什么的信息。

【讨论】:

  • 泰。我更新了帖子,并添加了指向我的代码的链接。这是我第一次尝试使用钩子。我用类编写了这段代码。但仍然无法将其转换为功能组件和钩子:(
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2013-09-17
  • 2020-01-04
  • 2011-04-12
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多