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 可以大大简化代码结构,提高开发效率。
但过度使用可能会导致组件复用性降低和性能问题。
相关推荐
全栈前端老曹4 小时前
【前端路由】Vue Router 嵌套路由 - 配置父子级路由、命名视图、动态路径匹配
前端·javascript·vue.js·node.js·ecmascript·vue-router·前端路由
EndingCoder4 小时前
安装和设置 TypeScript 开发环境
前端·javascript·typescript
张雨zy5 小时前
Vue 项目管理数据时,Cookie、Pinia 和 LocalStorage 三种常见的工具的选择
前端·javascript·vue.js
五月君_5 小时前
Nuxt UI v4.3 发布:原生 AI 富文本编辑器来了,Vue 生态又添一员猛将!
前端·javascript·vue.js·人工智能·ui
一个处女座的程序猿O(∩_∩)O5 小时前
现代前端开发的三大支柱:TypeScript、ESLint、Prettier 深度解析与完美协作
javascript·typescript
xiangxiongfly9155 小时前
JavaScript 惰性函数
javascript·惰性函数
POLITE36 小时前
Leetcode 76.最小覆盖子串 JavaScript (Day 6)
javascript·算法·leetcode
web小白成长日记6 小时前
深入理解 React 中的 Props:组件通信的桥梁
前端·javascript·react.js
2501_946675646 小时前
Flutter与OpenHarmony打卡步进器组件
java·javascript·flutter
小高0076 小时前
🔥3 kB 换 120 ms 阻塞? Axios 还是 fetch?
前端·javascript·面试