zoukankan      html  css  js  c++  java
  • react-hooks 的实际应用

    2019年2月,随着react16.8版本的发布,react带来了稳定版的hooks,我从2019年的10月份开始使用hook,现在使用了大半年了,记录下遇到的坑

    1、useState

    useState 是hook组件的状态管理,使用的方法也很简单

    import  React, { useState } from 'react';
    
    const Demo = () => {
        const [count, setCount] = useState()
        return(
            <>
                <button onClick={() => {
                    setCount(count + 1);
                }}>
                    {count}
                </button>
            </>
        )
    }
    
    export default Demo;
    

    2、useEffect

    import  React, { useState, useEffect } from 'react';
    
    const Demo = () => {
        const [count, setCount] = useState();
    
        useEffect(() => {
            console.log('每次组件渲染的时候,我都会执行,我就是class组件的render')
        })
    
        useEffect(() => {
            console.log('组件第一次渲染的时候,我才会执行,我就是class组件的componentdidmount');
        }, [])
    
        useEffect(() => {
            console.log('只有count的值发生改变的时候我才会执行');
        }, [count])
        
        return(
            <>
                <button onClick={() => {
                    setCount(count + 1);
                }}>
                    {count}
                </button>
            </>
        )
    }
    
    export default Demo;
    

    3、useMemo

    可以返回一个常量

    可以返回一个方法

    import  React, { useState, useEffect, useMemo } from 'react';
    
    const Demo = () => {
        const [count, setCount] = useState();
    
        useEffect(() => {
            console.log('每次组件渲染的时候,我都会执行,我就是class组件的render')
        })
    
        useEffect(() => {
            console.log('组件第一次渲染的时候,我才会执行,我就是class组件的componentdidmount');
        }, [])
    
        useEffect(() => {
            console.log('只有count的值发生改变的时候我才会执行');
        }, [count])
    
        const countText = useMemo(() => {
            return '我是count的值:' + count
        }, [count])
    
        return(
            <>
                <button onClick={() => {
                    setCount(count + 1);
                }}>
                    {count}
                </button>
                {countText}
            </>
        )
    }
    
    export default Demo;
    
    import  React, { useState, useEffect, useMemo } from 'react';
    
    const Demo = () => {
        const [count, setCount] = useState();
    
        useEffect(() => {
            console.log('每次组件渲染的时候,我都会执行,我就是class组件的render')
        })
    
        useEffect(() => {
            console.log('组件第一次渲染的时候,我才会执行,我就是class组件的componentdidmount');
        }, [])
    
        useEffect(() => {
            console.log('只有count的值发生改变的时候我才会执行');
        }, [count])
    
        const countText = useMemo(() => {
            return '我是count的值:' + count
        }, [count])
    
        const countAdd = useMemo(() => {
            return () => setCount(count + 1);
        }, [count])
    
        return(
            <>
                <button onClick={countAdd}>
                    {count}
                </button>
                {countText}
            </>
        )
    }
    
    export default Demo;
    

    4、useCallback

    import  React, { useState, useEffect, useMemo, useCallback } from 'react';
    
    const Demo = () => {
        const [count, setCount] = useState();
    
        useEffect(() => {
            console.log('每次组件渲染的时候,我都会执行,我就是class组件的render')
        })
    
        useEffect(() => {
            console.log('组件第一次渲染的时候,我才会执行,我就是class组件的componentdidmount');
        }, [])
    
        useEffect(() => {
            console.log('只有count的值发生改变的时候我才会执行');
        }, [count])
    
        const countText = useMemo(() => {
            return '我是count的值:' + count
        }, [count])
    
        const countAdd = useMemo(() => {
            return () => setCount(count + 1);
        }, [count])
    
        const countAdd2 = useCallback(() => {
            setCount(count + 1);
        }, [count])
    
        return(
            <>
                <button onClick={countAdd}>
                    {count}
                </button>
                <button onClick={countAdd2}>
                    test
                </button>
                {countText}
            </>
        )
    }
    
    export default Demo;
    

    5、useImperativeHandle
    将组件内部的方法暴露出来

    1)父组件

    import React, { useRef } from 'react';
    import Child from './index.jsx';
    const Parents = (props, ref) => {
        const cRef = useRef();
        return (
            <>
                <button onClick={() => {
                    console.log(cRef.current.getData());
                }}>
                    获取子组件的状态数据
                </button>
                <Child 
                    ref={cRef}
                />
            </>
        )
    }
    
    export default Parents; 
    

    2)子组件

    import  React, { useState, useEffect, useMemo, useCallback, useImperativeHandle, forwardRef } from 'react';
    
    const Demo = (props, ref) => {
        const [count, setCount] = useState();
    
        useEffect(() => {
            console.log('每次组件渲染的时候,我都会执行,我就是class组件的render')
        })
    
        useEffect(() => {
            console.log('组件第一次渲染的时候,我才会执行,我就是class组件的componentdidmount');
        }, [])
    
        useEffect(() => {
            console.log('只有count的值发生改变的时候我才会执行');
        }, [count])
    
        const countText = useMemo(() => {
            return '我是count的值:' + count
        }, [count])
    
        const countAdd = useMemo(() => {
            return () => setCount(count + 1);
        }, [count])
    
        const countAdd2 = useCallback(() => {
            setCount(count + 1);
        }, [count])
    
        useImperativeHandle(ref, () => ({
            getData: () => {
                return { count }
            },
        }));
    
        return(
            <>
                <button onClick={countAdd}>
                    {count}
                </button>
                <button onClick={countAdd2}>
                    test
                </button>
                {countText}
            </>
        )
    }
    
    export default forwardRef(Demo);
  • 相关阅读:
    Oracle11g聚合函数
    和为S的连续正数数列,动态规划,C++
    统计一个数组在排序数组中出现的次数,C++,二分查找
    寻找两个链表的第一个公共子节点,C++
    二维数组中的查找
    数组中的逆序对,C++,分治算法
    得到从小到大的第N个丑数的三种方式(C++)一维动态规划
    连续字数组的最大和(Java)一个int数组,求其中的最大的连续数的和
    n个整数,求这中间最小的k个整数(Java)
    两个字符串的最长公共子串求法(C++、动态规划)
  • 原文地址:https://www.cnblogs.com/windseek/p/12987563.html
Copyright © 2011-2022 走看看