繁体   English   中英

React Context API:提供程序不提供

[英]React Context API: Provider not provide

我需要向网站添加语言更改,我使用了上下文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>   
            );
        }

    }


在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>
    )
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM