useContext更佳实践 代码

React useContext最佳实践
本文介绍了一种使用React的useContext Hook的最佳实践,通过分离状态和控制逻辑,避免了因未正确提供上下文而导致的运行时错误,确保在编译时就能发现错误。此方法适用于复杂的组件状态管理,同时保持了数据和控制逻辑的独立性。

原文链接: useContext更佳实践 代码

上一篇: react系列文章 一点解读

下一篇: ts 字符串模板类型 lodash get函数的类型推断和vuex 合法的 action

useContext更佳实践

主要思想:

为了避免使用context时, 外层并没有注入, 导致的错误, 将错误前置, 避免在运行时出错, 而是在编译时检查

简单的状态使用state, 对于复杂的状态可以使用reducer

使用数据和控制分离的方式, 修改数据的组件不会在数据变化时更新

up-f901f1710d5d58e8aa8be3567d702768a9d.png

count-context.js

import React from "react";
const CountStateContext = React.createContext();
const CountDispatchContext = React.createContext();
const initState = 0;
export function CountProvider({ children }) {
  const [state, dispatch] = React.useState(initState);
  return (
    <CountStateContext.Provider value={state}>
      <CountDispatchContext.Provider value={dispatch}>
        {children}
      </CountDispatchContext.Provider>
    </CountStateContext.Provider>
  );
}

export function useCountState() {
  const context = React.useContext(CountStateContext);
  if (context === undefined) {
    throw new Error("必须在CountProvider内使用useCountState");
  }
  return context;
}

export function useCountDispatch() {
  const context = React.useContext(CountDispatchContext);
  if (context === undefined) {
    throw new Error("必须在CountProvider内使用useCountDispatch");
  }
  return context;
}

count-display.jsx

import React from "react";
import { useCountState } from "./count-context";
function CountDisplay() {
  const count = useCountState();
  console.log("display render")
  return <div>display count:{count}</div>;
}
export default CountDisplay;

count-dispatch.jsx

import React from "react";
import { useCountDispatch } from "./count-context";
function CountDispatch() {
  const dispatch = useCountDispatch();
  const inc = () => {
    dispatch((v) => v + 1);
  };
  console.log("dispatch render")
  return (
    <div>
      <button onClick={inc}>inc</button>
    </div>
  );
}
export default CountDispatch;

app.jsx

import React from "react";
import {
  CountProvider,
} from "./count-context";
import CountDisplay from "./count-display";
import CounterDispatch from "./count-dispatch";
function App() {
  return (
    <CountProvider>
      <CountDisplay />
      <CounterDispatch />
    </CountProvider>
  );
}

export default App;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值