React-Hooks开篇和React-Hooks-useState

简介: React-Hooks开篇和React-Hooks-useState

Hook 概述


  • Hook 是 React 16.8 的新增特性
  • 它可以让函数式组件拥有类组件的特性



为什么需要 Hook


在 Hook 出现之前, 如果我们想在组件中保存自己的状态, 如果我们想在组件的某个生命周期中做一些事情, 那么我们必须使用类组件。


  • 但是类组件的学习成本是比较高的, 你必须懂得 ES6 的 class, 你必须懂得箭头函数
  • 但是在类组件的同一个生命周期方法中, 我们可能会编写很多不同的业务逻辑代码
  • 这样就导致了大量不同的业务逻辑代码混杂到一个方法中, 导致代码变得很难以维护(诸如: 在组件被挂载的生命周期中, 可能需要注册监听, 可能需要发送网络请求等)
  • 但是在类组件中共享数据是非常繁琐的, 需要借助 Context 或者 Redux

所以当应用程序变得复杂时, 类组件就会变得非常复杂, 非常难以维护,所以 Hook 就是为了解决以上问题而生的。




使用 Hook


  • Hook 的使用我们无需额外安装任何第三方库, 因为它就是 React 的一部分
  • Hook 只能在函数组件中使用, 不能在类组件,或者函数组件之外的地方使用
  • Hook 只能在函数最外层调用, 不要在循环、条件判断或者子函数中调用在这些地方是使用不了 Hook 的

官方文档地址:https://react.docschina.org/docs/hooks-intro.html

function Home() {
    // 只能在函数体的最外层使用
    // 只能在这个地方使用Hook
    if () {
        // 不能使用Hook
    }
    while () {
        // 不能使用Hook
    }
    for () {
        // 不能使用Hook
    }
    switch () {
        // 不能使用Hook
    }
    function demo() {
        // 不能使用Hook
    }
}



useState


Hook 概述

  • Hook 就是一个特殊的函数



useState Hook 概述

  • 可以让函数式组件保存自己状态的函数



使用 useState Hook


  • Hook 只能在函数式组件中使用, 并且只能在函数体的最外层使用

有一个 useState 方法该方法接收一个参数:

  • 参数:保存状态的初始值

返回值,是一个数组, 这个数组中有两个元素:

  • 第一个元素: 保存的状态
  • 第二个元素: 修改保存状态的方法
import React, {useState} from 'react';
export default function App() {
    const [state, setState] = useState(0);
    return (
        <div>
            <p>{state}</p>
            <button onClick={() => {
                setState(state + 1)
            }}>增加
            </button>
            <button onClick={() => {
                setState(state - 1)
            }}>减少
            </button>
        </div>
    )
}


在同一个函数式组件中, 是可以多次使用同名的 Hook 的, 当然除了可以多次使用同名的 Hook 之外呢,还可以保存我们复杂的状态内容如下:

import React, {useState} from 'react';
export default function App() {
    const [ageState, setAgeState] = useState(18);
    const [nameState, setNameState] = useState('yangbuyiya');
    const [studentState, setStudentState] = useState({name: 'zs', age: 23});
    const [heroState, setHeroState] = useState([
        {id: 1, name: '鲁班'},
        {id: 2, name: '虞姬'},
        {id: 3, name: '黄忠'},
    ]);
    return (
        <div>
            <p>{ageState}</p>
            <button onClick={() => {
                setAgeState(ageState + 1)
            }}>增加
            </button>
            <button onClick={() => {
                setAgeState(ageState - 1)
            }}>减少
            </button>
            <hr/>
            <p>{nameState}</p>
            <button onClick={() => {
                setNameState('Jonathan_Lee')
            }}>修改
            </button>
            <hr/>
            <p>{studentState.name}</p>
            <p>{studentState.age}</p>
            <hr/>
            <ul>{
                heroState.map((hero) => {
                    return <li key={hero.id}>{hero.name}</li>
                })
            }</ul>
        </div>
    )
}




useState 注意点


解决方案:

import React, {useState} from 'react';
export default function App() {
    const [ageState, setAgeState] = useState(18);
    const [nameState, setNameState] = useState('yangbuyiya');
    const [studentState, setStudentState] = useState({name: 'zs', age: 23});
    const [heroState, setHeroState] = useState([
        {id: 1, name: '鲁班'},
        {id: 2, name: '虞姬'},
        {id: 3, name: '黄忠'},
    ]);
    function incrementAge() {
        setAgeState((preAgeState) => preAgeState + 10);
        setAgeState((preAgeState) => preAgeState + 10);
        setAgeState((preAgeState) => preAgeState + 10);
    }
    function changeName() {
        setStudentState({...studentState, name: 'Jonathan_Lee'});
    }
    return (
        <div>
            <p>{ageState}</p>
            <button onClick={() => {
                incrementAge()
            }}>增加incrementAge
            </button>
            <button onClick={() => {
                setAgeState(ageState - 1)
            }}>减少
            </button>
            <hr/>
            <p>{nameState}</p>
            <button onClick={() => {
                setNameState('Jonathan_Lee')
            }}>修改
            </button>
            <hr/>
            <p>{studentState.name}</p>
            <p>{studentState.age}</p>
            <button onClick={() => {
                changeName()
            }}>修改changeName
            </button>
            <hr/>
            <ul>{
                heroState.map((hero) => {
                    return <li key={hero.id}>{hero.name}</li>
                })
            }</ul>
        </div>
    )
}

然后如上代码还有一处就是修改引用类型的数据,博主编写的代码是将之前的引用对象拿到,然后在截取出来在重新设置需要更新的字段即可。




最后


本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
存储 固态存储 Linux
BLOCK 层这么多参数都是什么意思?!
每个 request queue 会维护一个 struct queue_limits 结构来描述对应的块设备的硬件参数,这些参数描述了硬件存储单元的组织方式,会影响 block layer 的很多行为,其中部分参数在 `/sys/block//queue/` 下导出 ```c struct request_queue { struct queue_limits limits; ... } `
4276 1
|
12月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
SQL 关系型数据库 MySQL
MySQL查询(万字超详细版)
本文详细介绍了数据库中的单表和多表查询方法。首先,单表查询包括全列查询、指定列查询及去重查询,其中应避免使用`*`以提高效率。接着,文章讲解了排序查询,包括升序和降序,并展示了如何通过多个字段进行排序。在多表查询部分,本文解释了内连接、外连接(左外连接和右外连接)以及自连接的概念和用法,提供了丰富的代码示例
391 2
MySQL查询(万字超详细版)
|
存储
ceph集群存储池的资源配额
这篇文章讲解了如何在Ceph集群中为存储池设置资源配额,包括创建存储池、查看和设置存储池的最大对象数量和最大存储容量的限制。
221 2
|
11月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
Android开发
IDEA中的常用设置
这篇文章详细介绍了IntelliJ IDEA中常用设置的配置方法,包括外观与行为、编辑器、构建执行部署、快捷键设置以及模板的使用。
IDEA中的常用设置
|
12月前
|
敏捷开发
敏捷开发:拥抱变化,快速迭代
在软件开发领域,敏捷开发已成为应对快速变化、提升交付效率的有效方法。它强调团队协作、客户反馈和灵活应变,核心价值观包括个体互动优先于流程工具、可工作软件优先于详尽文档、客户合作优先于合同谈判、响应变化优先于遵循计划。敏捷开发通过跨功能团队、短周期迭代、持续改进和客户紧密合作等实践,实现高效开发和创新。虽然面临抵抗变化、管理期望等挑战,但敏捷思维能显著提升团队表现和产品品质。
|
10月前
|
人工智能 运维 安全
阿里云连续两年入选Gartner® DaaS魔力象限
近日,Gartner发布2024年《Daas魔力象限》报告,阿里云再次入围该魔力象限报告,成为国内唯一连续两年入选的云厂商。
|
存储 弹性计算 对象存储
ECS快照原理
云盘快照原理包括全量和增量快照。首次快照为全量,备份所有数据块;后续快照仅备份变化部分。快照存储在OSS中,同城冗余或本地冗余根据地域不同而定。删除快照时,按数据块引用关系释放空间。快照容量基于快照链统计,全量快照加所有增量大小。快照不占用云盘空间,但产生存储费用。