如何从子组件内部更新React Context?
我在上下文中有如下语言设置
class LanguageProvider extends Component { static childContextTypes = {
langConfig: PropTypes.object,
};
getChildContext() {
return { langConfig: 'en' };
}
render() {
return this.props.children;
}
}
export default LanguageProvider;
我的应用程序代码如下所示
<LanguageProvider> <App>
<MyPage />
</App>
</LanguageProvider>
我的页面具有切换语言的组件
<MyPage> <LanguageSwitcher/>
</MyPage>
LanguageSwitcher
在这种MyPage
情况下,需要更新上下文以将语言更改为“ jp”,如下所示
class LanguageSwitcher extends Component { static contextTypes = {
langConfig: PropTypes.object,
};
updateLanguage() {
//Here I need to update the langConfig to 'jp'
}
render() {
return <button onClick={this.updateLanguage}>Change Language</button>;
}
}
export default LanguageSwitcher;
如何从LanguageSwitcher组件内部更新上下文?
回答:
使用挂钩
挂钩是在16.8.0中引入的,因此以下代码要求最低版本为16.8.0(向下滚动以获得类组件示例)。CodeSandbox演示
回答:
首先,为了拥有可以传递给消费者的动态上下文,我将使用父级的状态。这样可以确保我拥有单一的真理来源。例如,我的父应用程序将如下所示:
const App = () => { const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
将language
被存储在状态。稍后,我们将通过上下文同时传递language
和setter函数setLanguage
。
回答:
接下来,我创建了这样的语言上下文:
// set the defaultsconst LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
在这里,我为language
(’en’)设置了默认值,并设置了一个setLanguage
将由上下文提供程序发送给使用者的函数。这些只是默认值,在父级中使用提供程序组件时,我将提供其值App
。
注意:LanguageContext
无论您是否保持相同
回答:
为了让语言切换器设置语言,它应该可以通过上下文访问语言设置器功能。它可能看起来像这样:
const LanguageSwitcher = () => { const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
在这里,我只是将语言设置为“ jp”,但是您可能有自己的逻辑来设置语言。
回答:
现在,我将在a中呈现语言切换器组件,LanguageContext.Provider
并将必须通过上下文发送的值传递到更深的任何级别。这是我父母的App
样子:
const App = () => { const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
<LanguageContext.Provider value={value}>
<h2>Current Language: {language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
};
现在,只要单击语言切换器,它就会动态更新上下文。
CodeSandbox演示
使用类组件
在React
16.3中引入了最新的上下文API,它提供了一种具有动态上下文的好方法。以下代码要求最低版本为16.3.0。CodeSandbox演示
回答:
首先,为了拥有可以传递给消费者的动态上下文,我将使用父级的状态。这样可以确保我拥有单一的真理来源。例如,我的父应用程序将如下所示:
class App extends Component { setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
将language
其与语言设置器方法一起存储在状态中,您可以将其保留在状态树之外。
回答:
接下来,我创建了这样的语言上下文:
// set the defaultsconst LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
在这里,我为language
(’en’)设置了默认值,并设置了一个setLanguage
将由上下文提供程序发送给使用者的函数。这些只是默认值,在父级中使用提供程序组件时,我将提供其值App
。
回答:
为了让语言切换器设置语言,它应该可以通过上下文访问语言设置器功能。它可能看起来像这样:
class LanguageSwitcher extends Component { render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
在这里,我只是将语言设置为“ jp”,但是您可能有自己的逻辑来设置语言。
回答:
现在,我将在a中呈现语言切换器组件,LanguageContext.Provider
并将必须通过上下文发送的值传递到更深的任何级别。这是我父母的App
样子:
class App extends Component { setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
render() {
return (
<LanguageContext.Provider value={this.state}>
<h2>Current Language: {this.state.language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
}
}
现在,只要单击语言切换器,它就会动态更新上下文。
CodeSandbox演示
以上是 如何从子组件内部更新React Context? 的全部内容, 来源链接: utcz.com/qa/434013.html