2016-05-14 109 views
7

我建立一个反应,和/终极版应用程序,需要一个全局对象(LIB的WebSocket实例)。我最初试图将其存储在Redux状态树中,但是,该实例不是不可变的,并且在开发过程中引发了大量热重载问题(从编译代码运行时不存在的大量循环引用错误)。存储“全局”对象终极版之外的存储反应,和/终极版应用

我的问题是如何存储/所以它是提供给我Redux的代码创建这个实例和反应的组分?我可以在组件树的顶部创建它,并将其作为道具传递给树,但在使用react-redux connect完成所有事情后,感觉非常“肮脏”。

有没有更好的方法来做到这一点?

回答

12

终极版咚,通过gaeron创作,他谁终极版创作,因为2.1.0允许你做:

const store = createStore(
    reducer, 
    applyMiddleware(thunk.withExtraArgument(api)) 
) 

// later 
function fetchUser(id) { 
    return (dispatch, getState, api) => { 
    // you can use api here 
    } 
} 

这是直接从文档,请参阅下面的链接了解更多信息:

https://github.com/gaearon/redux-thunk

9

@如果你使用的thunk sheeldotme的答案将工作做好。

还要记住的是,根据LIB你使用WebSocket的,你可能不需要的实例作为一个全局变量。例如,对于socket.io-client,在最初的io(url)调用使websocket连接之后,对io(url)(具有相同url参数)的任何后续调用将从内存中返回相同的连接(即socket对象),而无需重新连接。它可以很容易地获得一个API,您可以简单地使用import/require,而不必传递该实例或使其成为全局实例。有关更多信息,请参阅socket.io docs

例如:

socket.js

import io from 'socket.io-client' 
const socket = io(`${protocol}//${hostname}:${port}`) 
export default socket 

现在,你可以简单地import/requiresocket.js文件具有随时随地轻松访问相同的Socket对象。