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

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

⭐前言

大家好,我是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框架

    该系列往期文章
    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/>

效果如下:

💖 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>

效果如下

⭐渲染一个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>

渲染效果图如下


⭐结束

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


目录
相关文章
|
资源调度 前端开发 Android开发
如何在 React Native 中进行代码签名验证?
如何在 React Native 中进行代码签名验证?
|
10月前
|
人工智能 自然语言处理 前端开发
Flame:开源AI设计图转代码模型!生成React组件,精准还原UI+动态交互效果
Flame 是一款开源的多模态 AI 模型,能够将 UI 设计图转换为高质量的现代前端代码,支持 React 等主流框架,具备动态交互、组件化开发等功能,显著提升前端开发效率。
1512 1
|
小程序 前端开发 JavaScript
微信小程序图表制作利器:ECharts组件的使用与技巧
微信小程序图表制作利器:ECharts组件的使用与技巧
1301 1
|
小程序 JavaScript
微信小程序使用echarts图表(ec-canvas)
这篇文章介绍了在微信小程序中使用`ec-canvas`集成echarts图表的方法,包括解决加载时报错的问题、配置图表组件、以及在小程序页面中引入和使用这些图表组件的步骤。
2028 1
微信小程序使用echarts图表(ec-canvas)
|
前端开发 数据可视化 JavaScript
Echarts如何实现多图表缩放和自适应?附源码
Echarts如何实现多图表缩放和自适应?附源码
Echarts如何实现多图表缩放和自适应?附源码
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
407 3
|
Web App开发 数据可视化 前端开发
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
本文介绍了ECharts的基本使用和语法格式,包括如何引入ECharts、创建容器、初始化echarts实例对象、配置option参数和一些基础图表的绘制方法。文章还提供了简单图表绘制和使用图例添加的示例代码,以及对ECharts特性和优势的概述。
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
|
JavaScript
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
3630 0
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
开发者 搜索推荐 Java
超越传统:JSF自定义标签库如何成为现代Web开发的个性化引擎
【8月更文挑战第31天】JavaServer Faces(JSF)框架支持通过自定义标签库扩展其内置组件,以满足特定业务需求。这涉及创建`.taglib`文件定义标签库及组件,并实现对应的Java类与渲染器。本文介绍如何构建和应用JSF自定义标签库,包括定义标签库、实现标签类与渲染器逻辑,以及在JSF页面中使用这些自定义标签,从而提升代码复用性和可维护性,助力开发更复杂且个性化的Web应用。
209 0