Explication détaillée des Hooks dans React

1. Vue d'ensemble

Texte original du site officiel de React : Les hooks  sont une nouvelle proposition de fonctionnalités qui vous permet d'utiliser l'état et d'autres fonctionnalités de React sans écrire de classes.

J'ai résumé les raisons d'utiliser Hooks :

1. Résolvez la hiérarchie complexe du code dans les classes.

2. Le cycle de vie d’une classe est complexe.

3. En raison des exigences de travail, les composants sans état sont remplacés par des composants avec état. Le coût de leur conversion en composants de classe est relativement élevé.

2.useState (enregistrer l'état du composant) 

const [state, setState] = useState(initialState)//Modifiez la syntaxe en affectation structurée ES6.
state stocke les données, setState est une méthode pour modifier les données et initialState est la valeur initiale de state.

Explication complémentaire : useState est toujours un composant mémoire et n'est initialisé qu'une seule fois lors de la création du composant, ce qui garantit que la valeur modifiée à chaque fois pourra être sauvegardée. L'exemple de code effectue un simple changement de nom, et la logique est relativement simple et peut être directement codée :

import React, { useState } from 'react'

export default function App() {
    const [name,setName]=useState('张三')
  return (
    <div>App-{name}
    <button onClick={()=>{
        setName('李四') //把name张三修改成了李四
        console.log(name);
    }}>修改</button>
    </div>
  )
}

3.useEffect (gestion des effets secondaires )

Commençons par comprendre ce que sont les effets secondaires. Les effets secondaires signifient que le comportement d’une fonction ou d’une expression dépend du monde extérieur.

Syntaxe : useEffect(()=>{},[]); Deux paramètres : un paramètre et une fonction pour mettre la logique à traiter, comme les requêtes réseau ou le traitement logique. Tableau du paramètre 2 : état dépendant ; un tableau vide signifie aucune dépendance. Si un tableau vide est transmis, cela signifie qu'il ne sera exécuté qu'une seule fois. Si un état de dépendance est transmis, la fonction qui modifie uniquement l'état dépendant sera exécutée une fois.

Notes supplémentaires : useEffect ne sera pas appelé tant que la page entière n'est pas rendue, ce qui est similaire au cycle de vie des composants de classe, mais pas exactement le même. L'exemple de code effectue une simple requête réseau :

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

export default function App() {
    const [list, setList] = useState([])
    useEffect(() => {
        axios({
            method: 'get',
            url: 'move.json'
        }).then(res => {
            console.log(res.data.data);
            setList(res.data.data.films)
        })
    },
        [])//传空数组,表示不依赖任何东西
    return (
        <div>
            <ul>
                {list.map(item => <li key={item.filmId}>{item.name}</li>)}
            </ul>
        </div>
    )
}

La méthode de suppression useEffect, par exemple, si vous définissez une minuterie dans la méthode de rappel useEffect, elle doit être détruite lorsque le composant disparaît. Code vers le haut

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

export default function App() {
  const [show, setShow] = useState(true)
  return (
    <div>
      <button onClick={() => {
        setShow(false)
      }}>销毁</button>
      {show ? <Child></Child> : ""}
    </div>
  )
}
function Child() {
  let timer = null
  const [name, setName] = useState('张三')
  useEffect(() => {
    console.log(name);
    timer = setInterval(() => {
      console.log('定时器');


    }, 1000)
    //销毁是执行一次,依赖更新一次也会执行一次。
    return () => {
      clearInterval(timer)
      timer = null
      console.log('xiaohui');
    }
  }, [name])
  return (
    <div><button onClick={() => {
      setName('李四')
    }}>Child</button></div>
  )
}

4. useCallback ( fonction mémoire )

useCallback(()=>{},[]); Cette méthode renvoie une méthode de fonction. Premier paramètre : fonction de rappel. Paramètre deux : statut de dépendance ; un tableau vide signifie aucune dépendance. Si un tableau vide est transmis, indique qu'il ne sera exécuté qu'une seule fois. Si l'état de dépendance est transmis, la fonction qui modifie uniquement l'état de dépendance sera exécutée une fois et la fonction mise à jour sera renvoyée.

import React, { useCallback, useState } from 'react'

export default function App() {
    const [name,setName]=useState('张三')
    let sum=0;
    console.log(sum);
    const handleAdd=useCallback(()=>{
        console.log(sum++);
        setName('lisi'+sum)

    },[])
   //只有name改变后, 这个函数才会重新声明一次,
   //如果传入空数组, 那么就是第一次创建后就被缓存, 如果name后期改变了,拿到的还是老的name。
   //如果不传第二个参数,每次都会重新声明一次,拿到的就是最新的name
  return (
    <div>
        app-{name}
        <button onClick={ handleAdd}>anniu </button></div>
  )
}

5. utilisez Mémo

L'utilisation de useMemo et useCallback est très similaire. useCallback n'exécutera pas la première fonction paramètre, mais vous la renverra, tandis que useMemo exécutera la première fonction et vous renverra le résultat de l'exécution de la fonction.

Téléchargez directement le code

import React, { useMemo, useState } from 'react'

export default function App() {
    const [name, setName] = useState('xiaoming')
    const handleName = useMemo(() => name.toLocaleUpperCase(), [name])
    return (
        <div>App-{handleName}
        <button onClick={()=>{
            setName('lisi')
        }}>gaibian</button>
        </div>
    )
}

6.useRef

useRef lie le DOM ou les composants et peut également enregistrer des valeurs. useRef a également une fonction de mémoire.

Téléchargez directement le code

import React, { useRef } from 'react'

export default function App() {
    //绑定dom或者组件
    const ref = useRef()
    //useref保存值
    const myCount=useRef(0)

    return (
        <div>
            <input ref={ref}></input>
            <button onClick={() => {
                console.log(ref.current.value);
                ref.current.value = '';
                myCount.current++;
                console.log(myCount.current);
            }}>按钮</button>

        </div>
    )
}

7.useContext

Les composants parents transmettent des valeurs aux composants enfants. C’est relativement simple et direct à coder.

import React, { useContext } from 'react'
const Context =React.createContext()
export default function App() {
  return (
    <Context.Provider 
    value={
   
   {name:'lisi'}}>
         <div>
        <Ietm></Ietm>
    </div>
    </Context.Provider>
   
  )
}

function Ietm(){
    const value=useContext(Context)
    return (
        <div>ietm-{value.name}</div>
    )
}

8.useRéducteur

Remarque : const [state, dispatch] = useReducer(reducer, initialState);

Alternative à useState. Accepte  (state, action) => newState un réducteur de type et renvoie  dispatch l'état actuel associé à la méthode. (Si vous connaissez Redux, vous savez déjà comment cela fonctionne.), principalement en extrayant les méthodes de modification d'état.

UseReducer est utilisé en combinaison avec useContext à chaque étape, ce qui peut réduire le niveau de code. Téléchargez directement le code

import React, { useContext, useReducer } from 'react'
//preState 老状态  action改变的类型
function reducer(preState, action) {
    let newSate = { ...preState };
    switch (action.type) {
        case "add":
            newSate.count++
            return newSate;
        case "sub":
            newSate.count--
            return newSate;
    }

    return preState;

}
const initialState = {
    count: 0
}
const Context = React.createContext()
export default function App() {
    const [state, dispatch] = useReducer(reducer, initialState)
    return (
        <Context.Provider value={
   
   { state, dispatch }}>
            <div>
                <Child></Child>
            </div>
        </Context.Provider>
    )
}
function Child() {
    const { state, dispatch } = useContext(Context)
    return (
        <div>
            计数器:{state.count}
            <div>
                <button
                    onClick={() => {
                        dispatch({ type: "add" })
                    }}
                >+</button>
                <button
                    onClick={() => {
                        dispatch({ type: "sub" })
                    }}
                >-</button>
            </div>
        </div>

    )
}

9. Construisez vos propres crochets

Doit commencer par "use" . Cet accord est très important. Si vous ne le suivez pas, React ne pourra pas vérifier automatiquement si votre Hook viole les règles du Hook car il ne peut pas déterminer si une fonction contient un appel à ses Hooks internes .
Lorsque nous voulons partager la logique entre deux fonctions JavaScript, nous extrayons la logique partagée vers une troisième fonction. Les composants et les hooks sont tous deux des fonctions, donc cette approche fonctionne également pour eux ! Code vers le haut
import React, { useEffect, useState } from 'react'
function useToLocaleUpperCase(text) {
    const [name, setName] = useState(text)
    useEffect(() => {
        setName(name.toLocaleUpperCase())
    }, [])
    return { name };
}
export default function App() {
    const { name } = useToLocaleUpperCase('zhansan')

    return (
        <div>App-{name}
            <Child></Child>
        </div>
    )
}
function Child() {
    const { name } = useToLocaleUpperCase('lisi')
    return (
        <div>App-{name}</div>
    )
}

J'espère que cet article sera utile à vous qui apprenez React.

Je suppose que tu aimes

Origine blog.csdn.net/u012941592/article/details/127606749
conseillé
Classement