初谈hooks

- hooks是什么?

可以在不使用类组件的情况下,使用 state 以及其他的React特性

- 都如何使用

通过(useState,useEffect,useContext,useRef,useMemo)

useState

useState:组件状态管理的钩子(可以理解为react中的state)

使用如下: (从raect中解构出 useState,是一个数组前面定义值后面定义方法通过调用方法改变值)

import { useState } from 'react'
const [state, setState] = useState(initState)

其中后面useState(initState)这个的话里面传入的是一个初始的state,可以是任意的数据类型(只在初次渲染时有效,二次渲染时会被忽略),也可以是回调函数,但函数必须有返回值。

它的作用的话是让函数型组件具备了管理状态的能力,其中重要一点与classsetState不同的是,如果状态值是一个对象,useState更新状态的方法是不会合并更新对象的,可以结合展开运算符来达到合并更新对象的效果:

setState(prevState => {
    return { ...prevState, ...updateValues };
});

有2条规定

  • Hooks必须写在函数的最外层,不能在循环语句、条件判断、子函数中调用
    import { useEffect } from 'react'
    useEffect(() => {
        ......//副作用处理
        return () => {
            ......//清理副作用的清除函数
        }
    }, [])
  • 只能在React的函数式组件、自定义Hooks中调用Hooks,不能在其他JavaScript函数中调用。

useEffect

     我们平常用到最多的情况下是把它相当于react中的componentDidMount

使用

useEffect(callback, array):副作用处理的钩子;它也是componentDidMount()、componentDidUpdate()、componentWillUnmount()、这几个生命周期方法的统一,一个顶三个!

callback 回调函数,作用是处理副作用的逻辑,可以返回一个函数,用作清理副作用;

如下:

import { useEffect } from 'react'
useEffect(() => {
    ......//副作用处理
    return () => {
        ......//清理副作用的清除函数
    }
}, [])

为防止内存泄漏,清除函数会在组件卸载前执行;如果组件多次渲染,则在执行下一个 effect 之前,上一个 effect 就已被清除

array是一个数组用于控制它的执行省略时,每次渲染都会执行; 空数组时,只会在组件挂载/卸载时执行一次,类似componentDidMount、componentWillUnmount; 非空数组时,会在数组元素发生改变后执行,且这个变化的比较是浅比较。


useContext 

  配合useReducer来管理状态(这个没有什么可以描述)

useRef

   创建ref,方便访问操作DOM

    const RefCompt = () => {
        //创建ref
        const inputRef = useRef();
        const getValue = () => {
            //访问ref
            const inpt = inputRef.current;  // input的DOM对象
            inpt.focus();  // 让 input 框获取焦点
            console.log(inpt.value);  // input输入框的值
        };
        //挂载
        return (<div>
            <input ref={ inputRef } type="text" />
            <button onClick={ getValue }>获取值</button>
        </div>);
    }

    注意:与 useState 不同的是,useRef 会实时更新数据,但不会触发组件的更新!

useMemo(性能优化) 发生变化时,返回一个新的函数体callback

    // 合并obj1、obj2
    const backValue = useCallback(() => Object.assign(obj1, obj2), [obj1, obj2])

    <div>{ backValue().name } --- { backValue().age }</div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值