React 创建 Context

创建

复制代码
创建一个 React Context,用来把"图表预览(或相关共享数据/方法)"放到组件树顶层,
任何子组件都能读取或修改

解决了 "prop drilling"(属性钻取)问题,即:避免将 props 通过多层组件传递

代码编写

js 复制代码
'use client'
import React, { ReactNode, useMemo, useState } from 'react';
import { createContext, useContextSelector, useContext } from 'use-context-selector';

type PreviewData = {
  chartId?: string;
  zoom?: number;
  // ...其他字段
};

type ChartPreviewContextType = {
  preview: PreviewData | null;
  setPreview: (p: PreviewData | null) => void;
};

const ChartPreviewContext = createContext<ChartPreviewContextType | undefined>(undefined);

export const ChartPreviewProvider = ({ children }: { children: ReactNode }) => {
  const [preview, setPreview] = useState<PreviewData | null>(null);

  // useMemo 保证 value 引用稳定,避免无谓重渲染
  const value = useMemo(() => ({ preview, setPreview }), [preview, setPreview]);

  return (
    <ChartPreviewContext.Provider value={value}>
      {children}
    </ChartPreviewContext.Provider>
  );
};

// 简单 hook(如果只需要整个对象)
export const useChartPreviewContext = () => {
  const ctx = useContext(ChartPreviewContext);
  if (!ctx) throw new Error('useChartPreviewContext must be used within ChartPreviewProvider');
  return ctx;
};

// 更细粒度的 selector 用法(推荐:减少重渲染)
// 例如在消费组件中,只订阅 preview 字段:
export const usePreviewData = () => {
  const preview = useContextSelector(ChartPreviewContext, v => v?.preview ?? null);
  return preview;
};

在任意组件中包裹(通常是最顶级的组件,比如Layout 组件)

js 复制代码
<ChartPreviewProvider>
   {children} // 下面的所有组件都可以使用  useChartPreviewContext  来拿到preview 和 setPreview  如果需要其他 请自行添加
 </ChartPreviewProvider> 

注意事项

复制代码
Context 是 React 中非常强大的特性,但需要谨慎使用。
在适当的场景下使用 Context 可以大大简化代码结构,提高开发效率。
但过度使用可能会导致组件复用性降低和性能问题。
相关推荐
I'm Jie1 天前
深入了解 Vue 3 组件间通信机制
前端·javascript·vue.js
用户90443816324601 天前
90%前端都踩过的JS内存黑洞:从《你不知道的JavaScript》解锁底层逻辑与避坑指南
前端·javascript·面试
PPPPickup1 天前
easychat项目复盘---获取联系人列表,联系人详细,删除拉黑联系人
java·前端·javascript
老前端的功夫1 天前
前端高可靠架构:医疗级Web应用的实时通信设计与实践
前端·javascript·vue.js·ubuntu·架构·前端框架
脾气有点小暴1 天前
前端页面跳转的核心区别与实战指南
开发语言·前端·javascript
San30.1 天前
深入 JavaScript 内存机制:从栈与堆到闭包的底层原理
开发语言·javascript·udp
Fantastic_sj1 天前
Vue3相比Vue2的改进之处
前端·javascript·vue.js
Bigger1 天前
🚀 “踩坑日记”:shadcn + Vite 在 Monorepo 中配置报错
前端·react.js·vite
ttod_qzstudio1 天前
深入理解 TypeScript 数组的 find 与 filter 方法:精准查找的艺术
javascript·typescript·filter·find
冬男zdn1 天前
优雅处理数组的几个实用方法
前端·javascript