• react中的hooks


    React Hook/Hooks是什么?

    1. Hook是React 16.8.0版本增加的新特性/新语法
    2. 可以让你在函数组件中使用 state 以及其他的 React 特性

    一、State Hook

    (1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作,之前state只能在类式组件中使用
    (2). 语法: const [xxx, setXxx] = React.useState(initValue)  
    (3). useState()说明:
            参数: 第一次初始化指定的值在内部作缓存
            返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
    (4). setXxx()2种写法:
            setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
            setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    import React, {useState} from 'react';
    
    export default function StateHook() {
         console.log("demo");//调用render次数:点击次数+1;
        //react在底层做了处理,第一次指定的值会做缓存,所以每次重新渲染时,count的值不是0,而是缓存的值
        const [count, setCount] = useState(0);
        const add = () => {
            setCount(count + 1);//第一种方式
            //第二种方式
            setCount((count) => {
                return count + 2
            })
        }
        return (
            <div>
                <h1>当前的值为:{count}</h1>
                <button onClick={add}>点我+1</button>
            </div>
        )
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    二、Effect Hook

    (1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
    (2). React中的副作用操作:
            发ajax请求数据获取
            设置订阅 / 启动定时器
            手动更改真实DOM
    (3). 语法和说明: 
            useEffect(() => { 
              // 在此可以执行任何带副作用操作
              return () => { // 在组件卸载前执行
                // 在此做一些收尾工作, 比如清除定时器/取消订阅等
              }
            }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
        
    (4). 可以把 useEffect Hook 看做如下三个函数的组合
            componentDidMount()
            componentDidUpdate()
        	componentWillUnmount() 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    import React, {useEffect, useState} from 'react';
    
    export default function EffectHook(props) {
    
        const {root} = props;
        const [count, setCount] = useState(0);
        const [name, setName] = useState("Tom");
        
        const add = () => {
            setCount(count + 1);//第一种方式
        }
        const changeName = () => {
            setName("Bob");
        }
    //第一种情况代码
    //第二种情况代码
    //第三种情况代码
    
        //卸载组件
        const unMount = () => {
            root.unmount(document.getElementById('root'));
        }
        return (<div>
            <h1>Effect Hook</h1>
            <h2>当前的值为:{count}</h2>
            <h2>我的名字是:{name}</h2>
            <button onClick={add}>点我+1</button>
            <button onClick={changeName}>点我改名儿</button>
            <button onClick={unMount}>卸载组件</button>
        </div>)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    1. 第一种情况代码:没有传递第二个参数,对所有状态都进行监测,只要有状态发生改变就会执行 useEffect内的语句,返回的函数也会执行
        
        //初次渲染的时候会执行一次console.log("@")语句;
        //没有传递第二个参数时,对所有状态进行监测
        // 只要有状态发生改变就会执行console.log("@")语句,返回的函数也会执行
        useEffect(() => {
            const timer = setInterval(() => {
                setCount((count) => count + 1)
            }, 1000);
            //返回的函数只要有状态发生了改变就会执行
            return () => {
                clearInterval(timer);
                console.log("组件卸载了");
            }
        })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 第二种情况代码:第二个参数为[ ],对所有状态不进行监测,返回的函数在组件将要卸载的时候才会执行,相当于类组件中的钩子函数componentWillUnmount()
      useEffect(() => {
            const timer = setInterval(() => {
                setCount((count) => count + 1)
            }, 1000);
            //返回的函数相当于类组件中的钩子函数componentWillUnmount(),在组件卸载前执行
            return () => {
                clearInterval(timer);
                console.log("组件卸载了");
            }
        }, [])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 第三种情况代码:第二个参数为[value1,value2… ],对数组中的元素value1,value2…进行监测,返回的函数在监听的数组中的元素值发生了改变才会执行
       useEffect(() => {
            const timer = setInterval(() => {
                setCount((count) => count + 1)
            }, 1000);
            //返回的函数相当于类组件中的钩子函数componentWillUnmount(),在组件卸载前执行
            return () => {
                clearInterval(timer);
                console.log("组件卸载了");
            }
        }, [name])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、Ref Hook

    (1). Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
    (2). 语法: const refContainer = useRef()
    (3). 作用:保存标签对象,功能与React.createRef()一样
    
    • 1
    • 2
    • 3
    import React, {useRef} from 'react';
    
    export default function RefHook() {
        const MyRef = useRef(null);
        //获取Input框的输入值
        const getValue = () => {
            console.log("输入的值为:", MyRef.current.value);
        }
        return (
            <div>
                <input type="text" ref={MyRef}/>
                <button onClick={getValue}>点我获取input的值</button>
            </div>
        )
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    四、useCallback

    防止因为组件重新渲染,导致方法重新创建,起到缓存作用,只有第二个参数变化了才重新声明一次。

  • 相关阅读:
    Qt中正确的设置窗体的背景图片的几种方式
    SpringEvent的介绍以及实例
    21天学习挑战赛——Python 爬虫入门
    制作一个简单HTML电影网页设计(HTML+CSS)
    奋进新时代 和数SaaS开启下一个波澜壮阔科技新世界
    路由交换技术之代理ARP
    PHP知识大全
    分享一下做一个电商小程序的步骤是什么呢
    lingo问题需要解决
    星辰天合联合星环科技完成互认证 共同打造更有生命力的大数据存算解决方案
  • 原文地址:https://blog.csdn.net/fangqi20170515/article/details/126374617