Как должен работать новый контекстный API с навигатором React Native? - PullRequest
0 голосов
/ 05 июля 2018

Я создал многоэкранное приложение, используя React Navigator, в следующем примере:

import {
  createStackNavigator,
} from 'react-navigation';

const App = createStackNavigator({
  Home: { screen: HomeScreen },
  Profile: { screen: ProfileScreen },
});

export default App;

Теперь я хотел бы добавить состояние глобальной конфигурации, используя новый встроенный контекст api , чтобы у меня были некоторые общие данные, которыми можно манипулировать и отображать их на нескольких экранах.

Проблема в том, что для контекста, очевидно, требуются компоненты, имеющие общий родительский компонент, так что контекст может передаваться дочерним компонентам.

Как я могу реализовать это с помощью экранов, которые, насколько мне известно, не имеют общего родителя, поскольку они управляются навигатором реакции?

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Если вам нужен подробный учебник, вы можете перейти по ссылке ниже: Посещение: https://www.thelearninguy.com/simple-react-native-context-api-detailed

Очень длинный ответ будет следующим:

import React, {Component} from 'react';
import {Text, View, Button} from 'react-native';

//make a new context
const MyContext = React.createContext();

//create provider component
class MyProvider extends Component {
    state = {
        name: "The Learnin Guy",
        age: 50
    };
    increaseAge = () => {
        this.setState({
            age: this.state.age + 1
        });
    };

    render() {
        return (
            <MyContext.Provider
                value={{
                    state: this.state,
                    increaseAge: this.increaseAge
                }}
            >
                {this.props.children}
            </MyContext.Provider>
        );
    }
}

class Person extends Component {
    render() {
        return (
            <View>
                <Text>This is Person Component</Text>
                <MyContext.Consumer>
                    {(context) => (
                        <React.Fragment>
                            <Text>Name: {context.state.age}</Text>
                            <Text>Age: {context.state.age}</Text>
                            <Button title="IncreaseAge" onPress={context.increaseAge} />
                        </React.Fragment>
                    )}
                </MyContext.Consumer>
            </View>
        );
    }
}

class Family extends Component {
    render() {
        return (
            <View>
                <Text>This is Family Component</Text>
                <MyContext.Consumer>
                    {(context) => (
                        <React.Fragment>
                            <Text>Age: {context.state.age}</Text>
                        </React.Fragment>
                    )}
                </MyContext.Consumer>
                <Person/>
            </View>
        );
    }
}

class App extends Component {
    render() {
        return (
            <MyProvider>
                <View>
                    <Text>This is App Component</Text>
                    <MyContext.Consumer>
                        {(context) => (
                            <React.Fragment>
                                <Text>Age: {context.state.age}</Text>
                            </React.Fragment>
                        )}
                    </MyContext.Consumer>
                    <Family/>
                </View>
            </MyProvider>
        );
    }
}

export default App;

Предоставлено - https://www.thelearninguy.com

0 голосов
/ 13 августа 2018

Вы можете сделать это так.

Создать новый файл: GlobalContext.js

import React from 'react';

const GlobalContext = React.createContext({});

export class GlobalContextProvider extends React.Component {
  state = {
    isOnline: true
  }

  switchToOnline = () => {
    this.setState({ isOnline: true });
  }

  switchToOffline = () => {
    this.setState({ isOnline: false });
  }

  render () {
    return (
      <GlobalContext.Provider
        value={{
          ...this.state,
          switchToOnline: this.switchToOnline,
          switchToOffline: this.switchToOffline
        }}
      >
        {this.props.children}
      </GlobalContext.Provider>
    )
  }
}

// create the consumer as higher order component
export const withGlobalContext = ChildComponent => props => (
  <GlobalContext.Consumer>
    {
      context => <ChildComponent {...props} global={context}  />
    }
  </GlobalContext.Consumer>
);

Вкл. index.js Оберните ваш корневой компонент компонентом контекста.

<GlobalContextProvider>
  <App />
</GlobalContextProvider>

Затем на вашем экране HomeScreen.js используйте потребительский компонент, как этот.

import React from 'react';
import { View, Text } from 'react-native';
import { withGlobalContext } from './GlobalContext';

class HomeScreen extends React.Component {
  render () {
    return (
      <View>
        <Text>Is online: {this.props.global.isOnline}</Text>
      </View>
    )
  }
}

export default withGlobalContext(HomeScreen);

Вы также можете создать несколько провайдеров контекста, чтобы разделить ваши проблемы, и использовать потребителя HOC на нужном экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...