将套接字传递给组件

use*_*363 1 react-native react-navigation

这是App.jsReact Native 0.59 应用程序的。

import React, {Component} from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import Event from './src/components/event/Event.js';
import Chat from './src/components/chat/Chat.js';
import GLOBAL from "../../lib/global";

//socket.io
const socket = io(GLOBAL.BASE_URL, {
  transports: ['websocket'],
  jsonp: false
});

//create the navigator
const navigator = createStackNavigator(
  {
    Event:  Event,
    Chat: {
      screen: Chat,
      
    } 
  }, {
    initialRouteName: "Event"
  }
);

//export it as the root component
export default createAppContainer(navigator); 
Run Code Online (Sandbox Code Playgroud)

socket需要被传递到Chat组件。由于只有 Chat 组件使用socket,我想socket作为道具传递,而不是使用contextwhich 在许多组件之间共享数据。理想情况下,socket可以createStackNavigator像这样传入:

const navigator = createStackNavigator(
  {
    Event:  Event,
    Chat: {
      screen: Chat, params: {socket: this.socket}            
    } 
  }, {
    initialRouteName: "Event"
  }
);
Run Code Online (Sandbox Code Playgroud)

如何做到这一点React Native 0.59

ben*_*nel 5

我能想到的最简单的方法是创建一个新组件,该组件将 Chat 组件和套接字作为道具返回。

例子

import React, {Component} from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import Event from './src/components/event/Event.js';
import Chat from './src/components/chat/Chat.js';
import GLOBAL from "../../lib/global";

//socket.io
const socket = io(GLOBAL.BASE_URL, {
  transports: ['websocket'],
  jsonp: false
});

const ChatWithSocket = () => (<Chat socket={socket} />)

//create the navigator
const navigator = createStackNavigator(
  {
    Event:  Event,
    Chat: {
      screen: ChatWithSocket,

    } 
  }, {
    initialRouteName: "Event"
  }
);

//export it as the root component
export default createAppContainer(navigator); 
Run Code Online (Sandbox Code Playgroud)