zoukankan      html  css  js  c++  java
  • [React] Improve developer experience for accessing context with a custom React hook

    In this lesson, we create a custom hook that wraps the useContext hook and returns its value, as well as more useful error messaging if a context provider is missing. This simple addition brings very elegant ergonomics to access context from any component.

    providers/app-state.js

    import React, { createContext, useContext, useState } from "react";
    
    // Context
    const AppStateContext = createContext();
    
    // Provider
    export function AppStateProvider({ children }) {
      const [searchValue, setSearchValue] = useState("");
      const [shortList, setShortList] = useState([]);
    
      // The context value object
      const value = {
        searchValue,
        setSearchValue,
        shortList,
        setShortList
      };
    
      return (
        <AppStateContext.Provider value={value}>
          {children}
        </AppStateContext.Provider>
      );
    }
    
    // Custom hook
    export function useAppState() {
      const context = useContext(AppStateContext);
      if (!context) {
        throw new Error(
          "You probably forgot the <AppStateProvider> context provider!"
        );
      }
      return context;
    }

    Provider it:

    // index.js
    // React
    import React from "react";
    import ReactDOM from "react-dom";
    
    // CSS
    import "normalize-css";
    import "./css/styles.css";
    
    // Components
    import App from "./App";
    import { NamesProvider } from "./providers/names";
    import { AppStateProvider } from "./providers/app-state";
    
    ReactDOM.render(
      <React.StrictMode>
        <NamesProvider>
          <AppStateProvider>
            <App />
          </AppStateProvider>
        </NamesProvider>
      </React.StrictMode>,
      document.getElementById("root")
    );

    Consume it:

    import React from "react";
    
    import { NamesList } from "./names-list";
    import { useNames } from "../providers/names";
    import { useAppState } from "../providers/app-state";
    
    export function NamePicker() {
      const names = useNames();
      const { searchValue, shortList, setShortList } = useAppState();
    
      const filteredNames = names
        .filter(entry =>
          entry.name.toLowerCase().includes(searchValue.toLowerCase())
        )
        .filter(entry => !shortList.includes(entry.id));
      function addToShortList(id) {
        setShortList([...shortList, id]);
      }
    
      return <NamesList namesList={filteredNames} onItemClick={addToShortList} />;
    }
  • 相关阅读:
    关于响应式布局
    HTML5 学习笔记--------》HTML5概要与新增标签!
    jQuery学习笔记:attr()与prop()的区别
    关于php语言的使用!
    MYSQL的常用命令和增删改查语句和数据类型!
    html5 和css3的小知识!
    应收单
    Spring Boot 启动过程及 自定义 Listener等组件
    23. Spring Boot JPA BaseDao 配置 文章
    22. SpringBoot 集成 Mybatis
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12752361.html
Copyright © 2011-2022 走看看