我正在尝试使用上下文api,但Console中的Consumer返回的值未定义

时间:2019-06-23 18:48:43

标签: reactjs 2d-context-api

这是我的上下文api的代码

scrollView

这就是我打算使用它的地方,但是它在控制台中返回undefined。我正在寻找帮助。

import React, { Component } from "react";
const { Provider, Consumer } = React.createContext();
const MyContextProvider = Provider;
const MyContextConsumer = Consumer;
export { MyContextConsumer, MyContextProvider };

class UserState extends Component {
  state = {
    user: "JOHN"
  };

  render() {
    return (
      <MyContextProvider value={this.state}>
        {this.props.children}
      </MyContextProvider>
    );
  }
}

export default UserState;

我想知道上下文代码是否做错了什么。

1 个答案:

答案 0 :(得分:0)

这里的问题是您试图过早解构上下文。我个人将其分为3个文件。当您还使用Git文件历史记录时,它也有帮助!

  • User.context.js(这使导入更容易跟踪
  • 提供者-通常这将是最高节点(确实需要它!)
  • 消费者-消耗价值的组件

User.context.js

import { createContext } from "react";

export const UserContext = createContext();

提供者-<UserState />

import React, { Component } from "react";

import { UserContext } from '../../User.context.js' // some folder for context's

class UserState extends Component {
  state = {
    user: "JOHN"
  };

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

export default UserState;

消费者-<SignUpForm />

import React, { useContext } from "react";
import styled from "@emotion/styled";

import { UserContext } from '../../User.context.js' // some folder for context's

const StyledSignUp = styled.div`
  width: 50%;
  margin: 20px auto;
`;

// OLD WAY
const SignUpForm = ({ props, ...remainProps }) => {
  return (
    <UserContext.Consumer>
      {context => {
        console.log("CONTEXT API", context);

        return (
          <StyledSignUp {...remainProps}>
            <div className="content">content here</div>;
          </StyledSignUp>
        );
      }}
    </UserContext.Consumer>
  );
};

// React Hook way :)
const SignUpForm = ({ props, ...remainProps }) => {
  const context = useContext(UserContext);

  return (
    <StyledSignUp {...remainProps}>
      <div className="content">content here</div>;

      {/* Debug - Seeing is believing */}
      <pre>{JSON.stringify(context, null, 2)}</pre>
    </StyledSignUp>
  );
};

export default SignUpForm;

让我知道你的生活吧!