javascript – React Context和单独的类

前端之家收集整理的这篇文章主要介绍了javascript – React Context和单独的类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经放弃了对Redux(我是React的新手)的希望,并且看到反过来的Alpha版本提供了一个新的Context.

所以我试图学习它,我的目标是,我有一个Navbar,我想在我的上下文中回应一个状态,{isAuthorised:false}.

我跟随this guys video

但他所有的代码都在一个文件中.我正在努力做到’正确’.

我所做的是创建了一个名为“context”的文件夹,并在其中创建了一个名为provider.jsx的jsx.

import React,{Component} from 'react';


export default class MyProvider extends Component {
    constructor(props) {
        super(props);
        this.state = {
            isAuthenticated: false
        }
    }

    render() {
        const MyContext = React.createContext();
        return(
            <MyContext.Provider value="Test Text">
                {this.props.children}
            </MyContext.Provider>
        )
    }
}

https://github.com/CraigInBrisbane/ReactLearning/blob/master/src/context/provider.jsx

在那里,我在渲染中创建了上下文(这可能是错的……也许这意味着在我的App jsx中发生?).

我在那里创建了一个状态,默认是被认为是假的. (我稍后会添加代码以将其设置为应该是什么).

这编译…并运行.

在我的App组件中,我使用我的提供程序,如下所示:

import MyProvider from './context/provider.jsx';


export default class App extends Component {

    render() {
        return (
            <MyProvider>
            <div>
                <Router>
                    <div>
                    <Navbar />
                        <Route exact path='/' component={Home}  />
                        <Route path='/about' component={About} />

https://github.com/CraigInBrisbane/ReactLearning/blob/master/src/app.jsx

所以我用MyProvider包装所有代码.

在我的Navbar组件中,我导入了我的提供程序:

import MyProvider from '../../context/provider.jsx';

然后我尝试在我的渲染中从我的提供者输出somethign:

return (
    <div>
         <MyProvider.Consumer>
            {(context)=> (
                <p>Here I am {context}</p>
            )}
        </MyProvider.Consumer> 
    <nav className="navbar navbar-expand">

https://github.com/CraigInBrisbane/ReactLearning/blob/master/src/components/navbar/navbar.jsx

但这对我来说非常糟糕.

Warning: React.createElement: type is invalid — expected a string
(for built-in components) or a class/function (for composite
components) but got: undefined. You likely forgot to export your
component from the file it’s defined in,or you might have mixed up
default and named imports.

Check the render method of Navbar.
in Navbar (created by App)
in div (created by App)

Uncaught Error: Element type is invalid: expected a string (for
built-in components) or a class/function (for composite components)
but got: undefined. You likely forgot to export your component from
the file it’s defined in,or you might have mixed up default and named
imports.

我怎样才能让它发挥作用?我的.createContext应该驻留在哪里?

Code (With error) is here.

解决方法

所以问题是你导出MyProvider并尝试访问它上面的静态组件 – 这是未定义的:
console.log(MyProvider.Consumer);  // undefined

Consumer仅作为静态属性存在于MyContext组件中.

你需要改变什么:

provider.jsx

import React,{Component} from 'react';

export const MyContext = React.createContext();

export default class MyProvider extends Component {
    constructor(props) {
        super(props);
        this.state = {
            isAuthenticated: false
        }
    }

    render() {

        return(
            <MyContext.Provider value={this.state.isAuthenticated}>
                {this.props.children}
            </MyContext.Provider>
        )
    }
}

然后在navbar.jsx中

import MyProvider,{ MyContext } from '../../context/provider.jsx';

<MyProvider>
   <MyContext.Consumer>
      {(context)=> (
          <p>Here I am {context}</p>
      )}
   </MyContext.Consumer> 
</MyProvider>

看看this tutorial.

编辑:

要让MyProvider中存在Consumer,您必须在其上分配指向MyContext Consumer的静态变量

MyProvider.Consumer = MyContext.Consumer;

然后我认为你可以使用它:

<MyProvider>
   <MyProvider.Consumer>
      {(context)=> (
          <p>Here I am {context}</p>
      )}
   </MyProvider.Consumer> 
</MyProvider>

但是我不确定这是不是一个好主意.

猜你在找的JavaScript相关文章