2016-11-09 51 views
8

我最近开始学习React,并且很快遇到了一个充满函数和状态的臃肿父组件的问题。起初,我看着Flux,然后我看着Redux,但都觉得真的很霸道。Redux Alternative

我很奇怪,为什么这样的事情没有完成:

//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" } 
}) 

这将使大量的去耦和状态可能的很容易被这种事件传递。这种方法有什么缺点?

+0

Jumpstate看起来不错https://github.com/jumpsuit/jumpstate。 – imns

+0

这种方法可以解决跨组件通信的问题,但是您仍然需要在'state'中本地管理每个组件数据。除了动作和缩减器之外,redux也有帮助,所以您不必考虑本地状态,以及如何保持它(可能是很多)组件之间的同步。 –

回答

2

你应该尝试mobX

mobX是一个状态管理库,注意到decorators的优势,成功地消除不必要的代码。例如,mobx中没有reducers的概念。

希望这会有所帮助!

+0

这看起来很有趣,但仍有比上述更高的学习曲线,它并不像我看起来好像你获得很多......感谢链接,但我会更详细地看看它! – jcuenod

1

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

只要你遵循flux-like架构模式(谷歌它),那么你实际上可以做到这一点,只需javascript和Javascript对象来保存数据以及事件系统。

应将数据视为三种不同状态之一。这是从服务器

  • 转换后的数据(从原来的转化)
  • 存储数据或者

    1. 原始数据拉。那作为UI绑定的模型

    如果您编写一个JavaScript库来处理三种状态之间的数据移动并处理转换,您可以使用事件系统来激活“存储改变了“组件可以收听和自我再现的事件。

  • 1

    Redux是React声明式编程风格的延续。将应用程序逻辑映射到组件的一种简单方法是使用Backbone.React.Component之类的东西,但使用redux,可让您使用所有工具&中间件。在你的应用程序中也有无限的转换,使调试变得更容易。现在,我同意你需要很多配线&样板才能拿到。

    如果你想使用终极版,你可以看看像redux-auto

    终极版 - 汽车:终极版轻松(有即插即用的方式)

    取出样板代码中设置一个商店&的行动。为什么?此实用程序允许您在很短的时间内启动并运行Rudux!

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

    +1

    也许增加一个免责声明,这是你的项目。 – jcuenod