我需要向网站添加语言更改,我使用了上下文api,但是当我使用Provider传递状态时,它没有返回任何内容
LocalSwitch位置:src / components / LocalSwitch / LocalSwitch
首页位置:src / pages / Home / Home.js
LocaleSwitch.js
export const Context = React.createContext(require('../../locales/eng.json'))
class LocaleSwitch extends Component {
state = {
locale:{}
}
_update = lang =>{
this.setState({
locale:require(`../../locales/${lang}.json`),
}, ()=>{console.log(`${lang}`) })
}
render = ()=> {
const {Provider} = Context;
return (
<Provider value={this.state}>
<Wrapper>
{icons.map(icon=>(
<img
key={icon}
src= {require(`../../assets/${icon}.png`)}
alt= {icon}
className="locale"
onClick={()=> this._update(icon)}
/>
))}
</Wrapper>
</Provider>
);
}
}
Home.js
import {Context} from "../../components/LocaleSwitch/LocaleSwitch";
class Home extends Component {
state = {
locale:{}
}
render = ()=> {
const {Consumer} = Context;
return (
<Consumer>
{({locale})=>(
<Wrapper>
<Header>
<Hero id="hero"/>
<HeaderTitle id="title">
{locale.titleP1} <br/> {locale.titleP2}
<p>{locale.subtitle}<br/>{locale.subtitle2}</p>
</HeaderTitle>
</Wrapper>
)}
</Consumer>
);
}
}
答案 0 :(得分:1)
在Home.js中,您似乎没有某个提供者作为消费者的父级。您可能希望将上下文提供程序包装在应用程序的根目录下。
在这种情况下,必须将Home组件呈现在LocaleSwitch组件内部。
尝试在Home.js中添加提供程序功能,您将明白我的意思。
const Locale = React.createContext('english')
class Home extends React.Component {
render() {
return (
<Locale.Provider>
<Locale.Consumer>
{
// Should print 'english'
(locale) => {locale}
}
</Locale.Consumer>
</Locale.Provider>
)
}
}
您实际上正在做的是
const Locale = React.createContext('english')
class LocaleSwitch extends React.Component {
render() {
return (
<Locale.Provider>
<div>I could be a locale consumer if i wanted to </div>
</Locale.Provider>
)
}
}
class Home extends React.Component {
render() {
// I have no provider
return (
<Locale.Consumer>
{
(locale) => {locale}
}
</Locale.Consumer>
)
}
}