当前位置: 首页 > 知识库问答 >
问题:

react.js - React:传入set函数中的函数参数会立刻执行吗?

薛寒
2024-04-15

React:传入set函数中的函数参数会立刻执行吗?
下面这段代码中console.log会打印[1, 2, 3, 4, 5, 3],也就说它打印的修改后的值。
但是在我理解中传入的这个函数参数应该不是立刻执行的吧。

  • 这里的console.log会不会异步打印呢?
  • 如果是的话,哪些情况下会异步打印,有没有官方说明?
function App() {  const [nums, setNums] = useState({    nums: [1, 2, 3, 4, 5],  });  function handleClick() {    setNums((pre) => {      pre.nums.push(3);      return pre;    });    console.log('after setNums:', nums);  }  return <button onClick={handleClick}>1</button>;}

stackblitiz

共有3个答案

孟佑运
2024-04-15

你上面的代码相当于 class 中的 this.state.nums=xxx 这样赋值了,你可以在App内打印一下 console.log('nums:', nums); 可以看到根本没有重新打印

你把代码改成下面这样 , 就会是你期待的异步效果了function App() {  const [nums, setNums] = useState({    nums: [1, 2, 3, 4, 5],  });  const handleClick = useCallback(() => {    setNums((pre) => {      const temp = JSON.parse(JSON.stringify(pre));      temp.nums.push(3);      return temp;    });    console.log('after setNums:', nums);  }, [nums]);  console.log('nums:', nums);  return <button onClick={handleClick}>1</button>;}export default App;
闻人昕
2024-04-15

因为setNums状态更新是异步的,处理完打印出来是更新前的值,想看到更新后的用useEffect监听这个值的变化就行。

function App() {  const [nums, setNums] = useState([1, 2, 3, 4, 5]);  useEffect(() => {    console.log('Nums updated:', nums);  }, [nums]);  function handleClick() {    setNums(prevNums => {            return [...prevNums, 3];    });  }  return <button onClick={handleClick}>Add 3</button>;}
湛鸿雪
2024-04-15

在React中,当你使用setFunction这样的setter函数来更新状态时,传入的函数参数并不会立即执行。它会被调度(schedule)以便在未来的某个时间点更新状态。这意味着,如果你在调用setFunction之后立即尝试读取新的状态,你可能会得到旧的值,因为新的状态更新可能还没有发生。

然而,在你的代码中,console.log并不是直接打印nums状态的值,而是打印一个字符串,这个字符串包含了nums状态的一个表示。在JavaScript中,对象和数组是通过引用传递的,所以当你在setNums的函数参数中修改pre.nums时,这个修改会影响到nums状态。因此,console.log打印的是修改后的nums状态的引用。

至于console.log是否异步打印,这取决于具体的JavaScript运行环境。在某些环境(如浏览器的控制台)中,console.log可能是异步的,这意味着它可能不会立即显示输出,而是在稍后的某个时间点显示。然而,这并不是由console.log函数本身决定的,而是由运行环境决定的。

总的来说,当你在setFunction中传入一个函数参数来更新状态时,这个函数参数并不会立即执行。而console.log的行为则取决于它所在的运行环境。在React中,如果你想在状态更新后执行某些操作,你应该使用useEffect钩子来监听状态的变化。

 类似资料:
  • 本文向大家介绍PowerShell函数中把参数传入另一个函数的函数传参例子,包括了PowerShell函数中把参数传入另一个函数的函数传参例子的使用技巧和注意事项,需要的朋友参考一下 本文介绍在自定义PowerShell函数时,可以使用@PSBoundParameters来将参数传递给另一函数。 下面,我们来创建一个Get-BIOS的函数, 在这个函数中,我们并没有作任何实际的操作,只是将输入的参

  • 本文向大家介绍实现一个once函数,传入函数参数只执行一次相关面试题,主要包含被问及实现一个once函数,传入函数参数只执行一次时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcpy(char *dest, const char *src); 其中src参数是传入参数,dest参数是传出参数。有些函数的指针参数同时担当了这两种角色,如select函数。其函数原型为: int

  • react set函数修改二维数组状态问题 一直到arr都是符合预期的,但是setRangIds执行后,每次打印rangIds都没有变化

  • 本文向大家介绍深入浅析javascript立即执行函数,包括了深入浅析javascript立即执行函数的使用技巧和注意事项,需要的朋友参考一下 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花; 当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解。  JavaScript 函数语法 函数就是包裹在花括号中的代

  • 本文向大家介绍深入理解javascript中的立即执行函数(function(){…})(),包括了深入理解javascript中的立即执行函数(function(){…})()的使用技巧和注意事项,需要的朋友参考一下 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步