• React Hook - useState函数的详细解析


    useState的详细解析

    在上一篇文章中, 我用到useState来让大家体验一下hooks函数

    import { memo, useState } from "react"
    
    const Counter2 = memo(() => {
      const [counter, setCounter] = useState(100)
      
      return (
        <div>
          <h2>当前计数: {counter}</h2>
          <button onClick={() => setCounter(counter - 1)}>-1</button>
          <button onClick={() => setCounter(counter + 1)}>+1</button>
        </div>
      )
    })
    
    export default Counter2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    那么接下来我们来先研究一下上面核心的一段代码代表什么意思

    useState来自react,需要从react中导入,是一个hook函数, 官方中也将它成为State Hook, 它与class组件里面的 this.state 提供的功能完全相同;

    一般来说,在函数退出后变量就会”消失”,而 state 中的变量会被 React 保留。

    useState只有一个参数: 接收一个初始化状态的值(设置初始值),在第一次组件被调用时使用来作为初始化值(如果不设置则默认为undefined);

    useState的返回值: 返回一个数组,数组包含两个元素;

    • 元素一: 当前状态的值(第一次调用为初始化值);
    • 元素二: 是一个设置状态值变化的函数;
    • 不过我们如果总是使用索引来获取这两个元素总是不方便的, 因此在开发中我们通常是会对数组进行解构(当然要取什么名字是自定义的)
    • 例如上面代码: const [counter, setCounter] = useState(100)

    上面代码中, 点击button按钮后,会完成两件事情:

    调用元素二: setCounter,设置一个新的值;

    组件重新渲染,并且根据新的值返回DOM结构;

    相信通过上面的一个简单案例,你已经会喜欢上Hook的使用了

    Hook 就是 JavaScript 函数,这个函数可以帮助你钩入(hook into) React State以及生命周期等特性;

    但是使用它们会有两个额外的规则:

    只能在函数组件的顶层调用 Hook。不能在循环语句、条件判断语句或者子函数中调用。

    只能在 React 的函数组件自定义hook中调用 Hook。不能在其他 JavaScript 函数中调用。

    Tip

    Hook 指的类似于useState、这样的某一个函数

    Hooks 是对这一类函数的统称

    大家可能有疑惑: 为什么叫 useState 而不叫 createState?

    “create” 可能不是很准确,因为 state 只在组件首次渲染 的时候才会被创建。

    在下一次重新渲染时,就已经不是创建了, useState 会返回给我们当前所保存的state(如果每次都创建新的变量,它就不是 “state”了)。

    这也是 Hook 的名字总是以 use 开头的一个原因, 因为你总是在使用而不是创建。

    当然,我们也可以在一个组件中定义多个变量和复杂变量(数组、对象)

    import React, { memo, useState } from 'react'
    
    const App = memo(() => {
      // 简单数据
      const [counter, setCounter] = useState(10)
      const [message, setMessage] = useState("Hello World")
      // 复杂数据
      const [banners, setBanners] = useState(["aaa", "bbb", "ccc"])
      const [infos, setInfos] = useState({
        name: "chenyq",
        age: 18,
        height: 1.88
      })
      
      function changeNumber() {
        setCounter(counter + 1)
      }
    
      return (
        <div>
          <h2>{counter}</h2>
          <button onClick={changeNumber}>+1</button>
          <h2>{message}</h2>
          <h2>{banners}</h2>
          <h2>{infos.name}-{infos.age}-{infos.height}</h2>
        </div>
      )
    })
    
    export default App
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    前端国密SM4加密代码
    c++类的初始化
    java毕业设计基于SSM毕业设计管理系统|毕设管理文档成绩Shiro含论文+开题报告
    Life and Its Markovian Symphony
    [C++] 哈希的模拟实现---闭散列法、开散列法(上)
    [Spring Cloud] Hystrix三大特性--降级,熔断,隔离
    java111-日期时间格式化
    每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换
    智维专业工程师告诉你,哪款Kvaser多通道CAN总线分析仪性价比最高?
    JDBC学习笔记
  • 原文地址:https://blog.csdn.net/m0_71485750/article/details/126799388