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 可以大大简化代码结构,提高开发效率。
但过度使用可能会导致组件复用性降低和性能问题。
相关推荐
蜡台5 小时前
H5使用Chrome 权限问题
前端·javascript·chrome
大貔貅喝啤酒5 小时前
接口测试_Postman(详细版)
javascript·测试工具·node.js·自动化·postman
小小码农Come on6 小时前
QML访问子项内容
前端·javascript·html
桜吹雪6 小时前
Langchain.js官方文档:构建具备按需加载技能的 SQL 助手
javascript·人工智能·node.js
一行代码一行诗++6 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
陈振wx:zchen20086 小时前
前端-面试题-JavaScript
javascript·前端面试题
幽络源小助理7 小时前
小六壬排盘工具源码 自适应双端 纯原生HTML+JS
前端·javascript·html
Championship.23.248 小时前
Open Source Pipeline Skill深度解析:自动化开源贡献全流程
前端·javascript·html
迪菲赫尔曼8 小时前
从 0 到 1 打造工业级推理控制台:UltraConsole(Ultralytics + FastAPI + React)开源啦!
前端·yolo·react.js·计算机视觉·开源·fastapi
万邦科技Lafite8 小时前
京东开放API接口:item_get返回参数指南
java·前端·javascript·api·电商开放平台