2016-05-14 85 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對象。