反应上下文返回未定义

vbo*_*tio 8 reactjs

我正在使用React Context api将某些状态传递给不同的子组件,并且它正在返回undefined

父组件:

export const UserContext = React.createContext();
export class Provider extends Component {
  state = {
    editGroup: false,
  }
  render() {
    return (
      <UserContext.Provider value={{
        state: this.state
      }}>
        {this.props.children}
      </UserContext.Provider>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

子组件:

import { UserContext } from './index';

return (
  <React.Fragment>
    <UserContext.Consumer>
      {(context) => (
        <p>im inside the consumer {console.log(context)}</p>
      )}
    </UserContext.Consumer>
  </React.Fragment>
);
Run Code Online (Sandbox Code Playgroud)

最后console.log的返回是undefined,我在这里做错了什么?

Ken*_*nne 22

另外,如果您覆盖它,请确保在构造函数中传递上下文!

    export default class Profile extends React.Component {
        static contextType = AuthContext;
        // make sure you pass the context along to super!
        constructor(props, context) {
            super(props, context);
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)


var*_*ons 4

在子组件中,将 Consumer 部分中的上下文更改为值(函数参数),因为这是传递给 Provider 的 prop

<UserContext.Consumer>
  {(value) => ( 
    <p>im inside the consumer {console.log(value)}</p>
  )}
</UserContext.Consumer>
Run Code Online (Sandbox Code Playgroud)

完整的工作样本

    import React, { Component } from 'react'
    const UserContext = React.createContext()

    const Main = () => (
      <Parent>
        <Child/>
      </Parent>
    )

    export default Main

    //***************************************/

    class Parent extends Component {

      state = {
        editGroup: false
      }

      render() {
        return (
          <UserContext.Provider value={{
            state: this.state
          }}>
            {this.props.children}
          </UserContext.Provider>
        )
      }
    }

    //***************************************/

    const Child = () => {
      return (
        <React.Fragment>
          <UserContext.Consumer>
            {(value) => (
              <p>Inside consumer {console.log(value)}</p>
            )}
          </UserContext.Consumer>
        </React.Fragment>
      );
    }

    //***************************************/
Run Code Online (Sandbox Code Playgroud)

输出:状态:{editGroup:false}