Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档

文章目录

    • ⭐前言
    • ⭐Docusaurus框架渲染mdx内容
      • 💖 创建一个mdx文件
      • 💖 创建一个react jsx文件
      • 💖 mdx引入react的组件并渲染
      • 💖 mdx引入react的组件源代码内容
    • ⭐渲染一个echarts地图的代码解释文档
      • 💖 echarts 渲染地图
      • 💖 mdx文件引入map
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享关于Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档。
mdx(Markdown with JSX)
MDX(Markdown with JSX)是一种将JSX语法与Markdown语法结合的文件格式。它通常用于编写文档、文章或博客等内容,并支持在文档中直接编写和渲染React组件。

MDX文件使用.mdx扩展名,并可以通过配置将其转换为React组件。它可以包含Markdown标记,如标题、段落、链接和列表等,同时还可以包含React组件和JSX代码块。

下面是一个简单的MDX示例:

# Hello, MDX!

这是一个MDX文件,可以在其中嵌入React组件。

<MyComponent />

下面是一个使用JSX代码块的例子:

```jsx
const name = 'John Doe';
const greeting = <h1>Hello, {name}!</h1>;

{greeting}

在MDX文件中,可以直接引用React组件,并使用JSX语法创建和渲染组件。同时还可以使用JSX代码块包裹JavaScript代码,并在文档中展示运行结果。

MDX文件可以通过工具或库进行转换和渲染,生成HTML网页或其他格式的输出。常见的MDX工具包括mdx-js和gatsby-mdx等。

总而言之,MDX文件是一种将Markdown和JSX结合的文件格式,适用于编写文档、文章或博客,并支持直接嵌入和渲染React组件。

mdx的使用场景
用途包括ui框架的文档,比如以下三种

  1. antd design react 的前端ui框架
  2. ant design vue的前端ui框架
  3. element-plus的前端ui框架
    antd react
    该系列往期文章
    Docusaurus框架——快速搭建markdown文档站点介绍sora

⭐Docusaurus框架渲染mdx内容

安装antd和raw-loader
npm 安装

npm install antd
npm install raw-loader

raw-loader用于读取文件中内容
mdx定义变量
定义变量或组件

Exporting components

export const author_name="yma16";

💖 创建一个mdx文件

在docx 创建 component.mdx 文件

export const author_name = "yma16";

# author_name

author_name is {author_name}

💖 创建一个react jsx文件

在src/components下创建 from/index.jsx

import React from 'react';
import { Button, Form, Input, Select, Space } from 'antd';
const { Option } = Select;
const layout = {
    labelCol: {
        span: 8,
    },
    wrapperCol: {
        span: 16,
    },
};
const tailLayout = {
    wrapperCol: {
        offset: 8,
        span: 16,
    },
};
const BaseForm = () => {
    const [form] = Form.useForm();
    const onGenderChange = (value) => {
        switch (value) {
            case 'male':
                form.setFieldsValue({
                    note: 'Hi, man!',
                });
                break;
            case 'female':
                form.setFieldsValue({
                    note: 'Hi, lady!',
                });
                break;
            case 'other':
                form.setFieldsValue({
                    note: 'Hi there!',
                });
                break;
            default:
        }
    };
    const onFinish = (values) => {
        console.log(values);
    };
    const onReset = () => {
        form.resetFields();
    };
    const onFill = () => {
        form.setFieldsValue({
            note: 'Hello world!',
            gender: 'male',
        });
    };
    return (
        <Form
            {...layout}
            form={form}
            name="control-hooks"
            onFinish={onFinish}
            style={{
                maxWidth: 600,
            }}
        >
            <Form.Item
                name="note"
                label="Note"
                rules={[
                    {
                        required: true,
                    },
                ]}
            >
                <Input />
            </Form.Item>
            <Form.Item
                name="gender"
                label="Gender"
                rules={[
                    {
                        required: true,
                    },
                ]}
            >
                <Select
                    placeholder="Select a option and change input text above"
                    onChange={onGenderChange}
                    allowClear
                >
                    <Option value="male">male</Option>
                    <Option value="female">female</Option>
                    <Option value="other">other</Option>
                </Select>
            </Form.Item>
            <Form.Item
                noStyle
                shouldUpdate={(prevValues, currentValues) => prevValues.gender !== currentValues.gender}
            >
                {({ getFieldValue }) =>
                    getFieldValue('gender') === 'other' ? (
                        <Form.Item
                            name="customizeGender"
                            label="Customize Gender"
                            rules={[
                                {
                                    required: true,
                                },
                            ]}
                        >
                            <Input />
                        </Form.Item>
                    ) : null
                }
            </Form.Item>
            <Form.Item {...tailLayout}>
                <Space>
                    <Button type="primary" htmlType="submit">
                        Submit
                    </Button>
                    <Button htmlType="button" onClick={onReset}>
                        Reset
                    </Button>
                    <Button type="link" htmlType="button" onClick={onFill}>
                        Fill form
                    </Button>
                </Space>
            </Form.Item>
        </Form>
    );
};
export default BaseForm;

💖 mdx引入react的组件并渲染

渲染jsx组件

import BaseForm from '@site/src/components/form/index.jsx';

<BaseForm/>

效果如下:
render-jsx

💖 mdx引入react的组件源代码内容

渲染 react 表单 和他的代码内容块

import BaseFormSource from '!!raw-loader!@site/src/components/form/index.jsx';
import BaseForm from '@site/src/components/form/index.jsx';
import CodeBlock from '@theme/CodeBlock';

<BaseForm/>

<CodeBlock language="jsx">{BaseFormSource}</CodeBlock>

效果如下
react-page

⭐渲染一个echarts地图的代码解释文档

💖 echarts 渲染地图

配置 map/idnex.jsx

import React ,{useEffect}from 'react';
import chinaJson from './chinaGeo.js';
import * as echarts from 'echarts';
 const MapBar=()=>{
    function renderEchartBar() {
        // 基于准备好的dom,初始化echarts实例
        const domInstance = document.getElementById('barChartId')
        if (domInstance) {
            domInstance.removeAttribute('_echarts_instance_')
        }
        else {
            return
        }
        const myChart = echarts.init(domInstance);
        const option = {
            backgroundColor: 'rgba(0,0,0,0)',//背景色
            title: {
                text: '中国地图',
                subtext: 'china',
                color: '#fff'
            },
            visualMap: { // 设置视觉映射
                min: 0,
                max: 20,
                text: ['最高', '最低'],
                realtime: true,
                calculable: true,
                inRange: {
                    color: ['lightskyblue', 'yellow', 'orangered']
                }
            },
            geo: {
                // 经纬度中心
                // center: state.centerLoction,
                type: 'map',
                map: 'chinaJson', // 这里的值要和上面registerMap的第一个参数一致
                roam: false, // 拖拽
                nameProperty: 'name',
                geoIndex: 1,
                aspectScale: 0.75, // 长宽比, 默认值 0.75
                // 悬浮标签
                label: {
                    type: 'map',
                    map: 'chinaJson', // 这里的值要和上面registerMap的第一个参数一致
                    // roam: false, // 拖拽
                    // nameProperty: 'name',
                    show: true,
                    color: '#333',
                    formatter: function (params) {
                        return params.name
                    },
                    // backgroundColor: '#546de5',
                    align: 'center',
                    fontSize: 10,
                    width: (function () {
                        // let n = parseInt(Math.random() * 10)
                        return 110
                    })(),
                    height: 50,
                    shadowColor: 'rgba(0,0,0,.7)',
                    borderRadius: 10
                },
                zoom: 1.2
            },
            series: [
            ],
        }
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option, true);
        window.onresize = myChart.resize;
    }

    useEffect(()=>{
        echarts.registerMap('chinaJson', chinaJson)
        renderEchartBar()
    },[])


    return (<>
    <div id="barChartId" style={{width:'500px',height:'500px'}}>
    </div>
    </>)
}

export default MapBar;

💖 mdx文件引入map

创建一个mdx文件引入该组件
docs/map.mdx

import DataSource from '!!raw-loader!@site/src/components/map/index.jsx';
import Map from '@site/src/components/map/index.jsx';
import CodeBlock from '@theme/CodeBlock';

<Map/>

<CodeBlock language="jsx">{DataSource}</CodeBlock>

渲染效果图如下
map-docs

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
woman

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 最后,感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea中springboot项目创建后追加依赖

springboot项目创建后追加依赖 前言1、安装插件editstarters设置->插件 2、进入pom.xml 页面 前言 在项目创建的时候选择好依赖创建项目&#xff0c;之后追加依赖不是很方便&#xff0c;介绍一个简单的使用方法&#xff0c;通过editstarters进行添加 1、安装插件editstart…

html基本标签

<h1></h1> <p></p> h是标签从h1~h6&#xff0c;没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…

C语言---文件操作(1)

1.文件的打开和关闭 fopen有2个参数&#xff0c;第一个是文件的名字&#xff0c;第二个是打开的模式&#xff08;例如是读文件还是写文件&#xff09; (1)该文件夹下面没有data.txt文件&#xff0c;但是我执行了read操作&#xff0c;所以会显示这样的错误 &#xff08;2&#…

链表类型题目

文章目录 简介链表的常用技巧两数相加原理代码代码|| 两两交换链表中的节点代码原理 重排链表(重要)原理代码 合并 K 个升序链表代码递归代码 K 个一组翻转链表原理代码 简介 大家好,这里是jiantaoyab,这篇文章给大家带来的是链表相关的题目练习和解析,希望大家能相互讨论进步 …

强化学习_06_pytorch-PPO实践(Hopper-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化&#xff1a; batch_normalize: 在mini_batch 函数中进行adv的normalize, 加速模型对adv的学习policyNet采用beta分布(0~1): 同时增加MaxMinScale …

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路&#xff08;升序&#xff09; 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的…

JOSEF约瑟 漏电继电器LLJ-400F 配套零序互感器φ100mm 50-500mA 0.1S 导轨安装

系列型号&#xff1a; LLJ-150F(S)漏电继电器 LLJ-160F(S)漏电继电器 LLJ-200F(S)漏电继电器 LLJ-250F(S)漏电继电器 LLJ-300F(S)漏电继电器 LLJ-320F(S)漏电继电器 LLJ-400F(S)漏电继电器 LLJ-500F(S)漏电继电器 LLJ-600F(S)漏电继电器 一、产品用途及特点 LLJ-FS系列漏电继电…

MWC 2024丨美格智能推出5G RedCap系列FWA解决方案,开启5G轻量化新天地

2月27日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;美格智能正式推出5G RedCap系列FWA解决方案。此系列解决方案具有低功耗、低成本等优势&#xff0c;可以显著降低5G应用复杂度&#xff0c;快速实现5G网络接入&#xff0c;提升FWA部署的经济效益。 RedCap技术带来了…

MATLAB知识点:if条件判断语句的嵌套

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 我们通过一个…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前&#xff0c; 先征得他人同意 正确答案&#xff1a; D 试题解析&…

【Scratch画图100例】图49-scratch绘制直角风车 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例

目录 scratch绘制直角风车 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、实现流程 1、案例分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …

regexpire-攻防世界-MISC

用nc链接靶机&#xff1a; rootkali:~/Desktop# nc 220.249.52.133 37944 Can you match these regexes? Bv*(clementine|sloth)*Q*eO(clinton|alien)*(cat|elephant)(cat|trump)[a-zA-Z]*(dolphin|clementine)\W*(table|apple)* 大致上是服务端给出一个正则表达式&#xff0c…

基于springboot的宠物咖啡馆平台的设计与实现论文

基于Spring Boot的宠物咖啡馆平台的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于Spring Boot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于Spring Boot的宠物咖啡馆平台的设计与…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:形状裁剪)

用于对组件进行裁剪、遮罩处理。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形状对当…

数据结构:排序算法+查找算法

一、概念 程序数据结构算法 1.算法的特性和要求 特性&#xff1a; 确定性&#xff08;每次运行相同的输入都是同样的结果&#xff09;、有穷性、输入、输出、可行性 设计要求&#xff1a; 正确性、高效率、低存储、健壮性、可读性 2.时间复杂度 3.常见排序算法的时间复杂…

6.5 共享数据

本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法&#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口&#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据&#xff0c;最后叙述如何利用内容解析器读写联系人信息&#xff0c;以…

SQL无列名注入

SQL无列名注入 ​ 前段时间&#xff0c;队里某位大佬发了一个关于sql注入无列名的文章&#xff0c;感觉好像很有用&#xff0c;特地研究下。 关于 information_schema 数据库&#xff1a; ​ 对于这一个库&#xff0c;我所知晓的内容并不多&#xff0c;并且之前总结SQL注入的…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…

EchoServer回显服务器简单测试

目录 工具介绍 工具使用 测试结果 工具介绍 github的一个开源项目,是一个测压工具 EZLippi/WebBench: Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的…

【Vue3】解锁Vue3黑科技:探索接口、泛型和自定义类型的前端奇迹

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…