精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Mathlive將數學公式編輯器集成到可視化搭建平臺

開發 前端
我研究了一些成熟的庫之后發現, 有一個開源庫非常適合我的“簡單化”訴求, 它就是——Mathlive,MathLive 是一個功能強大的 Web 組件,它提供了一個易于使用的界面來編輯數學公式。

hi, 大家好, 我是徐小夕. 上篇文章和大家分享了剛開發完的可視化搭建產品——橙子試卷. 收到了很多用戶的反饋和建議, 其中有一個建議我覺得非常有意思, 所以花了一天時間研究和實現了這個用戶需求。

具體需求如下:

對于高等數學類課程的試卷, 能不能實現編輯數學公式的功能呢?

經過了一系列的調研和可行性分析, 我覺得這個需求非常有價值, 而且應用面很廣, 技術上從 web 的角度也是可以實現的, 所以我花了一點時間實現了它。

在文章末尾我也會把集成了數學公式的可視化編輯器地址分享給大家, 供大學學習參考。

接下里我會和大家分享一下如何從零實現一個支持數學公式編輯器的組件, 并集成到 vue3 項目中。

數學公式編輯器的技術實現

首先要想實現展示我們熟知的數學公式, 在 web 里我們需要了解以下幾種表示法:

  • latex
  • mathml
  • ascimath

以上三種表示法實際上都是標記語言, 通過特定的語法格式來優雅的展示數學公式, 簡單舉例如下:

如果大家熟悉這些標記語言, 我們就可以很容易的使用前端開源庫 MathJax 來編寫數學公式。

具體使用如下:

<template>
  <div class="Formula">
    <p id="math"></p>
    <p ref="math" v-html=“str”></p>
  </div>
</template>

<script>
export default {
  name: 'Formula',
  data() {
    return {
      str: ''
    }
  },
  mounted() {
    this.$nextTick(() => {
      // typesetPromise 需要 [] 包裹
      this.str = '\\[x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}.\\]'
      window.MathJax.typesetPromise([this.$refs.math]).catch(err => err)
      
      // tex2chtml 不需要 [] 包裹
      const str = `x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}`
      document
        .querySelector('#math')
        .appendChild(window.MathJax.tex2chtml(str))
    })
  }
}
</script>

但是作為極具產品觀念的我來說, 讓用戶學習這些標記語言是非常痛苦的, 所以我們要想一種更簡單的方式, 讓用戶不用學習, 也能可視化的編寫復雜數學公式。

我研究了一些成熟的庫之后發現, 有一個開源庫非常適合我的“簡單化”訴求, 它就是——mathlive。

MathLive 是一個功能強大的 Web 組件,它提供了一個易于使用的界面來編輯數學公式。

但是網上它的文檔和在 vue3 中的使用非常稀少, 可以說是完全沒有. 因為我做的橙子試卷搭建平臺采用 vue3 來實現的, 所以我需要研究一種支持 vue3 的方案。

好在我找到了它們純英文版的文檔, 咬了一遍它的文檔之后, 對 MathLive 有了更深的理解。

文檔里提供了原生 webcomponent 的使用方法 和 react的使用案例, 好在我有5年多的 react 駕齡, 看起來還是非常順手的. 下面我就直接分享如何把它集成到 vue3 項目里. 感興趣的朋友可以直接拿來應用到自己的項目里。

1、安裝和引入MathLive組件

我們可以用 npm 或者 yarn 或者 pnpm(推薦) 安裝:

pnpm install mathlive

接下來我們來注冊一下組件:

import * as MathLive from 'mathlive';
import VueMathfield from '@/assets/vue-mathlive.mjs';

app.use(VueMathfield, MathLive);

這樣我們就可以在全局使用 mathlive 公式編輯器組件了。

2、在項目中使用

為了實現上圖的效果, 我們需要在頁面里定義組件:

<mathlive-mathfield
  :options="{ smartFence: false }"
  @input="handleChange"
  :value="content"
>
  {{ content }}
</mathlive-mathfield>

這個是 mathlive 默認是引入標簽, 當然我們可以修改它的定義, 如果你是 react 選手, 也可以直接這么使用:

// d.ts
declare global {
  namespace JSX {
    interface IntrinsicElements {
      'math-field': React.DetailedHTMLProps<React.HTMLAttributes<MathfieldElement>, MathfieldElement>;
    }
  }
}

// app.tsx
import "./App.css";
import "http://unpkg.com/mathlive";
import { useState } from "react";

function App() {
  const [value, setValue] = useState<string>("");

  return (
    <div className="App">
      <math-field 
        onInput={
          (evt: React.ChangeEvent<HTMLElement>) => 
            setValue(evt.target.value)
        }
      >
        {value}
      </math-field>
      <p>Value: {value}</p>
    </div>
  );
}

export default App;

接下來就來學習一下它的屬性, 下面是 vue 版的 props, 非常重要, 大家可以收藏一下:

圖片

這里我整理了幾個常用的api:

  • value 組件綁定的值。
  • input 輸入內容時的監聽函數, 用來更新和獲取value。
  • options 組件選項屬性, 比如編輯模式, 可讀性等, 非常重要。

當然如果你想修改它的顯示樣式, 可以通過操作 dom 或屬性, 也可以直接用 css 覆蓋:

.content {
  :deep(math-field) {
    width: 100%;
  }
}

通過以上步驟, 基本上能實現我們上面分享的公式編輯器了:

快速集成到可視化搭建平臺

接下來分享一下如何集成到我們的橙子試卷零代碼搭建平臺中。

首先我們需要先在物料庫中添加數學公式編輯器組件, 具體思路如下:

UI代碼:

<template>
  <div>
    <div class="title" :style="{ color: editorStore.data[index].titleColor }">
      <mathlive-mathfield
        :options="{
          smartFence: false,
          readOnly: true,
        }"
      >
        {{ editorStore.data[index].titleText }}
      </mathlive-mathfield>
    </div>
    <a-radio-group
      :direction="editorStore.data[index].direction"
      v-model="editorStore.data[index].value"
    >
      <a-radio
        v-for="item in editorStore.data[index].options"
        :value="item.label"
        :key="item.label"
        :style="{ '--radio-options-color': editorStore.data[index].optionsColor }"
        @click.stop
      >
        {{ item.label }} . {{ item.value }}</a-radio
      >
    </a-radio-group>
    <Message
      :value="editorStore.data[index].value"
      :answer="editorStore.data[index].answer"
      :auto="editorStore.data[index].auto"
      :analysis="editorStore.data[index].analysis"
    />
  </div>
</template>

其中我們需要關注 mathlive-mathfield 的一個屬性: readonly, 它是讓我們把 latex 渲染成可視的數學公式的必備屬性, 否則我們只能在編輯模式下看到數學公式了。

接下來我們來編寫組件配置層代碼, 具體效果如下:

當我們編輯標題時, 會打開公式編輯器:

這部分我們是通過配置DSL自動生成的屬性面板, 這塊的知識我在分享H 5-Dooring 零代碼實現原理時有具體的介紹, 這里就不一一分析了, 直接上代碼:

export default class Math {
    component: any;
    constructor(id: string, arr=[{label:'A',value:'蘋果'},{label:'B',value:'香蕉'}]) {
        this.component = {
            component: 'math',
            type: 'editor.math',
            id,
            check: true,
            titleText: '數學題目',
            titleColor: 'black',
            options: arr,
            symbol: 'A,B,C...',
            direction: 'horizontal',
            optionsColor:'black',
            answer:undefined,
            analysis: '',
            auto: '',
            value:undefined,
            margin: [10, 10, 10, 10],
            scores:0,
            required:false,
            attrbite: [
                {
                    name: 'editor.titleText',
                    field: 'titleText',
                    component: 'math'
                },
                {
                    name: 'editor.titleColor',
                    field: 'titleColor',
                    component: 'color',
                    props: {
                        type: 'color'
                    }
                },
                {
                    name: 'editor.optionConfig',
                    field: 'options',
                    component: 'options',
                    props: {
                        options:arr
                    }
                },
                {
                    name: 'editor.optionSymbol',
                    field: 'symbol',
                    component: 'select',
                    props: {
                        options: [
                            {label:'A,B,C...',value:'A,B,C...'},
                            {label:'1,2,3...',value:'1,2,3...'},
                            {label:'a,b,c...',value:'a,b,c...'},
                            {label:'I,II,III...',value:'I,II,III...'}
                        ],
                    }
                },
                {
                    name: 'editor.optionDirection',
                    field: 'direction',
                    component: "select",
                    props: {
                        options: [{ label:'editor.horizontal', value: 'horizontal' }, { label: 'editor.vertical', value: 'vertical' }],
                    }
                },
                {
                    name: 'editor.optionsColor',
                    field: 'optionsColor',
                    component: 'color',
                    props: {
                        type: 'color'
                    }
                },
                {
                    name: 'editor.answerSettings',
                    field: 'answer',
                    component: 'select-lable',
                },
                {
                    name: 'editor.answerillustrate',
                    field: 'analysis',
                    component: 'textarea'
                },
                {
                    name: 'editor.grading',
                    field: 'auto',
                    component: 'switch'
                },
                {
                    name: 'editor.scores',
                    field: 'scores',
                    component: 'numberInput',
                    props: {
                        min: 0
                    }
                },
                {
                    name: 'editor.required',
                    field: 'required',
                    component: 'switch'
                },
                {
                    name: 'editor.margin',
                    field: 'margin',
                    component: "padding",
                    props: {
                        min: 0,
                        type:'margin'
                    }
                },
            ]
        }
    }
}

這樣我們就能把編輯器組件成功變成一個零代碼可消費的組件, 當然這離不開我實現的零代碼渲染引擎, 這塊我會在后面的文章中詳細分享.

以上我們就實現了橙子試卷 可視化搭建系統的數學公式編輯器功能,

體驗地址: https://turntip.cn/formManager。

責任編輯:姜華 來源: 趣談前端
相關推薦

2021-11-19 08:30:39

H5-Dooring 可視化組件商店

2021-07-27 08:29:33

可視化組件商店H5-Dooring

2021-01-09 09:48:10

可視化自然流布局 LowCode

2022-01-14 07:56:38

流布局設計拖拽

2011-08-24 14:22:13

LUA編輯器

2021-02-28 07:42:40

可視化網格線H5-Dooring

2021-06-16 08:30:36

Dooring可視化數據源設計剖析

2024-03-22 08:21:48

可視化搭建平臺組件商店H5-Dooring

2021-06-16 07:05:03

安全

2009-12-11 14:52:14

PHP editor函

2023-03-16 20:46:40

可視化平臺迭代

2020-12-29 08:04:16

可視化地圖組件日歷組件

2017-04-27 08:19:56

Markdown數學公式

2014-12-10 13:07:43

Egret GUI/H

2023-12-06 08:07:13

拖拽庫可視化

2016-09-02 13:59:46

集成通信平臺

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2009-08-19 09:43:41

Windows 7輸入公式

2022-10-14 16:25:50

數據可視化大屏搭建BI平臺

2021-07-12 17:23:47

零設計可視化引擎
點贊
收藏

51CTO技術棧公眾號

国产精品狼人色视频一区| 亚洲第一区在线| 91免费视频黄| 色窝窝无码一区二区三区| 性久久久久久| 精品国产一区二区三区四区在线观看 | 青娱乐极品盛宴一区二区| 亚洲欧美在线高清| 久久久久久久久久久久久久久久av | 凹凸国产熟女精品视频| 欧美成人免费| 久久99国产精品尤物| 97婷婷大伊香蕉精品视频| 波多野结衣一二三四区| aaa国产精品视频| 欧美无砖砖区免费| 成人黄色av片| 黄色免费在线观看网站| 久久久久久9999| 风间由美一区二区三区| 在线观看中文字幕2021| 亚洲国产三级| 久久综合电影一区| www色com| 亚洲人成网站77777在线观看| 日韩午夜在线观看| 中文字幕亚洲乱码| 亚洲黄色网址| 亚洲午夜成aⅴ人片| 亚洲日本欧美在线| 国产一级在线| 91免费在线看| 精品欧美国产| 亚洲国产一二三区| 国产毛片精品视频| 国产日本欧美一区| 国产性生活视频| 亚洲欧美日韩国产一区二区| 国产69精品久久久| 久久久国产精品黄毛片| 久久精品亚洲人成影院| 在线成人激情视频| 欧美人与性囗牲恔配| 日韩有码一区| 日韩精品视频在线观看免费| 男男一级淫片免费播放| 亚洲精品不卡在线观看| 欧美一区二区精品在线| 最好看的中文字幕| 日韩免费一级| 精品奇米国产一区二区三区| 成人高清在线观看视频| 日韩成人视屏| 欧美成人a在线| 18禁一区二区三区| 超碰成人在线免费| 亚洲成人网在线| 亚洲综合自拍网| 日本精品影院| 亚洲欧美中文字幕在线一区| 免费a级黄色片| 九九视频精品全部免费播放| 亚洲欧美激情精品一区二区| 中文字幕国产综合| 精品视频99| 日韩视频在线免费| 成人免费毛片东京热| 韩国久久久久| 欧美在线视频一区| 免费在线不卡av| 精品在线免费观看| 国产91精品入口17c| 五月激情婷婷综合| 国产日韩av一区二区| 亚洲一区二区四区| 中文字幕中文字幕在线十八区| 亚洲免费视频中文字幕| 精品国产一区二区三区无码| 岛国av在线网站| 日本高清不卡视频| www.色就是色.com| 久久久久影视| 亚洲视频精品在线| 久久久久久久久久网站| 亚洲国产一区二区精品专区| 国产成人精品综合| av免费在线不卡| caoporm超碰国产精品| 日本成人看片网址| 影音先锋在线播放| 色婷婷久久久综合中文字幕 | 国产麻豆一区| 亚洲第一网站男人都懂| 亚洲自拍偷拍图| 一区二区三区午夜视频| 性欧美视频videos6一9| 成人黄色免费网| 国产a区久久久| 色阁综合av| 欧美aaa免费| 欧美在线观看视频一区二区| 韩国三级在线看| 欧美日韩伦理| 久久久久久久影院| 亚洲自拍偷拍另类| 99久久精品99国产精品| 天天干天天色天天爽| 日韩激情电影免费看| 欧美一区二区免费| 老头老太做爰xxx视频| 尤物精品在线| 成人伊人精品色xxxx视频| 日本在线视频1区| 樱桃国产成人精品视频| 亚洲成人福利在线观看| 另类春色校园亚洲| 久久高清视频免费| 中文字幕日本人妻久久久免费 | 日韩精品一级二级 | 日本在线观看天堂男亚洲 | 国产精品亚洲成在人线| 亚洲国产成人久久| 欧美人妻精品一区二区免费看| 日韩电影在线看| 久久久久久久免费| 超碰在线视屏| 精品久久一二三区| 欧美精品入口蜜桃| 国产美女视频一区| 亚洲一区精彩视频| 福利一区二区三区视频在线观看| 亚洲精品美女久久 | 欧美在线你懂的| 野花社区视频在线观看| 日韩一级大片| 国产精华一区| 免费看电影在线| 91麻豆精品国产91久久久| 五月天精品在线| 日韩电影在线观看网站| 欧美精品成人一区二区在线观看| 大菠萝精品导航| 亚洲精品99久久久久| 久久久久香蕉视频| 丁香六月综合激情| 欧美午夜性视频| 国产一区二区三区亚洲| 久久久久久伊人| 日本精品999| 午夜欧美一区二区三区在线播放| 亚洲啪av永久无码精品放毛片| 欧美日韩天堂| 国产精品区一区| 韩国成人二区| 亚洲久久久久久久久久久| 天天综合天天干| 久久午夜老司机| 成人性生生活性生交12| 色一区二区三区四区| 成人啪啪免费看| 亚洲卡一卡二| 日韩va亚洲va欧洲va国产| 男人午夜免费视频| 中文字幕av一区 二区| 网站一区二区三区| 91精品推荐| 高清不卡日本v二区在线| av在线资源| 亚洲人av在线影院| 在线免费观看一级片| 亚洲另类在线视频| 日本一卡二卡在线| 日本最新不卡在线| 永久免费网站视频在线观看| 97久久综合精品久久久综合| 2025国产精品视频| 在线观看免费高清完整| 日韩亚洲欧美在线| 日日夜夜操视频| 亚洲精品视频在线| 国产精品久久久久久亚洲色| 天堂一区二区在线免费观看| 精品91一区二区三区| 久久国产精品色av免费看| 国产精品国产三级国产专播精品人| 欧美黑人激情| 日韩av在线直播| 国产精品久久久久毛片| 精品久久久一区| 成人免费视频国产免费观看| 白白色亚洲国产精品| 国产极品美女高潮无套久久久| 欧美www视频在线观看| 国产精品视频福利| 狂野欧美性猛交xxxx| 久久久亚洲影院| 在线免费黄色| 日韩av在线看| 不卡的日韩av| 欧美性猛片aaaaaaa做受| 国产亚洲精品av| 国产精品网站在线播放| 亚洲麻豆一区二区三区| 免费成人av在线播放| 久久视频这里有精品| 99精品视频在线| 日本一区视频在线观看| 国产精品一区二区三区美女| 91理论片午午论夜理片久久| 希岛爱理一区二区三区av高清| 欧美激情视频给我| 黄网站免费在线播放| 亚洲色图第三页| 天堂中文网在线| 日韩一卡二卡三卡国产欧美| 中文字幕一区二区在线视频| 欧美日韩在线视频一区二区| 国产亚洲精品久久久久久无几年桃| 中文字幕在线一区| 免费视频91蜜桃| 久久久.com| 日韩中文字幕电影| 91丨九色丨蝌蚪富婆spa| 亚洲精品一二三四| 国产自产视频一区二区三区| 青青青国产在线视频| 中文字幕日韩经典| 免费在线观看日韩欧美| 91九色在线观看视频| 精久久久久久| 福利视频免费在线观看| 欧美一区激情| 色中文字幕在线观看| 欧美freesextv| 一本一生久久a久久精品综合蜜| 国产亚洲一卡2卡3卡4卡新区 | 下面一进一出好爽视频| 久久亚洲不卡| 麻豆av免费在线| 免费日韩av| 1024精品视频| 欧美亚洲三级| 欧美精品成人网| 日韩av电影天堂| wwww.国产| 麻豆国产91在线播放| 天堂av8在线| 国产乱码一区二区三区| 日韩av福利在线观看| 国产一区二区三区在线观看精品| 一区二区三区四区毛片| 国内成人免费视频| 日韩大尺度视频| 成人动漫中文字幕| 一级做a爰片毛片| 国产色一区二区| 日本黄色激情视频| 亚洲免费观看在线视频| 久久久久久久中文字幕| 精品久久中文字幕| 欧美人一级淫片a免费播放| 在线免费av一区| 国产精品国产三级国产普通话对白 | 涩涩视频在线免费看| 欧洲成人免费视频| 成人精品国产| 亚洲a级在线播放观看| 一区二区三区亚洲变态调教大结局 | 黄网站免费久久| 亚洲精品成人在线播放| 国产乱码精品1区2区3区| 又色又爽又黄18网站| jvid福利写真一区二区三区| 国产全是老熟女太爽了| 国产精品国产三级国产aⅴ原创| 国产真实乱在线更新| 午夜影院久久久| 国产精品51麻豆cm传媒 | 六月婷婷综合网| 亚洲欧美日韩一区在线| 日本福利在线| 欧美极品美女电影一区| 日本不卡一二三| 91啪国产在线| 清纯唯美亚洲经典中文字幕| 色噜噜一区二区| 午夜精品免费| 免费看国产黄色片| 国产成人日日夜夜| 我想看黄色大片| 亚洲无线码一区二区三区| 亚洲国产精品无码久久久| 欧美一区二区三区四区高清| 亚洲av成人无码久久精品老人 | 午夜激情在线播放| 91精品中文在线| 色综合www| 免费极品av一视觉盛宴| 日本午夜一区二区| 亚洲自拍偷拍精品| 亚洲三级在线免费观看| 天堂中文在线网| 精品欧美一区二区在线观看| 自拍视频在线播放| 午夜精品久久久久久久男人的天堂 | 国产成人精品国内自产拍免费看 | 欧美日韩精品二区第二页| 日韩一级免费视频| 久久精品国产欧美激情| 成人一区福利| 国产精品果冻传媒潘| 欧美a级成人淫片免费看| 欧美综合在线观看视频| 成人污污视频在线观看| 五月天av网站| 69堂成人精品免费视频| av在线女优影院| 国产成人精品网站| 亚洲婷婷丁香| 精品中文字幕av| 成人黄页在线观看| 久久久久久福利| 日韩午夜激情av| 二区三区在线观看| 91精品国产综合久久男男| 成人动漫免费在线观看| 欧美 激情 在线| 久久这里只有精品6| 国产无遮挡aaa片爽爽| 欧美一区二区久久久| 国产成人高清精品| 成人www视频在线观看| 日本久久精品| 亚洲欧美另类动漫| 国产欧美日产一区| 日本成人一级片| 国产亚洲精品美女久久久| 深夜成人福利| 日本一区二区三区视频在线观看 | 亚洲va天堂va国产va久| www香蕉视频| 欧美激情视频在线观看| 一区二区在线视频观看| www.男人天堂网| 成人激情免费网站| 国产在线视频第一页| 亚洲国产福利在线| 成人免费无遮挡| 日本精品视频一区| 秋霞影院一区二区| 国产成人免费在线观看视频| 欧美日韩国产首页| 国产素人视频在线观看| 91久久极品少妇xxxxⅹ软件| 午夜亚洲福利| 91黄色免费视频| 色综合久久综合网97色综合| 国产高清视频免费最新在线| 国产精品日韩欧美| 91精品国产91久久久久久黑人| 三级黄色片免费看| 亚洲福利视频一区二区| 午夜视频福利在线观看| 国产精品444| 午夜精品毛片| 四虎精品一区二区| 色成人在线视频| 免费在线看黄色| 国产精品一区二区不卡视频| 在线视频精品| 中国1级黄色片| 亚洲成年人在线播放| 中文字幕在线中文字幕在线中三区| 日韩在线电影一区| 黄页视频在线91| 日本va欧美va国产激情| 中文国产成人精品久久一| 久久中文字幕一区二区| 国自产拍偷拍精品啪啪一区二区| 91日韩精品一区| 国产裸体无遮挡| 91精品国产成人www| 三级电影一区| 毛茸茸free性熟hd| 欧美丝袜自拍制服另类| 福利小视频在线| 亚洲bbw性色大片| 成人av网站在线观看免费| 国产精品成人久久久| 色综合男人天堂| 精品国产一区二区三区四区| 黑人性生活视频| 色久综合一二码| 欧美卡一卡二| 亚洲亚洲精品三区日韩精品在线视频| 成人av电影免费观看| 国产精品自拍电影| 国产精品白嫩美女在线观看| 欧美日本精品| 亚洲欧洲综合网|