搞懂react中Hooks 状态的用法(案例讲解)

简介: 本篇文章带大家学习react中hooks的用法,自己也是在学习过程中进行记录,如果有总结不恰当的地方欢迎大家指出来,一起交流~

前言

本篇文章带大家学习react中hooks的用法,自己也是在学习过程中进行记录,如果有总结不恰当的地方欢迎大家指出来,一起交流~

Hook简介

为什么会出现Hook

1.在我们之前对react的学习中我们知道,class组件可以定义自己的state,用来保存组件自己内部的状态,function组件是没有状态的,因为函数式组件的变量他是局部的,每次调用都会开辟新的空间和新的变量,函数运行完毕以后,变量会被回收。
2.class组件有生命周期,我们可以在对应的生命周期中完成自己的逻辑,class组件在状态改变的时候会重新去执行render方法。而函数式组件在重新渲染的时候,会全部执行,又没有办法去调用componentDidUpdate,并且没有自己的状态。

什么是Hook

Hook是React16.8的新增特性。它可以让你在不编写class组件的情况下使用state以及其他的React特性(生命周期方法)。
Hook的出现,是开创性的,它解决了之前React存在的很多问题,比如说HOC的嵌套问题。

Hook的使用场景

  1. Hook的出现,基本可以替代我们之前所使用的calss组件的地方
  2. 在旧的项目中,不需要直接重构为Hook
  3. Hook只能在函数组件中使用,不能在类组件,或者函数组件之外的地方使用

Hook的使用原则

  1. 不要在循环里面、条件判断或者分支里面去使用Hook,只能在函数的最外层调用
  2. 只能在react函数组件中使用hook
  3. 单独在一个useState我们称之为hook,Hooks是对一类Hook的总称。

Hook实现累加器

在使用hook之前,我们先使用之前学习的类组件来实现累加器:

export class Add extends Component {
    state = { count: 1 }
    render() {
        return (
            <div>
                <h1>{this.state.count}</h1>
                <button onClick={this.add}>点击</button>
            </div>
        )
    }
    
    add = () => {
        this.setState({count: this.state.count + 1})
    }
}

比较简单,大家应该都能很快的实现,下面来使用hook实现这个累加器:
1.头部我们要引用一个新的东西useState,后面需要使用它
2.useState本身是一个函数,调用之后返回一个数组,第一项是状态,第二项是修改和设置我们状态的函数方法
3.定义一个state接收arr[0],定义变量setState为arr[1],也就是拿到第二项函数
4.给按钮绑定点击事件,实现累加效果

import React, { useState } from 'react'
export default function App() {
    const arr = useState(0)
    const state = arr[0]
    const setState = arr[1]
    return (
        <div>、
            <h1>Hook</h1>
            <p>{state}</p>
            <button onClick={(e) => setState(state + 1)}>点击</button>
        </div>
    )
}

实现效果:
在这里插入图片描述
当然了,这里代码我们还可以使用解构进行精简:

export default function App() {
    const [state, setState] = useState(0)
    return (
        <div>
            <p>{state}</p>
            <button onClick={(e) => setState(state + 1)}>+1</button>
            <button onClick={(e) => setState(state - 1)}>-1</button>
        </div>
    )
}

在这里插入图片描述

多个状态(案例)

上面讲的是一个状态,来看看多个状态怎么操作,写个简单的例子:
1.首先还是头部引入 useState
2.然后对要用到的数据进行结构,这里也定义了数组和对象的数据类型
3.需要用到的地方直接{age}使用即可
4.需要做操作的地方,使用结构的第二项函数进行操作即可,这里按钮就是给city数组添加元素

import React, { useState } from 'react'

export default function App() {
    const [age, setAge] = useState(18)
    const [money, setMoney] = useState(1000000000)
    const [city, setStar] = useState(['北京', '上海', '广州'])
    const [obj, setObj] = useState({name: '张三', age: 14})
    return (
        <div>
            <h1>张三同学: {age}岁</h1>
            <h2>他的存款: {money}万</h2>
            <ul>
                {
                    city.map((item, index) => {
                        return (<li key={item}>{item}</li>)
                    })
                }
            </ul>
            <h3>{obj.name}今年{obj.age}岁</h3>
            <button onClick={e=>{setStar([...city, '深圳'])}}>给数组加元素</button>
        </div>
    )
}

实现效果:
·在这里插入图片描述

复杂状态(案例)

这里我们实现一个模拟电影票的案例,点击按钮可以实现票价的调整
1.前面把数据解构就不说了
2.这里要通过点击每一项后面的按钮,改变对应项的票价,所以在函数中需要把index下标传入进去
3.然后在函数中,先把操作的数组拷贝一份,然后让里面对应index的数据项的价格改变,最后用setMovies进行修改

export default function App() {
    const [movies, setMovies] = useState([
        {id: 1, name: '守岛人', price: 50},
        {id: 2, name: '1921', price: 35},
        {id: 3, name: '哆啦A梦', price: 60},
        {id: 4, name: '中国医生', price: 40},
        {id: 5, name: '时间规划局', price: 55}
    ])

    function changePrice(index) {
        console.log(index)
        const movieList = [...movies]
        movieList[index].price += 5
        setMovies(movieList)
    }

    return (
        <div>
            <ul>
                {
                    movies.map((item, index) => {
                        return (
                            <li key={item.id}>
                                <span>电影名:《{item.name}》</span>
                                <span>票价:¥{item.price}</span>
                                <button onClick={e => changePrice(index)}>涨价了</button>
                            </li>
                        )
                    })
                }
            </ul>
        </div>
    )
}

使用之前状态值

如果我们需要使用之前的状态值来改变现有状态值,应该如何去做呢?
看下面例子:需求是做一个累加100的操作
1.==如果新state需要通过使用先前的state计算或者操作的话,我们可以使用函数传递给setstate,这个函数可以接收之前的值,并且返回更新后的值==
2.所以在点击事件中,使用setstate的参数,也就是先前的state,对该参数进行操作

export default function App() {
    const [state, setstate] = useState(() => 100)
    return (
        <div>
            <h1>{state}</h1>
            <button onClick={e => setstate((prev) => prev + 100)}>+100</button>
        </div>
    )
}

最后

本篇文件就到这里结束啦,主要给大家介绍了hooks中对于状态的用法,下篇文章会给大家继续讲解hooks它的生命周期相关的知识~

相关文章
|
1月前
|
前端开发 JavaScript 开发者
深入理解React Hooks:提升前端开发效率的关键
【10月更文挑战第5天】深入理解React Hooks:提升前端开发效率的关键
|
1月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
68 4
|
1月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
1月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
|
9天前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
19天前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
28 2
|
24天前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
35 6
|
1月前
|
前端开发 JavaScript 开发者
React Hooks
10月更文挑战第13天
34 1
|
1月前
|
前端开发
|
1月前
|
前端开发 JavaScript API
利用React Hooks简化状态管理
【10月更文挑战第1天】利用React Hooks简化状态管理