React函数式编程Hook之useState,useEffect

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性

Hook为我们解决了哪些问题

  1. 在以往的函数式编程中涉及到组件状态更改的我们都不能使用函数式组件。函数式组件一般只用于一些简单的交互,用作信息展示。如果需要交互,更改状态等复杂逻辑时就需要使用class组件了,hook的出现让我们更好的拥抱函数式编程,让函数式组件也能使用state功能。
  2. 副作用
    我们一般称数据获取、订阅、定时执行任务、手动修改
    ReactDOM这些行为都可以称为副作用,由于React Hooks的出现,我们可以使用useEffect来处理,组件副作用问题,所以我们的函数式组件也能进行副作用逻辑的处理了
  3. 有状态的逻辑重用组件
  4. 复杂的状态管理
    之前我们使用redux、dva、mobx第三方状态管理器来进行复杂的状态管理,现在我们可以使用useReducer、useContext配合使用,实现复杂状态管理,不再依赖第三方状态管理器
  5. 开发效率和质量问题
    函数式组件比class组件简洁,开发的体验更好,效率更高,同时应用的性能也更好
新特性学习之useState

userState是组件状态管理的钩子,能使函数组件使用state。基本的使用语法如下

const [ state,setState ] = useState( initState )

state:需要设置的状态
setState:更新状态的方法,这只是一个方法名,可以随意更改
initState:state的初始值,可以是随意的数据类型,也可以是回调函数,但是函数必须是有返回值

简单计数器例子

import React, { useState } from 'react'

const App = () =>{
    const [count,setCount]=useState(0)
    return (
        <div>
            <h1>{count}</h1>
            <button onClick={()=>setCount(count+1)}>+</button>
            <button onClick={()=>setCount(count-1)}>-</button>
        </div>
    )
}
export default App;

简单文本改变例子

import React, { useState } from 'react'

const App = () =>{
    const [context,setContext]=useState('这是文本')
    return (
        <div>
           <h1>{context}</h1>
           <button onClick={()=>{setContext('我改变了文本内容哦')}}>点击更改</button>
        </div>
    )
}
export default App;
新特性之useEffect

useEffect:副作用处理钩子

副作用:数据获取、订阅、定时执行任务、手动修改ReactDOM这些行为都可以称为副作用。
useEffect就是为了处理这些副作用而生的。

useEffect也是componentDidMount,componentDidUpdate,componentWillUnmount这几个生命周期方法的统一。

基本语法使用如下:

useEffect( callback , array )

callback:回调函数,作用是处理副作用逻辑

useEffect(() =>{
 //副作⽤逻辑
 xxxxxx
 return ()=>{
 //清理副作⽤需要清理的内容
 //类似于componentWillUnmount,组件渲染和组件,卸载前执⾏的代码
 }
 },[])

callback可以返回⼀个函数,⽤作清理
array(可选参数):数组,⽤于控制useEffect的执⾏,分三种情况

  • 空数组,则只会执⾏⼀次(即初次渲染render),相当于componentDidMount
  • 非空数组,useEffect会在数组发⽣改变后执⾏
  • 不填array这个数组,useEffect每次渲染都会执⾏
import React, { useState ,useEffect} from 'react'

const App = () =>{
    const [count,setCount]=useState(0)
    //空数组情况只会渲染一次
    useEffect(() => {
        console.log(`您点击了${count}次`)
        return () => {
           
        }
    },[])
    return (
        <div>
            <h1>{count}</h1>
            <button onClick={()=>setCount(count+1)}>+</button>
            <button onClick={()=>setCount(count-1)}>-</button>
        </div>
    )
}
export default App;
  1. 空数组情况,无论我点击了多少次,也只会执行第一次,相当于componentDidMount:
    在这里插入图片描述

  2. 不填array这个数组,每次都变化都会被渲染

 useEffect(() => {
        console.log(`您点击了${count}次`)
        return () => {
        }
    })

在这里插入图片描述
3. 非空数组,useEffect会在数组发⽣改变后执⾏,count是正在变化的计数器的值,值变化后useEffect跟着改变而执行

//非空数组,useEffect会在数组发⽣改变后执⾏
    useEffect(() => {
        console.log(`您点击了${count}次`)
        return () => {}
    },[count])

在这里插入图片描述
大家可能会对于里面的return抱有疑问,这是 effect 可选的清除机制。每个 effect 都可以返回一个清除函数。如此可以将添加和移除订阅的逻辑放在一起。它们都属于 effect 的一部分。 React 会在组件卸载的时候执行清除操作。正如之前学到的,effect 在每次渲染的时候都会执行。

React的函数式组件中,`useEffect` 是一个用于处理副作用(side effects)的钩子(Hook),它允许你在函数组件中执行操作,如数据获取、订阅或手动更改React组件中的DOM。`useEffect` 的基本用法如下: 1. 首先,你需要在函数组件中引入`useEffect`。 2. 然后,在函数组件内部调用`useEffect`,它接受一个函数作为参数,这个函数称为副作用函数。 3. 在这个副作用函数中,你可以执行你的副作用操作。 4. 如果副作用函数需要在组件更新或卸载时被清理,可以返回另一个函数,该函数会在组件卸载或依赖项发生变化前执行。 `useEffect` 可以接受第二个可选参数,这是一个依赖项数组,只有当依赖项数组中的某个值发生变化时,副作用函数才会再次执行。如果省略该数组,则副作用函数会在每次渲染后执行。 下面是一个简单的例子: ```jsx import React, { useEffect } from 'react'; function MyComponent(props) { useEffect(() => { // 这里的代码会在组件挂载完成后执行一次 console.log('组件挂载完成'); // 返回一个清理函数,在组件卸载或依赖项变化时执行 return () => { console.log('组件卸载或依赖项变化'); }; }, []); // 空数组表示依赖项,这里表示仅在组件挂载和卸载时执行副作用函数 // 组件的其他逻辑... return ( <div> {/* 渲染内容 */} </div> ); } ``` 在上述代码中,`useEffect` 仅在组件挂载和卸载时执行副作用函数。如果依赖项数组中有值,那么副作用函数会在这些值发生变化时再次执行。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值