【问题标题】:function without () in useState (react hook)useState 中没有 () 的函数(反应钩子)
【发布时间】:2020-03-03 05:52:03
【问题描述】:

当我像这样将函数参数传递给 useState() 时:

const [testA, setTestA] = useState(returnTestA());  // run every rendering
const [testB, setTestB] = useState(returnTestB); // run only mount
  • 每次渲染都会运行带有 () 的函数
  • 但是没有()的函数只运行第一次渲染(mount)

这是我的全部代码:(info.js)

import React, { useState } from "react";

let count = 0;

const returnTestA = () => {
  count++;
  console.log("test A: " + count);
  return "test";
};

const returnTestB = () => {
  count++;
  console.log("test B: " + count);
  return "test";
};

const Info = () => {
  const [name, setName] = useState("");
  const [testA, setTestA] = useState(returnTestA());  // run every rendering
  const [testB, setTestB] = useState(returnTestB); // run only mount

  const onChangeName = e => {
    setName(e.target.value);
  };

  return (
    <div>
      <div>
        <input name="name" value={name} onChange={onChangeName} />
      </div>
      <div>
        <div>
          <b>Name:</b> {name}
        </div>
      </div>
    </div>
  );
};

export default Info;

结果是:

  1. 只需 npm 启动:

  2. 在输入中输入一些内容:

为什么会这样??最佳做法是什么?

【问题讨论】:

  • () 在引用函数之后意味着立即调用函数并在包含表达式中使用返回值。如果没有(),对函数的引用本身就是表达式的值。

标签: javascript reactjs react-hooks


【解决方案1】:

这里看官方解释:https://reactjs.org/docs/hooks-reference.html#lazy-initial-state

const [testB, setTestB] = useState(returnTestB);

类似:

const [testB, setTestB] = useState(() => returnTestB());

你将一个函数作为参数传递给useState()方法,这个函数在mount时只会运行一次。

但是对于

const [testA, setTestA] = useState(returnTestA());

你将一个计算对象作为参数传递给useState(),每次渲染时都会计算这个对象。

【讨论】:

【解决方案2】:

它没有反应 这是关于 JavaScript 的

这里有一些例子

test.js
const testFunc = () => console.log('1');

如果我们定义 testFunc 并加载 test.js 这并不意味着触发testFunc

我们也可以将testFunc 作为参数传递 它被称为一等公民(对象)


现在让我们深入了解您的代码

 const [testA, setTestA] = useState(returnTestA());  // run every rendering
  const [testB, setTestB] = useState(returnTestB)


1. useState(returnTestA()).
returnTestA() 的意思是触发(调用)returnTestA 并将returnTeatA 函数的结果传递给useState

传值


2. useState(useState(returnTestB)).
returnTestB 的意思是将没有触发器的函数传递给useState
或许useState 这么叫

传递函数



您想了解更多关于一等公民(对象)的详细信息
这个链接一定能帮助你了解What are "first class" objects?

【讨论】:

    【解决方案3】:

    returnTestA() 调用函数。

    returnTestA 返回它的值。

    let a = function() {
        return 'test';
    };
    

    所以当您编写a() 时,它会调用该函数并返回其值,而 a 仅表示 'test'

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2020-07-17
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2020-09-27
      相关资源
      最近更新 更多