Нормально ли вызывать одно функциональное обновление из другого - составлять useState-s? - PullRequest
0 голосов
/ 20 июня 2020

Есть ли у этого типа set* вложения какие-либо недостатки?:

const [foo,setFoo] = useState(0)
const [bar,setBar] = useState([])
...{
   setFoo(lastFoo=>{
      if(lastFoo>0)
         setBar(lastBar=>{
            ...
            return [...lastBar,lastFoo]
         })
      return 0
   })
}

Это может быть полезно, когда useState -s являются частями пользовательских хуков, и мы можем получить красивую композицию хуков.

const handleBar = useBarSync() // with state
...
   setFoo(lastFoo=>{
      handleBar(lastFoo)
      return 0
   })

С другой стороны, сложным состоянием лучше всего управлять с помощью одиночного useState или useReducer, где обновление - atomi c и кажется более надежным.

const [state,setState] = useState({foo:0,bar:[]})
const handleBar = useBarSync() // no state
...
   setState(last=>{
      const foo = 0
      const bar = handleBar(last.foo)(last.bar)
      return ({foo,bar})
   })

Но одновременное использование как композиции-крючка, так и композиции состояний кажется многословным и менее читаемым.

...