2017-06-29 25 views
2

我正在使用react-native和socket.io創建應用程序。一旦使用io.connect(...)與socket.io連接,我需要使用可以在任何組件中使用的套接字客戶端保存一個變量。更好的方法在反應本機組件之間共享變量

但問題是:

1 - 我使用的反應導航,這樣我就可以不通過從組件的屬性,因爲連接沒有在導航根製成,它被一個孩子裏面做出屏幕

2 - I不能通過如使用this.props.navigation.navigate(route, {socketIo})導航參數,因爲它是一個圓形的對象,並且JSON.stringify內部反應導航模塊拋出試圖處理數據

3的錯誤 - 我無法創建模塊並將其導入其他文件,一旦它將生成多個連接

這解決了我的問題的解決方法是設置一個全局變量是這樣的:

global.socket = io.connect(...)

不過,雖然谷歌上搜索,我發現很多人說這是不是一個好方法。有沒有更好的方法來解決這個問題?

回答

4

在反應本機應用程序中共享變量和方法是一種特殊情況,因爲您需要共享一個套接字與私有方法的連接以發出和接收事件,而不是僅共享變量。

在這種情況下,Redux是不夠的。我通過使用新的StackNavigator創建導航器容器,處理套接字連接和此容器中的事件並通過Redux管理操作來解決此問題。例如:如果您需要在某個屏幕上分派事件,則可以使用Redux發送該事件並在SocketContainer中偵聽,然後執行IO操作。

此外,我創建了一個Polyfill,因爲React Native中的套接字實現有userAgent錯誤。你可以在this article瞭解更多。

我的實施的完整示例可以是found here

+1

感謝您的回答。使用組件是一個好主意,對我來說工作得很好 –

0

這看起來像是一個用於redux的用例。 Redux允許您在所有組件之間共享數據。