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>

渲染效果图如下


⭐结束

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


目录
相关文章
|
28天前
|
资源调度 前端开发 Android开发
如何在 React Native 中进行代码签名验证?
如何在 React Native 中进行代码签名验证?
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
75 9
|
21天前
|
存储 前端开发
在React框架中,如何使用对象来管理组件的状态
在React中,组件状态通过`state`对象管理,利用`setState`方法更新状态。状态变化触发组件重新渲染,实现UI动态更新。对象结构清晰,便于复杂状态管理。
|
1月前
|
开发框架 前端开发 JavaScript
React 框架的优点和缺点是什么?
React框架作为当前主流的前端开发框架之一,具有诸多优点,同时也存在一些缺点
|
1月前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
1月前
|
移动开发 前端开发 JavaScript
React框架
React是一个用于构建用户界面的JavaScript库,由Facebook开发并于2013年开源,目前在前端开发领域得到了广泛的应用。
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
26天前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
31 0
|
2月前
|
前端开发 JavaScript UED
构建现代Web应用:使用React框架打造单页面应用
【10月更文挑战第9天】构建现代Web应用:使用React框架打造单页面应用
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门