Context API, как не использовать класс?

Как сделать и получить реквизит во всех компонентах с помощью функционального компонента и хуков?

например, я создаю файл js с классом с функциями внутри, такими как getBooks(), getNotes(), затем я создаю файл контекста и импортирую его в index.js и использую класс для значения поставщика, как показано ниже.

import {BookStoreContext} from "./components/bookstore-service-context";
import {BookStoreService} from "./services";

const bookStoreService = new BookStoreService();

ReactDOM.render(
    <Provider store = {store}>
        <ErrorBoundry>
            <BookStoreContext.Provider value = {BookStoreService}>
    <BrowserRouter>
    <App/>
    </BrowserRouter>
            </BookStoreContext.Provider>
        </ErrorBoundry>
    </Provider>,
    document.getElementById('root')
);

Предоставили пошаговое руководство о том, как использовать Context с хуками. Надеюсь, это поможет вам и многим другим разработчикам. Проголосуйте и примите ответ, если он вам полезен :)

Imran Rafiq Rather 26.12.2020 06:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

См. useContext.

Просто делать

// functional component
const someComponent = () => {
  const BookStoreService = useContext(BookStoreContext);

  // calling a method in the BookStoreService class
  BookStoreService.getBooks();

  return <></>
}

Обратите внимание, что если ваши методы, такие как getBooks(), являются асинхронными (т. е. извлекают данные с сервера), вероятно, лучше всего вызывать их в обработчике побочного эффекта, например useEffect.

спасибо, так что в этой ситуации невозможно отказаться от класса, чтобы получить функции?

Aw KingOftheworld 26.12.2020 05:50

Я не совсем понимаю, что вы здесь указываете. Было бы намного полезнее, если бы вы могли показать, что вы собираетесь писать BookStoreService как, используя «функции».

98sean98 27.12.2020 06:35
Ответ принят как подходящий

Как только наш Context будет готов (глобальные данные для использования в проекте), мы можем использовать useContext() Hook для использования нашего контекста в React-Hooks. Таким образом, мы избегаем компонента на основе класса в нашем приложении.

Мы предоставим пошаговое руководство о том, как работать с Context API в хуках, на примере ниже.

1. Сначала мы создаем наш контекстный файл (в котором будут наши глобальные данные)

import React, { useState, createContext } from "react";

const books = [
  { id: 1, name: "The way of the kings" },
  { id: 2, name: "The people of Paradise" },
  { id: 3, name: "Protest of the Farmers" }
];
// First we need to create our context
const BookContext = createContext();

// createContext returns 2 things. Provider and Consumer. We will only need Provider

const BookContextProvider = ({ children }) => {
  const [books, setBooks] = useState(books);

  const removeBook = (id) => {
    setBooks(books.filter((book) => book.id !== id));
  };

  return (
    <BookContext.Provider value = {{ books, removeBook }}>
      {children}
    </BookContext.Provider>
  );
};

export default BookContextProvider;

Мы использовали метод ContextName.Consumer для создания контекста. Это возвращает (как и раньше хуки) 2 вещи. createContext() и Consumer. Поскольку мы будем работать с хуками, нам понадобится только Provider, а вместо Provider мы будем использовать Consumer в наших компонентах для использования этого контекста.

2. Теперь наш контекст готов. (Примечание: useContext() — это наш BookContext, а Context — это просто компонент, в котором у нас есть данные нашего контекста). Нам нужно будет обернуть весь наш BookContextProvider вокругApp компонента, чтобы все дочерние компоненты, используемые в приложении, имели доступ к глобальному контексту.

    import React, { createContext, useState, useEffect } from "react";
    import "./styles.css";

    import BookContextProvider from "./BookContext";

    export default function App() {
     return (
       <div className = "App">
        <BookContextProvider>
          <BookList/>
        </BookContextProvider>
      </div>
     );
    }
 

Если вы заметили, я использовал компонент BookContextProvder внутри BookList, что связано с настройкой, которую мы сделали в нашем файле BookContextProvider, где мы использовали Context. Итак, {children} Component передается как BookList prop в children Component в нашем BookContextProvider файле. (Новичкам может потребоваться некоторое время, чтобы понять концепцию).

3. Когда все настройки готовы, мы можем использовать контекст в наших дочерних компонентах:

Итак, в моем компоненте BookContext.js я хочу получить доступ к BookList, а также иметь доступ к обработчику books. removeBook

import React, { useContext } from "react";
import { BookContext } from "./BookContext";

const BookList = () => {
  const { books, removeBook } = useContext(BookContext);

  console.info(books); // We have our Books available now
  console.info(removeBook); // We have our removeBook Handler as well
  return (
    <div>
      <h1>BookList Component</h1>
      {books.length > 0 &&
        books.map((book) => {
          return <div key = {book.id}>{book.name}</div>;
        })}
    </div>
  );
};

export default BookList;

В приведенном выше компоненте *We make use of useContext() Hook to do that.* мы теперь потребляем наш контекст. используя BookList крючок.

ПОЛНАЯ ДЕМО-ВЕРСИЯ CODESANDBOX: https://codesandbox.io/s/react-context-and-hooks-vcsfn?file=/src/App.js

Примите ответ и проголосуйте за мой ответ. Я считаю, что это поможет многим другим молодым разработчикам в будущем :)

Imran Rafiq Rather 26.12.2020 06:48

Другие вопросы по теме