Я пытаюсь использовать контекстный API, но значение моего Consumer return неопределено в консоли - PullRequest
0 голосов
/ 23 июня 2019

Это код для моего контекста api

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;

И это то место, где я собираюсь его использовать, но в консоли он возвращает неопределенное значение.Мне нужна помощь.

import React from "react";
import styled from "@emotion/styled";
import { Formik, Form, Field, ErrorMessage } from "formik";

import { MyContextConsumer } from "../../context/UserStateContext";

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

const SignUpForm = ({ props, ...remainProps }) => {
  return (
    <StyledSignUp {...remainProps}>
      <MyContextConsumer>
        {context => {
          console.log(context, "CONTEXT API");
          return <div className='content'>content here</div>;
        }}
      </MyContextConsumer>
    </StyledSignUp>
  );
};

export default SignUpForm;

Интересно, я что-то не так сделал в коде контекста?

1 Ответ

0 голосов
/ 24 июня 2019

Проблема, с которой вы столкнулись, заключается в том, что вы пытались слишком рано деструктурировать контекст.Лично я бы разделил это на 3 файла.Это также помогает, когда вы используете историю файлов Git!

  • User.context.js (это облегчает отслеживание импорта
  • Provider - обычно это самый высокий узел (которыйэто действительно нужно!)
  • Consumer - компонент, который потребляет значение

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 />:

<code>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)}
);};экспорт по умолчанию SignUpForm;

Дайте мне знать, как вы поживаете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...