Доступ к контексту в React Native

#react-native #use-context

#react-native #использование-context

Вопрос:

в react native у меня есть следующие файлы:

App.js

 import { StyleSheet, Text, View } from 'react-native';
import Children from './Child';
import { MyProvider } from './context/Context';
import React from 'react';

const App = () => {
  return (
    <MyProvider>
      <View style={styles.container}>
        <Children />
        <StatusBar style="auto" />
      </View>
    </MyProvider>
  );
};

export default App;
 

Child.js

 import React from 'react';
import { View, Text, Button } from 'react-native';
import { useMain } from './context/Context';

const Child = () => {
  const { dummy, setDummy } = useMain();
  const onPressLearnMore = () => {
    setDummy('c');
  };
  return (
    <View>
      <Text>This children {dummy}</Text>
      <Button onPress={onPressLearnMore} title="click" />
    </View>
  );
};

export default Child;
 

Context.js

 import React, { useContext, useEffect, useState } from 'react';
export const mainContext = React.createContext();

export function useMain() {
  return useContext(mainContext);
}
export function MyProvider({ children }) {
  const [dummy, setDummy] = useState('a');
  useEffect(() => {
    setDummy('b');
  }, []);
  function doNull() {
    console.log('do null');
  }
  const value = {
    dummy,
    setDummy,
  };
  return <mainContext.Provider value={value}>{children}</mainContext.Provider>;
}
 

Все работает, как и ожидалось, дочерний компонент может получить доступ к {dummy} и { setDummy }, так что я могу поместить все мои «общие» функции, состояния и так далее в контекст, который будет использоваться отовсюду.
Мне просто было интересно, смогу ли я получить к ним доступ в App.js тоже без кодирования другого компонента; это выглядит, если я импортирую

 import { useMain } from './context/Context';
 

и затем я добавляю это

 const { dummy, setDummy } = useMain();
 

для моего приложения это не работает, поэтому я думаю, что я могу получить доступ к вещам только из контекста только в дочернем, но первое представление тоже дочернее!

Должен ли я создавать новый компонент, если мне нужен доступ к контексту, или к нему можно получить доступ и с уровня MyProvider?

Ответ №1:

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

 import { StyleSheet, Text, View } from 'react-native';
import Children from './Child';
import { MyProvider, useMain } from './context/Context';
import React from 'react';

const Container = () => {
  const { dummy, setDummy } = useMain();

  return (
    <View style={styles.container}>
      <Children />
      <StatusBar style="auto" />
    </View>
  )
}

const App = () => {
  return (
    <MyProvider>
      <Container />
    </MyProvider>
  );
};

export default App;
 

Комментарии:

1. Отлично! спасибо за ваше подтверждение, это было то, что я предполагал