在 React Native 中访问上下文
Accessing Context in 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>;
}
一切都按预期工作,Children 组件可以访问 { dummy } 和 { setDummy },这样我就可以将我所有的“共享”功能、状态等放在 Context 中,以便在任何地方使用。
我只是想知道我是否也可以在 App.js 中访问它们而无需编写另一个组件;看起来我是否导入
import { useMain } from './context/Context';
然后我添加这个
const { dummy, setDummy } = useMain();
对于我的应用程序,它不起作用,所以我想我只能在 child 中从上下文访问内容,但第一个视图也是 child!
如果我需要访问 Context 是否应该创建一个新组件,或者也可以从 MyProvider 级别访问它?
第一个视图确实是您的提供者的子视图,但 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;
在本机反应中我有以下文件:
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>;
}
一切都按预期工作,Children 组件可以访问 { dummy } 和 { setDummy },这样我就可以将我所有的“共享”功能、状态等放在 Context 中,以便在任何地方使用。 我只是想知道我是否也可以在 App.js 中访问它们而无需编写另一个组件;看起来我是否导入
import { useMain } from './context/Context';
然后我添加这个
const { dummy, setDummy } = useMain();
对于我的应用程序,它不起作用,所以我想我只能在 child 中从上下文访问内容,但第一个视图也是 child!
如果我需要访问 Context 是否应该创建一个新组件,或者也可以从 MyProvider 级别访问它?
第一个视图确实是您的提供者的子视图,但 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;