为什么函数getSth在每次组件重现时都会被调用(可以看到console.log)(通过点击按钮改变isSth的值),尽管它没有改变randomValue的状态?

import React, { useState } from 'react';

function getSth() {
  console.log('init');
  return Math.random();
}

function Home() {
  const [randomValue, setRandomValue] = useState(getSth());
  const [isSth, setIsSth] = useState(false);

  console.log(randomValue);

  const onClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    setIsSth((prev) => !prev);
  };

  return (
    <button type="button" onClick={onClick}>
      Click me
    </button>
  );
}

export default Home;

但当我这样做的时候,getSth实际上是一次呼叫?

  const [randomValue, setRandomValue] = useState(0);
  useEffect(() => {
    getSth();
  }, []);

推荐答案

初始值仅在第一次渲染时设置,因此即使多次调用该函数,也只使用第一次结果.

getSth函数(不带())传递给useState,因此它将被视为初始化式函数:

const [randomValue, setRandomValue] = useState(getSth); // remove () from getSth

根据Reaction的文件:

如果将函数作为InitialState传递,则它将被视为 初始化式函数.它应该是纯粹的,不应该有任何争论,并且 应返回任何类型的值.Reaction将调用您的初始值设定项 函数,并存储其返回值. 作为初始状态.

初始值设定项函数只调用一次.请参见Avoiding recreating the initial state.

Javascript相关问答推荐

序列查找器功能应用默认值而不是读取响应

通过在页面上滚动来移动滚动条

Redux查询多个数据库Api reducerPath&

Angular:动画不启动

如何修复(或忽略)HTML模板中的TypeScript错误?'

WebGL 2.0无符号整数输入变量

你怎么看啦啦队的回应?

JSDoc创建并从另一个文件导入类型

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

提交链接到AJAX数据结果的表单

JQuery Click事件不适用于动态创建的按钮

当用户点击保存按钮时,如何实现任务的更改?

处理TypeScrip Vue组件未初始化的react 对象

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

JavaScript -复制到剪贴板在Windows计算机上无效

为什么我看到的是回复,而不是我的文档?

ComponentWillReceiveProps仍在React 18.2.0中工作

谷歌饼图3D切片

将匿名函数附加到链接的onClick属性

在ReactJS上挂载组件时获得多个身份验证请求