javascript - React Native 中关于 Context API 的完整解释
问题描述
我对 Context API 的工作原理有点困惑
正如文档所说的Context Provider:
接受要传递给作为此 Provider 后代的消费组件的 value prop。一个提供者可以连接到多个消费者。可以嵌套提供程序以覆盖树中更深的值。
我刚开始尝试这样的简单代码:
//App.js
export default class App extends React.Component {
constructor(props) {
super(props);
this.changeColor=(color, value)=>{
this.setState({[color]:value})
}
this.state={
changeColor:this.changeColor,
red:0,
green:0,
blue:0,
}
}
render() {
console.disableYellowBox = true;
return (
<ThemeContext.Provider value={this.state}>
<InitialScreen/>
</ThemeContext.Provider>
);
}
}
//InitialScreen.js
export default class Login extends Component {
render() {
return (
<ThemeContext.Consumer>
{({red, green, blue, changeColor})=>(
<View style={{flex:1}}>
<View style={{flexDirection:'row', justifyContent:'space-between'}}>
<Text>Red: </Text>
<Slider
style={{width:'80%'}}
minimumValue={0}
maximumValue={255}
step={1}
value={red}
onValueChange={(e)=>{changeColor('red', e)}}
/>
</View>
<View style={{flexDirection:'row', justifyContent:'space-between'}}>
<Text>Green: </Text>
<Slider
style={{width:'80%'}}
minimumValue={0}
maximumValue={255}
step={1}
value={green}
onValueChange={(e)=>{changeColor('green', e)}}
/>
</View>
<View style={{flexDirection:'row', justifyContent:'space-between'}}>
<Text>Blue: </Text>
<Slider
style={{width:'80%'}}
minimumValue={0}
maximumValue={255}
step={1}
value={blue}
onValueChange={(e)=>{changeColor('blue', e)}}
/>
</View>
<View style={[GlobalStyles.Center, {flex:1, backgroundColor:'rgb('+red+', '+green+', '+blue+')'}]}>
</View>
</View>
)}
</ThemeContext.Consumer>
);
}
}
//themeContext.js
import React from 'react';
export const themes = {
light: {
foreground: '#000000',
background: '#eeeeee',
},
dark: {
foreground: '#ffffff',
background: '#222222',
},
};
export const ThemeContext = React.createContext({
theme: themes.dark,
toggleTheme: () => {},
})
我不知道Object
inside是什么意思React.createContext({...})
,我可以传入这意味着我不需要在 AFAIK 中定义任何this.state
东西,Provider value props
React.createContext({...})
或者我做错了什么,所以我Context
本身就没有功能了?
解决方案
你是绝对正确的,你不需要在 React.createContext 中提供任何东西来使用它。您在 createContext 中提供的数据只是默认值,稍后会在您设置 Context.Provider 时被覆盖。但是,我强烈建议您始终提供默认值,原因如下:
- 通过这样做,您可以提前考虑您的上下文将提供什么样的数据,从而帮助您更好地理解代码的结构。从长远来看,这个习惯会对你有所帮助
- 它为您使用的任何 IDE(例如 Visual Studio)提供了上下文数据的线索,并且在您编码时会提供更好的提示
推荐阅读
- c# - 使用 Rijndael 进行文件加密
- python - ndb.put_multi 是原子的吗?
- c# - 如何解决一段音频后的调用导致音频延迟?
- android - 我想下载 jdk windows 32 位
- android - 如何在片段附加到活动之前执行后台任务?
- javascript - 如何使用 JavaScript 创建自定义弹出窗口
- jquery - 如何使用 jQuery 从 HTML 节点中选择文本内容?
- reactjs - 模型打开正在工作,但关闭功能在反应 js 中不起作用
- php - 发送包含来自表单输入和数据库数据的混合数据的电子邮件
- java - .class 文件是字节码吗?或 .class 文件是否包含字节码?