React中useState如何保存函数

简介: useState想要保存函数的坑先要明确一个概念:

useState想要保存函数的坑


23.png24.png


useState右边括号中初始值为类似0这种类型的时候,其左边数组中初始值的类型也就为对应的number类型;

用一句简单的话来说,右边赋什么,左边就是什么,也就是说useState是能存储这些数据的,但是有一种类型除外,就是函数,见下图

25.png


当右边为函数的时候,左边居然为void类型,怎么解决??

26.png


只需将你想要保存的函数作为返回值即可!(其实这里利用了惰性加载,参见例a旁的注解)

const [fn,setFn ] = React.useState(()=>()=>{});

useState中保存函数的实战与方案

注意比较下面的两个例子:

例a:(注意:useState中的函数一开始渲染的时候会立即执行!就是说useState右边括号中的函数在组件的初始渲染中会立即执行)

27.png


例b:(完成了对函数的保存与更改)

28.png29.png30.png31.png

import React from"react";
import"./styles.css";
exportdefaultfunction App2() {
  const [fn, setFn] = React.useState(() =>() => {
    alert("I am init function");
  });
  console.log("fn: ", fn);
  return (
    <div className="App">
      <button onClick={() => setFn(() => () => alert("update function"))}>
        setCallback
      </button>
      <button onClick={fn}> callback </button>
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

32.png

使用useRef的解决方案

使用useRef解决这个问题的坑:

import React from"react";
import"./styles.css";
exportdefaultfunction App3() {
  const callbackRef = React.useRef(() => {
    alert("I am init function");
  });
  const callback = callbackRef.current
  console.log("callback: ", callback);
  return (
    <div className="App">
      <button onClick={() => (callbackRef.current=() => alert("update function"))}>
        setCallback
      </button>
      <button onClick={callback}> callback </button>
      {/*s12*/}
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

点击callback按钮:

33.png


点击setCallback:

34.png


再次点击callback按钮(发现没有变化,调用的还是原来的函数)

35.png

上面问题的原因是什么?

useRef不是state,用useRef定义的只是普通的变量,不是本组件的状态,useRef这个容器里保存的值改变的时候,state不会改变,故不会触发渲染;

故s12处的callback还是第一次渲染时的callback!怎么解决这个问题??

只要将改变之后的callbackRef.current()重新读取出来即可,而不是读取之前的那个值

import React from"react";
import"./styles.css";
exportdefaultfunction App4() {
  const callbackRef = React.useRef(() => alert("I am init function"));
  const callback = callbackRef.current;
  console.log("callback: ", callback);
  return (
    <div className="App">
      <button
        onClick={() => (callbackRef.current = () => alert("update function"))}
      >
        setCallback
      </button>
      {/*下面一行很重要!!!如果写成callbackRef.current也还是不行,这样读取的还是之前的值,并没有重新读取 */}
      <button onClick={() => callbackRef.current()}> call callback </button>
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

36.png37.png38.png


总结

本文主要小结了useState是如何保存函数的,主要是采用柯里化的方式,即类似于如下这种解决方式(主要是将你想要保存的函数作为返回值):

const [fn, setFn] = React.useState(() =>() => {
    console.log("I am Currying")
  });

至此,又解决了一个useState的坑

目录
相关文章
|
2月前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
143 1
|
1月前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
55 8
|
10天前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
2月前
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
46 2
|
1月前
|
存储 前端开发 JavaScript
React useState 和 useRef 的区别
本文介绍了 React 中 `useState` 和 `useRef` 这两个重要 Hook 的区别和使用场景。`useState` 用于管理状态并在状态变化时重新渲染组件,适用于表单输入、显示/隐藏组件、动态样式等场景。`useRef` 则用于在渲染之间保持可变值而不触发重新渲染,适用于访问 DOM 元素、存储定时器 ID 等场景。文章还提供了具体的代码示例,帮助读者更好地理解和应用这两个 Hook。
40 0
|
2月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
29 2
|
2月前
|
前端开发
React中函数式Hooks之useState的使用
本文介绍了React中函数式组件的Hooks——`useState`的使用方法。`useState`允许在函数式组件中使用状态,它返回一个数组,其中包含当前状态的值和更新该状态的函数。文章通过示例代码展示了如何声明状态变量和更新状态变量,包括对数值和对象状态的更新。此外,还展示了如何通过点击按钮触发状态更新,实现交互功能。
39 1
|
2月前
|
前端开发
react学习(22)高阶函数和函数柯里化
react学习(22)高阶函数和函数柯里化
|
3月前
|
前端开发
如何编写React函数组件
【8月更文挑战第17天】如何编写React函数组件
22 2
|
3月前
|
前端开发 开发者
介绍React的useState
【8月更文挑战第6天】 介绍React的useState
40 1