最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單實現(xiàn)一個vue公式編輯器組件demo

 更新時間:2024年01月23日 08:57:42   作者:TangJang  
這篇文章主要介紹了輕松實現(xiàn)一個簡單的vue公式編輯器組件示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

基于vue實現(xiàn)數(shù)據(jù)統(tǒng)計公式的基本功能

一個基于vue實現(xiàn)數(shù)據(jù)統(tǒng)計公式的基本功能。

新建一個 formula.vue 組件

使用

<formula ref="formulaPage" :data-list="dataList" ></formula>

完整demo 

<template>
    <div id="formulaPage">
        <!-- 公式編輯區(qū)域 -->
        <div
                class="formulaView"
                id="formulaView"
                ref="formulaView"
                @click.stop="recordPosition()"
        >
            <div class="content-item" v-for="(item,index) in formulaList" :key="index" @click.stop="recordPosition(index)" >
                <div class="num" v-if="item.type == 'num'" >
                    &zwj;{{item.value}}
                </div>
                <div class="plain" v-else-if="item.type == 'plain'" >
                    &zwj;{{item.value}}
                </div>
                <div class="obj" v-else-if="item.type == 'obj'" >
                    &zwj;{{item.value}}
                </div>
                <!--光標-->
                <div class="cursor" v-if="item.cursor" ></div>
            </div>
        </div>
        <div class="tab mt_10 flex-lr">
            <div class="">
                <el-select @change="e=>{addItem(e,'obj',)}"
                           style="width: 120px"
                           v-model="dataId" placeholder="選擇指標" >
                    <el-option v-for="item in dataList"
                               :label="item.name" :value="item.id"
                               :key="item.id" ></el-option>
                </el-select>
                <el-select @change="e=>{addItem(e,'plain',)}" v-model="operatorId"
                           placeholder="選擇數(shù)學運算符"
                           style="width: 120px"
                           class="ml_20"
                >
                    <el-option v-for="item in operatorList" :label="item.name" :value="item.id" :key="item.id" >
                    </el-option>
                </el-select>
            </div>
            <div class="">
                <span class="mr_10 pointer theme-col" @click="clearAll()" > 清除全部</span>
            </div>
        </div>
    </div>
</template>
<script>
    /**
     * dataList 需要選擇數(shù)據(jù)的集合
     * defaultList 初始值的集合
     * @change 比變更后回傳的數(shù)據(jù)
     * **/
    export default {
        name: '',
        props:{
            dataList:{
                type:Array,
                default() {
                    return [];
                },
            },
            defaultList:{
                type:Array,
                default() {
                    return [];
                },
            },
        },
        data: function () {
            return {
                // 公式字符串
                formulaStr:'',
                dataId:'',
                operatorId:'',
                formulaList:[],
                //運算符
                operatorList:[
                    {
                        name:'+',
                        id:'+'
                    },
                    {
                        name:'-',
                        id:'-'
                    },
                    {
                        name:'*',
                        id:'*'
                    },
                    {
                        name:'/',
                        id:'/'
                    },
                    {
                        name:'()',
                        id:'()'
                    },
                ]
            }
        },
        watch:{
            formulaList(val){
                this.$emit('change',val)
            }
        },
        created() {
            //監(jiān)聽鼠標事件
            this.$nextTick(function () {
                document.addEventListener("keydown", this.keydown, false);
                document.addEventListener('click',this.formulaBlur);
            });
        },
        destroyed () {
            //移除監(jiān)聽事件
            document.removeEventListener("keydown", this.keydown, false);
            document.removeEventListener('click',this.formulaBlur);
        },
        methods: {
            // 獲取
            getFormula: function(){
            },
            // 點選時記錄光標位置
            recordPosition(index) {
                if(this.formulaList && this.formulaList.length >0){
                    this.formulaList = this.formulaList.map((item,itemIndex)=>{
                        item.cursor = false;
                        if(index > -1 && index == itemIndex){
                            item.cursor = true;
                        }else if((index!==0 && !index) && itemIndex == (this.formulaList.length -1)){
                            item.cursor = true;
                        }
                        return item
                    });
                }else {
                    this.formulaList = [
                        {
                            cursor:true,
                            type:'placeholder',
                            value:'',
                        }
                    ]
                }
                // this.$forceUpdate();
            },
            //失去焦點
            formulaBlur(e){
                this.formulaList = this.formulaList?.map(item=>{
                    item.cursor = false;
                    return item
                })
            },
            /**
             * @returns {addItem<*, void, *>}
             * 添加字段
             * type obj 字段  num 數(shù)字 plain符號
             * place 是否修改光標位置
             */
            addItem: function (val, type,place = true) {
                if(!val) return false;
                let that = this;
                //插入括號
                if(type == 'plain' && val == '()'){
                    val = '(';
                    setTimeout(function () {
                        that.addItem(')',type,false)
                    },50)
                }
                let obj={},data = {
                    value:'',
                    key:val,
                    type:type,
                };
                if(type == 'obj'){
                    //獲取數(shù)據(jù) 為 value 賦值
                    obj = this.dataList?.find(item=>item.id == val);
                    data.value = obj.name;
                }else {
                    data.value = val;
                }
                if(this.formulaList && this.formulaList.length>0){
                    const length = this.formulaList.length;
                    for (let i = 0; i < length; i++) {
                        //查找光標位置 如果光標位置為空 則在最后添加
                        if(this.formulaList[i].cursor){
                            this.formulaList.splice(i+1,0,data);
                            place && this.recordPosition(i+1);
                            break;
                        }else if(i === (this.formulaList.length - 1)){
                            this.formulaList.push(data)
                            this.recordPosition(this.formulaList.length - 1);
                        }
                    }
                }else {
                    if(!this.formulaList){
                        this.formulaList = [];
                    }
                    this.formulaList.push(data);
                    this.recordPosition(this.formulaList.length - 1);
                }
            },
            //清除全部
            clearAll(){
                this.formulaList = [];
                let that = this;
                setTimeout(function () {
                    that.recordPosition();
                },100);
            },
            //刪除
            deleteItem(type){
                let arr = JSON.parse(JSON.stringify(this.formulaList)),index = null;
                const length = arr?.length;
                for (let i = 0; i < length; i++) {
                    if(arr[i].cursor && arr[i].key){
                        index = i;
                        if(type == 'del'){
                            index = i + 1;
                        }
                        if(index > -1){
                            this.formulaList.splice(index,1);
                            if(type == 'del') {
                            }else {
                                this.recordPosition(index - 1);
                            }
                        }
                        break;
                    }
                }
            },
            // 鍵盤輸入
            keydown(e){
                //禁止輸入
                // 檢測光標是否存在
                let index,cursorData = this.formulaList?.find((item,itemIndex)=>{
                    if(item.cursor){
                        index = itemIndex
                    }
                    return item.cursor
                });
                if(!cursorData){
                    return false;
                }
                //左右移動鍵控制光標位置
                if (e && [37,39].includes(e.keyCode)){
                    if(e.keyCode == 37){index = index - 1;}else {index = index + 1;}
                    if(index > -1 && index < this.formulaList.length){
                        this.recordPosition(index);
                    }
                }else if (e && e.keyCode == 8){
                    //Backspace 鍵 刪除前面的值
                    this.deleteItem();
                }else if (e && [107,109,106,111].includes(e.keyCode)){
                    //運算符列表
                    this.addItem(e.key,'plain')
                }else if (e && e.shiftKey && [48,57].includes(e.keyCode) ){
                    //括號
                   if( e.keyCode == 48) e.key = ')';
                   if( e.keyCode == 57) e.key = '(';
                    this.addItem(e.key,'plain')
                }else if (e && e.keyCode == 46){
                    //delete鍵刪除光標后面的值
                    this.deleteItem('del');
                }else {
                    document.returnValue = false;
                    var tt=/^([1-9]{1}[0-9]{0,7})$/;//能輸入正數(shù)
                    if(tt.test(e.key)){
                        //輸入為數(shù)字 插入數(shù)字
                        this.addItem(e.key,'num')
                    }
                }
            },
            /**
             * 公式轉(zhuǎn)為字符串
             * 格式 [id]符號數(shù)字
             * **/
            parsingFormula: function(formulaStr){
                let str = '',arr = [];
                arr = this.formulaList?.map(item=>{
                    let val = item.key;
                    if(val){
                        if(item.type == 'obj'){
                            val = '['+val+']'
                        }
                        str = str+val;
                    }
                    return val
                });
                return str
            },
            /**
             * 格式效驗
             * */
            formatValidation(){
                let objData = null;
                let arr = this.formulaList?.filter(item=>{
                    if(item.type == 'obj'){
                        objData = item;
                    }
                    return item.key;
                }),data = {type:true,mag:''};
               if(!objData){
                   data.mag = '至少添加一個指標';
               }else {
                   for (let i = 0; i < arr.length; i++) {
                       if(i < arr.length-1){
                           //判斷當前類型
                           if(arr[i].type == 'obj' && arr[i+1].type =='plain' ){
                               //類型為obj時 后一個 需以 符號結(jié)尾
                               data.mag = '指標后綴';
                           }
                       }
                   }
               }
               if(data.mag){
                   data.type = false;
               }
               return data;
            },
        }
    }
</script>
<style lang="scss">
    #formulaPage {
        .formulaView{
            padding: 3px 4px;
            width: 100%;
            height: 120px;
            border: 1px solid #eee;
            line-height: 1.3;
            font-size: 12px;
            overflow-y: scroll;
            .content-item{
                position: relative;
                height: 16px;
                cursor: text;
                user-select: none;
                display: flex;
                align-items: center;
                float: left;
                .cursor{
                    height: 13px;
                    width: 1px;
                    background: #333;
                    animation:defaultCursor 1s steps(2) infinite;
                    position: absolute;
                    right: 0;
                }
                .obj {
                    padding: 0 5px;
                    margin: 0 1px;
                    background: #f1f1f1;
                    border-radius: 3px;
                }
                .num{
                    color: #000;
                    background: #fff;
                    padding: 0 1px 0 0;
                }
            }
        }
    }
    @keyframes defaultCursor {
        0% {
            opacity: 1;
        }
        100% {
            opacity: 0;
        }
    }
</style>

以上就是簡單實現(xiàn)一個vue公式編輯器組件demo的詳細內(nèi)容,更多關(guān)于vue公式編輯器組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3響應(yīng)式對象的api超全實例詳解

    vue3響應(yīng)式對象的api超全實例詳解

    可以把數(shù)據(jù)變成響應(yīng)式api的方法叫做響應(yīng)式api,下面這篇文章主要給大家介紹了關(guān)于vue3響應(yīng)式對象api的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • webpack + vue 打包生成公共配置文件(域名) 方便動態(tài)修改

    webpack + vue 打包生成公共配置文件(域名) 方便動態(tài)修改

    這篇文章主要介紹了webpack + vue 打包生成公共配置文件(域名) 方便動態(tài)修改,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • vue項目中路徑使用@和~的區(qū)別及說明

    vue項目中路徑使用@和~的區(qū)別及說明

    這篇文章主要介紹了vue項目中路徑使用@和~的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue2與vue3下如何訪問使用public下的文件

    vue2與vue3下如何訪問使用public下的文件

    這篇文章主要介紹了vue2與vue3下如何訪問使用public下的文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解webpack + vue + node 打造單頁面(入門篇)

    詳解webpack + vue + node 打造單頁面(入門篇)

    本篇文章主要介紹了詳解webpack + vue + node 打造單頁面(入門篇) ,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • vue-cli 3.0 版本與3.0以下版本在搭建項目時的區(qū)別詳解

    vue-cli 3.0 版本與3.0以下版本在搭建項目時的區(qū)別詳解

    這篇文章主要介紹了vue-cli 3.0 版本與3.0以下版本在搭建項目時的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Vue調(diào)試神器vue-devtools安裝方法

    Vue調(diào)試神器vue-devtools安裝方法

    本篇文章主要介紹了Vue調(diào)試神器vue-devtools安裝方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Vue學習筆記進階篇之單元素過度

    Vue學習筆記進階篇之單元素過度

    這篇文章主要介紹了Vue學習筆記進階篇之單元素過度,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Vue 實現(xiàn)雙向綁定的四種方法

    Vue 實現(xiàn)雙向綁定的四種方法

    這篇文章主要介紹了Vue 實現(xiàn)雙向綁定的四種方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • JavaScript 沙箱探索

    JavaScript 沙箱探索

    這篇文章主要介紹了JavaScript 沙箱探索,沙箱是基于 event bus 形式的通信實現(xiàn)上層的功能,文章的例子選擇接口實現(xiàn)了 web worker 與 quickjs 的 EventEmitter,,需要的朋友可以參考一下
    2021-10-10

最新評論

海丰县| 苍南县| 綦江县| 武陟县| 什邡市| 孝昌县| 连云港市| 石棉县| 霍邱县| 阿尔山市| 韶关市| 长顺县| 临沭县| 辉南县| 新竹县| 盖州市| 兴文县| 姚安县| 繁昌县| 仁寿县| 桐梓县| 略阳县| 灵山县| 花垣县| 山东省| 玉门市| 中超| 河西区| 青浦区| 绥阳县| 康乐县| 大竹县| 抚顺县| 平罗县| 延吉市| 通海县| 黔江区| 桃园县| 轮台县| 叶城县| 金乡县|