React钩子可以完全替代redux吗?

时间:2019-09-08 21:18:14

标签: javascript reactjs redux react-hooks

我正在学习反应钩子,到目前为止,我已经看到这是使反应“反应性”的一种方法,而这并不是在这个很酷的新事物之前。

我还尝试使用钩子在不同组件之间共享状态,并且当一个组件更改状态内的任何值时,其他组件将获取更新。因此,我想到了,可以将Redux或任何其他状态管理解决方案完全替换为react hooks吗?有什么利弊吗?

在尝试将基于Redux的应用迁移到挂钩之前,应该考虑什么?我不是大型第三方库的粉丝,如果我可以使用react可以提供的工具实现相同的目标,为什么不呢?

2 个答案:

答案 0 :(得分:4)

如果您仅基于避免使用prop-drill的需求来使用redux,那么反应上下文(是否使用钩子)就足够了。

但要回答您的问题:不。您完全可以单独使用上下文和钩子来实现dispatch actionget state的版本,而无需进行redux,但是redux可以为表提供的功能要比它们多。中间件,保持应用程序状态的能力,更容易的调试等。

如果您的应用并不需要redux可以提供的所有好处,请不要使用它。但是语句“上下文+钩子可以代替redux吗?” 是错误的。

答案 1 :(得分:0)

我发现这个模式可以复制我的 redux 用例(下面的代码)。

这个想法是,setValue 函数触发一个带有携带值的参数的事件,事件处理程序更新钩子的内部状态。

import { useState, useEffect } from 'react'

export function useValue(name, initial) {
  const [value, _setValue] = useState(initial)

  function setValue(value) {
    const evt = new CustomEvent(name, {detail: {value}})
    window.document.dispatchEvent(evt)
  }

  useEffect(() => {
    function handleEvent (evt) {
      _setValue(evt.detail.value)
      evt.stopPropagation()
    }
    window.document.addEventListener(name, handleEvent)
    return () => {
      window.document.removeEventListener(name, handleEvent)
    }
  }, [])

  return [value, setValue]
}