首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >useCallback声明的顺序

useCallback声明的顺序
EN

Stack Overflow用户
提问于 2021-08-03 12:36:34
回答 1查看 343关注 0票数 3

useCallback函数声明的顺序重要吗?例如:

按以下顺序声明的函数:

  1. const aboveFunction = useCallback(()=>{ logCount() },[logCount])
  2. const logCount = useCallback(()=>{ console.log(count) },[count])
  3. const belowFunction = useCallback(()=>{ logCount() },[logCount])

注意,aboveFunctionbelowFunction都引用相同的logCount。打电话给setCount(2)之后,

aboveFunction() -> logCount() -> count // 0

belowFunction() -> logCount() -> count // 2

https://codesandbox.io/s/react-hooks-counter-demo-forked-7mofy?file=/src/index.js

代码语言:javascript
复制
/**
  Click increment button until count is 2, then click 
  Above and Below button and check console log
 * Even though the count value is > 0, aboveIncrement console.log(count) still gives 0
 */

import React, { useState, useCallback } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function App() {
  const [count, setCount] = useState(0);

  /** Assuming all the functions below do some intensive stuffs to justify useCallback */
  const aboveFunction = useCallback(() => {
    // ...do other intensive stuff
    logCount("Above count:"); // Above count: 0
  }, [logCount]);

  const logCount = useCallback(
    (str) => {
      // ...do other intensive stuff
      console.log(str, count);
    },
    [count]
  );

  const belowFunction = useCallback(() => {
    // ...do other intensive stuff
    logCount("Below count:"); // Above count: 2
  }, [logCount]);

  return (
    <div className="App">
      <h1>
        Click increment button until count is 2, then click Above/ Below button
        and see console log
      </h1>
      <h2>You clicked {count} times!</h2>
      <div
        style={{
          display: "flex",
          alignItems: "center",
          flexDirection: "column"
        }}
      >
        <button style={{ margin: 10 }} onClick={aboveFunction}>
          Above Increment Function
        </button>
        <button style={{ margin: 10 }} onClick={() => setCount(count + 1)}>
          Increment
        </button>
        <button style={{ margin: 10 }} onClick={belowFunction}>
          Below Increment Function
        </button>
      </div>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

显然,useCallback声明的顺序对于代码的工作非常重要。但是,如果我们这样写它,https://codesandbox.io/s/react-hooks-counter-demo-forked-7mofy?file=/src/index1.js

代码语言:javascript
复制
  let logCount;
  const aboveFunction = useCallback(() => {
    logCount("Above count:"); // Above count: 0
  }, [logCount]);

  logCount = useCallback((str) => {
      console.log(str, count);
    }, [count]
  );

  const belowFunction = useCallback(() => {
    logCount("Below count:"); // Above count: 2
  }, [logCount]);

aboveFunction仍然给出陈旧的计数值。我错过了什么规则吗?

是的,这里的一个修复方法是应用eslint no-use-before-define。但我想知道为什么..。函数不是在JavaScript中挂起的吗?声明它的顺序不重要吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-03 13:24:27

我错过了什么规则吗?

您不是缺少rule-of-hooks,而是缺少了no-use-before-define规则。

您必须使用logCount函数在aboveFunction.之上

在这个附加的图像中

您可以看到,它显示了函数声明的警告。

也许您可以在您的项目中添加es-lint,并确保您也添加了这个插件 & 不使用前定义,以便在vs代码中显示这些类型的警告。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68636175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档