React Hooks(useState、useEffect)

一、react hooks(useState)

使用hooks理由:
1、高阶组件为了复用,导致代码层级复杂
2、生命周期的复杂
3、写成functional组件,无状态组件,因为需要状态,又改成了class,成本高

1.1 useState使用

新建functionState.js函数组件,写入:

import React, { useState } from 'react'

export default function FunctionState() {
  
  const [name, setName] = useState('function hooks')   
  const [age, setAge] = useState('88')

  return (
    <div>
        <button onClick={() => {
            setName('React function hooks')
            setAge('100')
        }}>click</button>
        {name} - {age}
    </div>
  )
}

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

1.2 hooks案例(useState)

使用hooks做一个todolist
新建HooksTodolist.js函数组件,写入代码:

import React, { useState } from 'react'

export default function HooksTodolist() {

    let [name, setName] = useState('')
    let [list, setList] = useState(['000', '111', '222'])

    let inputChangeHandle = (event) => {
        setName(event.target.value)
    }

    let btnHandle = () => {
        let newList = [...list]
        setList([...newList, name])
        setName('')
    }

    let delHandle = (key) => {
        let temList = [...list]
        temList.splice(key, 1)
        setList(temList)
    }

    return (
        <div>
            <input value={name} onChange={inputChangeHandle}></input>
            <button onClick={btnHandle}>click</button>
            <ul>
                {list.map((value, key) => {
                    return <li key={key}>{value} <button onClick={(key) => delHandle(key)}>删除</button></li>
                })}
            </ul>
        </div>
    )
}

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


二、react hooks(useEffect)

useEffect可以支持写注册多个。

2.1 useEffect使用

Effect Hook 可以让你在函数组件中执行副作用操作

新建组件functionUseEffect.js,写入代码:

import axios from 'axios'
import React, { useEffect, useState } from 'react'

export default function FunctionUseEffect() {

  const [list, setList] = useState([])

  useEffect(() => {
    axios.get('/data.json').then(res => {
        console.log(res.data.data.films)
        setList(res.data.data.films)
    }, err => {
        console.log(err)
    }) 
  }, ['list']) // 传入依赖项

  return (
    <div>
        <ul>
            {list.map((item) => {
                return <li key={item.filmId}>{item.name}</li>
            })}
        </ul>
    </div>
  )
}

在这里插入图片描述
可以看到我们在使用useEffect时,第二个参数传入了依赖项,这将有助于函数式组件,实时监听这个值是否改变,如果改变了将会重新触发请求。如果不变的话,将不会去请求。


2.2 useEffect模拟销毁

因为我们知道在react中,函数式组件是没有像类组件那样的生命周期,那么在函数式组件中将如何销毁呢。
创建useEffectDestroy.js写入代码:

import React, { useEffect, Component } from 'react'

export default class UseEffectDestroy extends Component {
  
    state = {
        flag: true
    }
  
    render() {
      return (
        <div>
            <button onClick={() => {
                this.setState({
                    flag: !this.state.flag
                })
            }}>click</button>
            {this.state.flag && <Child></Child>}
        </div>
      )
    }
  }

function Child() {
    useEffect(() => {
        window.onresize = () => {
            console.log('resize')
        }
        var timer = setInterval(() => {
            console.log(222)
        },1000)


        return () => {
            console.log('组件销毁')
            window.onresize = null;
            clearInterval(timer)
        }
    }, []) // 不传依赖项等于只销毁一次,传入依赖项每次依赖项改变,并且组件销毁都会执行

    return (
        <div>Child</div>
    )
}

效果:
在这里插入图片描述
在这里插入图片描述
组件销毁后将原先绑定的事件都清除了。


2.3 useEffect和useLayoutEffect区别

简单来说就是调用时机不同,useLayoutEffect和原来的componentDidMount & componentDidUpdate一致,在react完成DOM更新后马上同步调用的代码,会阻塞页面渲染,而useEffect是会在整个页面渲染完才会调用的代码。 官方建议先使用useEffect

在实际使用时如果想避免页面抖动,可以把Dom操作的代码放到useLayoutEffect中。这里的修改会一次性渲染,避免重绘代价。

在学习React的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
useStateReact Hooks提供的一个函数,用于在函数式组件中声明和使用状态。它接受一个初始值作为参数,并返回一个包含当前状态和更新状态的数组。useState的作用类似于类组件中的this.state和this.setState方法,但是在函数式组件中使用更加简洁方便。 useEffect也是React Hooks提供的一个函数,用于在函数式组件中执行副作用操作,比如订阅事件、发送网络请求、操作DOM等。它接受两个参数,第一个参数是一个回调函数,用于执行副作用操作,第二个参数是一个依赖数组,用于指定何时重新执行副作用操作。useEffect的作用类似于类组件中的生命周期方法,比如componentDidMount、componentDidUpdate和componentWillUnmount。 useCallback也是React Hooks提供的一个函数,用于在函数式组件中缓存回调函数。它接受一个回调函数和一个依赖数组作为参数,并返回一个经过缓存的回调函数。useCallback的作用是在依赖数组不变的情况下,避免不必要的函数重新创建,提高性能。 综上所述,useState用于声明和使用状态,useEffect用于执行副作用操作,而useCallback用于缓存回调函数。它们都是React Hooks提供的函数,可以在函数式组件中方便地使用。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [搞懂React Hooks之 useState, useCallback, useEffect, useRef ,useMemo和useEffect](https://blog.csdn.net/qq_27401917/article/details/116699141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [学习记录431@reactuseStateuseEffectuseCallback](https://blog.csdn.net/weixin_44663675/article/details/119121498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值