React Hooks

38 阅读2分钟

Hooks [16.8]

作用:给函数组件添加了生命周期和state

1.useState() 状态钩子

作用:给函数组件添加状态。

语法:

  import React, { useState } from 'react'
  const [name, setName] = useState('妲己')

注意:

 const del=(index)=>{
     arr.splice(index,1)
     // 注意:修改引用类型,需要赋值一个拷贝后的数据。
     setArr([...arr])
 }

2.hooks必须在函数组件中才能使用,而且函数组件的名字首字母要大写。

2.useEffect()  副作用钩子函数

作用:给函数组件添加生命周期。

语法:

 useEffect(()=>{
     return ()=>{}
 },[])

情景1: componentDidMount+componentDidUpdate(所有数据变了)

 useEffect(() => {
     console.log("该函数执行了");
     document.title = '你点击了' + n + "次"
 })

情景2:componentDidMount+componentDidUpdate(只有依赖的n变了)

 useEffect(() => {
     console.log("该函数执行了");
     document.title = '你点击了' + n + "次"
 },[n])

情景3:componentDidMount

 useEffect(() => {
     console.log("该函数执行了");
     document.title = '你点击了' + n + "次"
 
 },[])

情景4:componentDidMount+componentWillUnmount

  useEffect(()=>{
         console.log("加载完成");
         let time=setInterval(()=>{
             setDate(new Date())
         },1000)
 
         //return 的函数就是componentWillUnmount
         return ()=>{
             console.log("销毁之前");
             clearInterval(time)
         }
     },[])

3.useReducer() action钩子函数

场景:如果一个组件状态很多,我们希望在组件之外管理状态,那么就需要useReducer.

reducer.js

export const initState = {
    name: "妲己",
    age: 20,
   
}

//修改state 
export const reducer = (state, action) => {
    switch (action.type) {
        case "changeName":
            //action={type:"changeName",name:'貂蝉'}
            return {
                ...state,
                name: action.name
            }
            break;
        case "changeAge":
            //action={type:"changeAge",age:200}
            return {
                ...state,
                age: action.age
            }
            break;
       
        default:
            return state;
    }
}

组件内通过useReducer() 初始化state和dispatch

import React, { useReducer } from 'react'
import { initState, reducer } from "./reducer"
const [state, dispatch] = useReducer(reducer, initState)

4.useContext() 共享钩子函数

场景:父组件有数据给后代的子组件,如果不用useContext(),我们需要父传子,子传子的子组件,一直下传递,不方便。如果使用useContext(),那么可以直接在父组件传递,子组件的子组件直接接收。

父组件

import React, { useState } from 'react'
import Child from './Child'
// 1.创建一个Context对象
export const MyContext = React.createContext()
export default function Context() {
    const [name, setName] = useState('妲己')
    const [age, setAge] = useState(20)
    const [num, setNum] = useState(0)
    return (
        <div className='box'>
            <h3>useContext</h3>
            <button onClick={()=>setName('貂蝉')}>貂蝉</button>
            {/* 2.传递数据  */}
            <MyContext.Provider value={{ name: nameage: agenum: num }}>
                <Child></Child>
            </MyContext.Provider>

        </div>
    )
}

子组件:什么都没有做

import React from 'react'
import ChildChild from './ChildChild'

export default function Child() {
    return (
        <div className='box'>
            <h3>child</h3>
            <ChildChild ></ChildChild>
        </div>
    )
}

子组件的子组件:接收数据

import React, { useContext } from 'react'
// 3.引入MyContext 
import { MyContext } from "./Context"
export default function ChildChild(props) {
    // 4.通过useContext 取出数据 
    const {name,age,num} = useContext(MyContext)
   
    return (
        <div className='box'>
            <h3>子组件的子组件</h3>
            <div>name:{name}</div>
            <div>age:{age}</div>
            <div>num:{num}</div>
        </div>
    )
}