react大杀器-hooks

376 阅读4分钟

useState

useState是React的一个Hook,它是一个方法,可以传入值作为state的默认值,返回一个数组,数组的第一项是对应的状态(默认值会赋予状态),数组的第二项是更新状态的函数。

  • 实现一个加1的组件
    import React,{useState} from 'react';
    
    const UseState = () => {
      const  [count,setCount] = useState(1) // 1是初始值,setCount是设置count的方法
      const [istrue,setIstrue] = useState(true) // true 是初始值
      
      // 设置count
      const add = () => {
        setCount(count+1)
      }
      
      return (
        <>
        {/* 这里直接使用state */}
        {istrue ?<h1>{count}</h1>:'' }
          <button onClick={() => {setIstrue(!istrue)}}>change</button>
          // 第一种:函数直接写在dom中
          <button onClick={() => setCount(count + 1)}>+</button>
          // 第二种:函数写在add ,dom外
          <button onClick={add}>+</button>
        </>
      )
    }
    
    export default UseState;

useEffect

React Hooks 提供了 Effect Hook,可以在函数组件中执行副作用操作,并且是在函数渲染DOM完成后执行副作用操作

useEffect这个方法传入一个函数作为参数,在函数里面执行副作用代码,并且useEffec的第一个参数还支持返回值为一个函数,这个函数执行相当于组件更新和卸载。

  • 最常见的做法就是就是在函数参数中写事件注册,在函数的返回函数中写事件销毁
    import React,{useState,useEffect} from 'react';

    const UseEffect = () => {
        // React Hooks 提供了 Effect Hook,可以在函数组件中执行副作用操作,并且是在函数渲染DOM完成后执行副作用操作
        // useEffect这个方法传入一个函数作为参数,在函数里面执行副作用代码,并且useEffec的第一个参数还支持返回值为一个函数,这个函数执行相当于组件更新和卸载。
        
        // 最常见的做法就是就是在函数参数中写事件注册,在函数的返回函数中写事件销毁
        const [width,setWidth ] = useState(window.innerWidth)
        const resizeHandle = () => {
            setWidth(window.innerWidth)
        }
    
        useEffect(() => {
            // 相当于componentDidMount和componentDidUpdate
            window.addEventListener('resize',resizeHandle)
            // 相当于componentWillUnmount
            return () => {
                window.removeEventListener('resize',resizeHandle)
            }
        })
        return (
            <h1>{width}</h1>
        )
    }
    
    export default UseEffect;

当改变浏览器宽度的适合,width值会随之改变。

  • useEffect第二个参数效果

    • useEffect的第二个参数是一个数组,表示以来什么state和props来执行副作用。
    • 数组为空的时候,useEffect就相当于componentDidMoubt和componentWillUnmount这两个生命周期,只在首次渲染和卸载的时候执行
    • 当数组中值是状态的时候,就会只监听这一个状态的变化。当然数组中可以多个值,监听存放state的变化。
    import React,{useState,useEffect} from 'react';

    const UseEffect = () => {
        // useEffect的第二个参数,useEffect的第二个参数是一个数组,表示以来什么state和props来执行副作用。
        // 数组为空的时候,useEffect就相当于componentDidMoubt和componentWillUnmount这两个生命周期,只在首次渲染和卸载的时候执行
        // 当数组中值是状态的时候,就会只监听这一个状态的变化。当然数组中可以多个值,监听存放state的变化。
        const [count, setCount] = useState(1);
        const [num, setNum] = useState(2);
        useEffect(() => {
            console.log("count状态更新");
            return () => {
                console.log("useEffect卸载")
            }
        },[count])
        return (
            <>
                <h1>{count}</h1>
                <button onClick={() => {setCount(count + 1)}}>+</button>
                <h1>{num}</h1>
                <button onClick={() => {setNum(num + 1)}}>+</button>
            </>
        );
    }
    
    export default UseEffect;

从代码中看出useEffect的第二个参数是count,也就是当count变化的时候,console.log才会执行.

点击直接运行

  • 多个useEffect

React Hook 允许函数式组件中定义多个useEffect(和useState类似),多个useEffect互相不受干扰。

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

    const UseEffect = () => {
        // 写多个useEffect
        // React Hook 允许函数式组件中定义多个useEffect(和useState类似),多个useEffect互相不受干扰。
        const [count, setCount] = useState(1);
        const [num, setNum] = useState(2);
        useEffect(() => {
            console.log("count状态更新");
            return () => {
                console.log("count卸载")
            }
        },[count])
        useEffect(() => {
            console.log("num状态更新");
            return () => {
                console.log("num卸载")
            }
        },[num])
        return (
            <>
                <h1>{count}</h1>
                <button onClick={() => {setCount(count + 1)}}>+</button>
                <h1>{num}</h1>
                <button onClick={() => {setNum(num + 1)}}>+</button>
            </>
        );
        return (
            <>
                <h1>{count}</h1>
                <button onClick={() => {setCount(count + 1)}}>+</button>
                <h1>{num}</h1>
                <button onClick={() => {setNum(num + 1)}}>+</button>
            </>
        );
    }
    
    export default UseEffect;

点击直接运行