Come creare un hook personalizzato che riceve le dipendenze?


10

Sto realizzando un hook personalizzato che ha un toogle quando alcuni stati cambiano.

Dovresti essere in grado di passare qualsiasi stato in un array.

import { useState, useEffect } from 'react'

const useFlatListUpdate = (dependencies = []) => {
    const [toggle, setToggle] = useState(false)

    useEffect(() => {
        setToggle(t => !t)
    }, [...dependencies])

    return toggle
}

export default useFlatListUpdate

E dovrebbe essere usato come

const toggleFlatList = useFlatListUpdate([search, selectedField /*, anything */])

Ma mi dà il seguente avvertimento

React Hook useEffect ha un elemento spread nel suo array di dipendenze. Ciò significa che non possiamo verificare staticamente se hai superato le dipendenze.eslint corrette (reazioni-hook / esaustivi-deps)

Ho anche un'altra situazione in cui non funziona

const useFlatListUpdate = (dependencies = []) => {
    const [toggle, setToggle] = useState(false)

    useEffect(() => {
        setToggle(t => !t)
    }, dependencies)

    return toggle
}

Questo mi dà l'avvertimento

React Hook useEffect ha ricevuto un elenco di dipendenze che non è un array letterale. Ciò significa che non possiamo verificare staticamente se hai superato le dipendenze.eslint corrette (reazioni-hook / esaustivi-deps)

Come posso farlo funzionare senza preavviso e senza disabilitare eslint?


Hai ragione. La mia risposta è completamente sbagliata. L'ho eliminato per non confondere ulteriormente te e gli altri. Mi scuso 🙏
dance2die,

@ dance2die La tua risposta non è sbagliata, ma ha appena dato un altro tipo di avvertimento.
Vencovsky,

1
Grazie per le gentili parole.
Neanche

per il tuo secondo esempio, inserisci le dipendenze in un array:useEffect(() => { setToggle(t => !t) }, [dependencies])
Jon B,

Risposte:


0

L'uso dell'elenco delle dipendenze è molto singolare in questo caso.
Non vedo altro modo se non ignorare o mettere a tacere l'avvertimento.

Per mettere a tacere l'avvertimento, non è necessario disabilitare eslintcompletamente.
È possibile disabilitare questa regola specifica per questa riga specifica:

const useFlatListUpdate = (dependencies = []) => {
    const [toggle, setToggle] = useState(false)

    /* eslint-disable react-hooks/exhaustive-deps */
    useEffect(() => {
        setToggle(t => !t)
    }, [...dependencies])

    return toggle
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.