这是来self 的文章组件的代码片段:

const [articles, setArticles] = useState([]);
  const [err, setErr] = useState("");

  const token = sessionStorage.getItem("token");
  const axiosWithToken = axios.create({
    headers: { Authorization: `Bearer ${token}` },
  });

  const getArticles = async () => {
    const res = await axiosWithToken.get("http://localhost:5000/user/articles");

    if (res.data.message === "All Articles") {
      setArticles(res.data.payload);
    } else {
      setErr(res.data.message);
    }
  };

  useEffect(() => {
    getArticles();
  }, []);

此代码正在运行,没有任何错误.但我认为使用带大括号的箭头函数运行一个函数太多了,所以我将useEffect挂接中的箭头函数更改为:

useEffect(() => getArticles(), []);

但是现在,当我加载文章组件并转到任何其他路径时,页面抛出一个未知错误,它只说明是'n' is not a function.我不明白为什么会发生这样的事情,因为我认为这两者在功能上是一样的.

推荐答案

问题是,通过更改为速记形式,您隐含地添加了return.您的速记版本与您的{}版本不同;相反,它等同于以下内容:

useEffect(() => {
    return getArticles();
//  ^^^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
}, []);

useEffect期望,如果您给它的回调返回undefined以外的任何值,则它是一个清除函数,Reaction应该在卸载时或重新运行效果之前使用它.(它不判断返回值是否为函数,测试从字面上看是!== undefined;参见紧跟在commitHookEffectListUnmount// Unmount注释之后.)摘自the documentation (my emphasis):

setup-具有您的效果逻辑的函数.Your setup function may also optionally return a cleanup function.当您的组件添加到DOM中时,REACT将运行您的设置函数.After every re-render with changed dependencies, React will first run the cleanup function(如果您为其提供了旧值),然后使用新值运行设置函数.在您的组件从DOM中删除后,Reaction将运行您的清理函数.

您的getArticles函数返回一个Promise(就像所有async个函数一样),Reaction试图将其用作清理函数,因为它是!== undefined.

因此,你可能希望保留这{}个,而不是移除它们.(还有其他方法可以避免返回值,但没有一种方法比{}更短.)

Javascript相关问答推荐

使用redux-toolet DelivercThunks刷新访问令牌

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

如何从隐藏/显示中删除其中一个点击?

在Three JS中看不到补间不透明度更改效果

使用原型判断对象是否为类的实例

邮箱密码重置链接不适用于已部署的React应用程序

如何在HTMX提示符中设置默认值?

触发异步函数后不能显示数据

Reaction-SWR-无更新组件

如何防止ionic 输入中的特殊字符.?

未捕获的运行时错误:调度程序为空

不同表的条件API端点Reaction-redux

Jexl to LowerCase()和Replace()

在Java脚本中构建接口的对象

我在哪里添加过滤器值到这个函数?

验证Java脚本函数中的两个变量

检测带有委托的元素内部的点击,以及元素何时按其类名被选中

CSS网格使页面自动滚动

为什么我的Reaction组件不能使用createBrowserRouter呈现?