【问题标题】:Redux Alternative [closed]Redux 替代方案 [关闭]
【发布时间】:2017-03-23 21:56:43
【问题描述】:

我最近开始学习 React,很快就遇到了一个充满函数和状态的臃肿父组件的问题。一开始我看的是 Flux,然后我看的是 Redux,但两者似乎都是非常霸道的解决方案。

我想知道为什么没有这样做:

//EventPropagator.js
let EventPropagator = {
    registerListener(listenerObject){
        if (this.listeners == null)
            this.listeners = []
        this.listeners.push(listenerObject)
    },
    fireEvent(eventObject){
        let listenerList = this.listeners.filter(function(listener){
            return listener.eventType === eventObject.eventType
        })
        listenerList.forEach((listener) => {
            listener.callback(eventObject.payload)
        })
    }
}
export default EventPropagator

要使用:组件只需registerListenerfireEvent

//main.js
import EventPropagator from './events/EventPropagator'

EventPropagator.registerListener({
    "eventType": "carry_coconut",
    "callback": (payload) => {
        // actually carry coconut
        this.setState({"swallow_type": payload.swallow})
        console.log(payload)
    }
})
EventPropagator.fireEvent({
    "eventType": "carry_coconut",
    "payload": { "swallow": "african" }
})

这将允许大量的解耦,并且可以通过此类事件轻松传递状态。这种方法有什么缺点?

【问题讨论】:

  • Jumpstate 看起来不错 github.com/jumpsuit/jumpstate.
  • 这种方法可以解决跨组件通信的问题,但是你仍然需要在本地管理每个组件数据,在state。除了 action 和 reducer,redux 也有帮助,所以你不必考虑本地状态,以及如何在(可能很多)组件之间保持同步。
  • 你可以试试rootzjs.org

标签: javascript events reactjs redux


【解决方案1】:

PullState我真的希望这个失败者闪耀。尝试了其他类似的承诺快速且无样板的方法,没有一个接近 PullState 的易用性。我刚刚阅读了文档的第一页并在我的一个页面中实现了它,它就起作用了。如果您已经在 react 中使用了函数式组件,这很容易理解。

【讨论】:

  • Hookstate (hookstate.js.org) 不仅接近,而且在 API 简单性、功能集和性能方面都超越了。免责声明:我是该项目的维护者。
【解决方案2】:

你应该试试Hookstate。它为localliftedglobal 状态提供了同样最简单的API。一流的打字稿。开发工具支持。可通过插件扩展。全面的文档。它具有状态使用跟踪功能和仅深度嵌套受影响组件的智能重新渲染。这使其成为large frequently changing states 最快的状态管理解决方案。免责声明:我是该项目的维护者。

【讨论】:

  • 我认为这是 Redux 的最佳替代方案,API 看起来简单直观。我必须为即将进行的项目在 hookstate 和 pullstate(另一个类似的状态管理包)之间做出决定。由于 logging.development 功能,我更喜欢你的。
  • 谢谢,我相信pullstate没有hookstate的很多特性,更不用说性能和lib大小了。
  • 我只是研究了更多。快速提问,你觉得easy-peasy.now.sh 怎么样?好评如潮。
  • 据我所知,它在 useStoreState 中使用了选择器函数。这比 hookstate 有点样板,而且速度较慢:Hookstate 提供的 O(n) 可扩展性 VS O(1)(在此处阅读更多内容:hookstate.js.org/docs/scoped-state#it-is-unique
【解决方案3】:

查看JetState 以使用 RxJS 进行状态管理。我为我的 Angular 项目编写了这个,后来将它修改为与 React 的钩子一起使用。

【讨论】:

    【解决方案4】:

    我遇到过类似的问题,有很多开关、外壳等... 我为自己创造了一些替代品,你可以看看: https://www.npmjs.com/package/micro-reducers

    【讨论】:

      【解决方案5】:

      我写了Reducs。它只有 25 行代码,不需要样板文件,而且……我有没有提到它只有 25 行代码? 我正在将它用于一个大项目,并且效果很好。有一个live example that uses lit-html and Reducs

      【讨论】:

        【解决方案6】:

        另一个适度的多商店选择是react-scopes

        这里有一些功能:

        • 简单的装饰器语法,
        • 允许直接在组件中定义独立的存储逻辑
        • 通过组件树轻松连接商店
        • 允许模板化复杂/异步数据处理
        • 具有异步数据的 SSR

        【讨论】:

          【解决方案7】:

          在钩子中有Reactn
          与 Redux 相比,它更易于使用几个数量级。 检查https://www.npmjs.com/package/reactn 并阅读Stover's blog

          【讨论】:

          • 最后我必须处理全局状态。因为我已经阅读了 Charles Stover 关于他的 ReactN 库的文章,所以我今天早上尝试了它,它按预期工作。在我的应用程序中,我需要登录用户的信息,这些信息将共享给所有模块/表单。 ReactN 解决了​​这个问题。感谢 Stover,他不仅为使用钩子的函数组件提供支持,还为基于类的组件提供支持。
          【解决方案8】:

          如果您想利用 Redux 的所有优势,请使用 Redux。

          如果您只想在 React 组件之间保持 var 同步,请使用 Duix。

          我是 Duix 的创造者。我已经使用了 1 年,终于在几个小时前发布了它。查看文档:https://www.npmjs.com/package/duix

          【讨论】:

            【解决方案9】:

            使用 EventPropagator 可以解决通信问题,但不能处理数据完整性。例如,如果有超过 2 个组件监听同一个事件,并使用该事件的有效负载来更新它们自己的状态。监听相同事件的组件越多,确保所有这些组件在它们自己的状态下具有相同的数据就越复杂。

            其次,Flux/Redux 提供单向数据流。一个简单的示例可能是大约 2 个组件 A 和 B,它们使用来自外部源(API 或存储)的相同数据 X。用户可以与其中任何一个交互以获取最新的 X 数据。现在,如果用户要求 B 更新 X,我们为您的 EventPropagator 提供了 2 个解决方案:

            1. B 将更新 X 自身,并触发一个事件以通知 A 更新以让 A 重新渲染。如果用户要求 A 更新 X,A 也是如此。这是双向数据流。
            2. B 将向 A 触发一个事件,要求更新 X,并等待 A 触发一个事件以获取更新的 X。如果用户要求 A 更新,A 将自行完成并通知 B .这是单向数据流。

            一旦您的组件数量变大并且通信不仅限于 A 和 B 之间,您可能只需要坚持使用上述 2 种解决方案中的一种,以避免您的应用程序逻辑失控。 Flux/Redux 选择了第二个,我们对此很满意。

            如果你真的不认为你需要另一个库来控制数据,你应该看看the newest feature of React: Context。它提供了数据控件库可以拥有的最重要的功能,而且它只是 React。请注意,您必须将项目的 React 版本更新到 16.3 才能使用此功能。

            【讨论】:

              【解决方案10】:

              https://github.com/deepakpatil84/pure-data 注意:我是本文的作者

              【讨论】:

                【解决方案11】:

                Redux 是 React 声明式编程风格的延续。将应用程序逻辑映射到组件的一种简单方法是使用 Backbone.React.Component 之类的东西,但使用 redux,您可以使用所有工具和中间件。在您的应用程序中也有无限的转换使调试更容易。现在,我同意无论如何你都需要大量的布线和样板。

                如果你想使用 redux,你可以看看 redux-auto 之类的东西

                Redux-auto:Redux 变得简单(采用即插即用的方法)

                在设置商店和操作时删除样板代码。为什么?此实用程序可让您在很短的时间内启动并运行 Rudux!

                你现在可以看到redux-auto: helloworld project

                【讨论】:

                • 也许添加一个免责声明它是你的项目。
                【解决方案12】:

                需要一个事件驱动系统,这样子组件就可以与其兄弟组件对话,但这并不意味着数据应该作为事件负载传递。这将导致一个没有治理的系统,并且对于多个开发人员正在开发的项目来说是一场噩梦。

                只要你遵循 Flux-like 架构模式(谷歌搜索),那么你实际上可以使用 javascript 和 Javascript 对象成功地做到这一点,将数据与事件系统一起保存。

                数据应被视为三种不同状态之一。要么是

                1. 从服务器提取的原始数据
                2. 转换后的数据(从原始数据转换而来)
                3. 存储数据。充当 UI 绑定的模型的对象

                如果您编写一个 javascript 库来处理三种状态之间的数据移动并处理转换,您可以使用事件系统来触发组件可以侦听和自动重新呈现的“存储更改”事件。

                【讨论】:

                  【解决方案13】:

                  你应该试试mobX

                  mobX 是一个状态管理库,它利用了decorators 的优势,成功地删除了不需要的代码。比如mobx中没有reducers的概念。

                  希望这会有所帮助!

                  【讨论】:

                  • 这看起来很有趣,但是学习曲线仍然比上面的要高得多,而且在我看来,你获得的收益并不多......不过感谢您提供的链接,我会看看它更详细!
                  猜你喜欢
                  • 2012-10-08
                  • 2010-10-11
                  • 2011-09-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-18
                  • 2010-11-22
                  • 2018-06-16
                  • 2014-08-25
                  相关资源
                  最近更新 更多