#react-native #react-navigation
#react-native #реагировать-навигация
Вопрос:
Вот приложение App.js
React 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);
socket
Необходимо передать в Chat
компонент. Поскольку существует только компонент чата, использующий socket
, я хотел бы передать socket
в качестве реквизита вместо использования context
, который разделяет данные между многими компонентами. В идеале socket
можно передать следующим createStackNavigator
образом:
const navigator = createStackNavigator(
{
Event: Event,
Chat: {
screen: Chat, params: {socket: this.socket}
}
}, {
initialRouteName: "Event"
}
);
Как это сделать с React Native 0.59
помощью?
Ответ №1:
Самый простой способ, который я могу придумать, — создать новый компонент, который возвращает компонент чата и сокет в качестве опоры.
Пример
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);
Комментарии:
1. просто и в то же время эффективно!. Большое спасибо. Есть еще 2 реквизита для
Chat
вызова вEvent
компоненте.this.props.navigation.navigate("Chat", {eventId: id, user: this.state.user})
. Как добавить эти 2 где-нибудь в процессе для чата? Я могу передать сокет в событие, а затем передать его в чат. Но я бы хотел не трогать событие, если я могу сделать это с помощью чата.