国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

element-ui :封裝el-input 遇到的問題

這篇具有很好參考價值的文章主要介紹了element-ui :封裝el-input 遇到的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

因項目中有多處輸入框要求只能輸入整數(shù)或者浮點數(shù), el-input 設(shè)置type=number 火狐瀏覽器這個屬性是無效的; 所以就想到了 使用el-input type=text 輸入的時候 正則匹配, 只能輸入整數(shù)或者浮點數(shù); 所以為了方便使用,需要對第三方庫el-input 進(jìn)行封裝。

1. 初始封裝的組件Number-input.vue 代碼如下:

<template>
    <el-input 
    :value="value" 
    v-bind="$attrs"
    type="text" 
    @input="handleInput"
    />

</template>
<script>
import Big from 'big.js';
    export default {
        inheritAttrs: false,
        props: {
            value: {
                type: String | Number,
                default: ''
            },
            precision: {
                type: Number,
                validator(val) {
                    return val >= 0 && val === parseInt(val, 10);
                }
            },
            minPrecision: {
                type: Number,
                validator(val) {
                    return val >= 0 && val === parseInt(val, 10);
                }
            },
            maxPrecision: {
                type: Number,
                default: Infinity,
                validator(val) {
                    return val >= 0 &&(val === parseInt(val, 10) || val === Infinity);
                }
            },
            isNumber: {
                type: Boolean,
                default: false
            },
            max: {
                type: String | Number,
                default: Infinity
            },
            min: {
                type: String | Number,
                default: -Infinity
            }
        },
        methods: {
            handleInput(val) {
                console.log('ssssss===', val)
                let reg = ''
                if(this.maxPrecision === Infinity) {
                    // this.$emit('input', val)
                   reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,20})?).*$`, 'g')
                    this.$emit('input', val.replace(reg ,'$1'))
                } else if(this.maxPrecision >= 0) {
                    //  正則不能輸入最大位數(shù)
                   reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,${this.maxPrecision}})?).*$`, 'g')
                    this.$emit('input', val.replace(reg ,'$1'))
                }
                val = val.replace(reg ,'$1')
                this.$emit('input', val)
                console.log('ssssss結(jié)束===', val)
            },
            handleInputChange(val) {
                console.log('handleInputChange====',  val, this.precision)
                let newV = isNaN(val) ? '' : (val ? val.toString() : '')
                if(newV) {
                    newV = this.getNewValue(val.toString())
                }
                this.$emit('input', newV)
            },
            getNewValue(val) {
                // 根據(jù)精度獲取冪次數(shù), 獲取精度整數(shù)位 利用math.round 四舍五入  轉(zhuǎn)成float類型 再除以相同的10次冪 1.345直接利用tofixed(2) 取2位精度 會有問題 
                let newV = ''
                let bigNewV = new Big(val)
                let precisionArray = val.split('.')
                let precision = precisionArray?.[1]?.length??0
                if(this.minPrecision >= precision) {
                    newV = bigNewV.toFixed(this.minPrecision)
                } else {
                    newV = bigNewV.toFixed(precision)
                }
                return newV
            }
        }
    
    }
</script>

封裝第三方組件主要用到 $atrrs 和?$listeners?

v-bind="$attrs" v-on="$listeners"?

?$atrrs:接收父組件傳過來的非class 和 style , 并且未在props? 中注冊使用的屬性?

$listeners :接收父組件傳過來的非native 的事件

(注:.native 事件是父組件本身的事件, 在vue 中.native 只能用于組件上,.native 修飾符的作用是:在一個組件的根元素上直接監(jiān)聽一個原生事件; 原生的標(biāo)簽上不能使用 比如直接在<input @input.native='xxx' /> 會報錯)

2. 父組件 Add.vue? 中使用

 <NumberInput 
:maxPrecision="0" 
v-model="quantity" 
placeholder="請輸入" 
clearable />

?上述使用目前為止都是正常的;

然后突然發(fā)現(xiàn)另外一個同事使用的時候 ,出現(xiàn)了問題!??!

在封裝的組件Number-input.vue中多寫一個屬性為了接收父組件傳過來的事件再傳給下一級:v-on="$listeners"

<template>
    <el-input 
    :value="value" 
    v-bind="$attrs"
    v-on="$listeners"
    type="text" 
    @input="handleInput"
    />

</template>

和上述對比 導(dǎo)致除了數(shù)字其他還能輸入

原因就是 el-input 源碼中 通過?v-on="$listeners" 接收了 業(yè)務(wù)組件Add.vue 傳過來的事件, Add.vue 使用v-model 實現(xiàn)雙向綁定, 默認(rèn)有一個input 事件; 所以 當(dāng)輸入框輸入數(shù)據(jù)的時候 , el-input 源碼 中 觸發(fā)input 事件, 同時向外觸發(fā)?this.$emit('input', event.target.value) , 這個會先后觸發(fā)Number-input.vue 和 Add.vue 中的 input事件; Add.vue中默認(rèn)的input 事件接收的是 el-input 源碼中傳過來的原始值,會覆蓋掉 Number-input.vue 中傳過來的值,?最終v-model 中的值接收的也是el-input 源碼中傳過來的原始值.?

el-input 源碼
handleInput(event) {
        // should not emit input during composition
        // see: https://github.com/ElemeFE/element/issues/10516
        if (this.isComposing) return;

        // hack for https://github.com/ElemeFE/element/issues/8548
        // should remove the following line when we don't support IE
        if (event.target.value === this.nativeInputValue) return;
        console.log('el-input input事件====', event)

        this.$emit('input', event.target.value);

        // ensure native input value is controlled
        // see: https://github.com/ElemeFE/element/issues/12850
        this.$nextTick(this.setNativeInputValue);
      },

知道了原因所在,如何修復(fù)該問題:

1. Number-input 組件中的@input 和 @change事件 添加.native , 這樣的話 el-input 源碼中的 $emit('input' 就不會觸發(fā)這兩個事件 ; 這兩個事件 會添加到 組件的根元素上 ; 看 el-input 源碼可知 會添加到最外層的div 上; 然后 當(dāng)我們輸入數(shù)據(jù)的時候 ,首先$emit('input' 觸發(fā)的是Add.vue 中的input 事件改變value 值;接著?通過冒泡 會觸發(fā)父元素上的input 和 change事件, 在這 兩個事件中 手動又去觸發(fā)了 add.vue 中的input 事件(這個主要是自己怎么寫), 改變了 value 值, 最終改了輸入框的值

2. Number-input.vue中監(jiān)聽value 值的變化 類似下面: 但是這種 不能 區(qū)分是input 還是change事件文章來源地址http://www.zghlxwxcb.cn/news/detail-436664.html

watch: {
            value: {
                handler(val, oldV) {
                    let reg = ''
                    if(this.maxPrecision === Infinity) {
                        // this.$emit('input', val)
                    reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,20})?).*$`, 'g')
                        this.$emit('input', val.replace(reg ,'$1'))
                    } else if(this.maxPrecision >= 0) {
                        //  正則不能輸入最大位數(shù)
                    reg  = new RegExp(`^\\D*(\\d*(?:\\.\\d{0,${this.maxPrecision}})?).*$`, 'g')
                        this.$emit('input', val.replace(reg ,'$1'))
                    }
                    val = val.replace(reg ,'$1')
                    this.$emit('input', val)
                }
            }
        },

到了這里,關(guān)于element-ui :封裝el-input 遇到的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Element UI 中el-input 框回車觸發(fā)頁面刷新問題及解決

    問題描述 當(dāng)el-input 獲取焦點后按到回車按鈕會刷新當(dāng)前頁面 問題解決 在el-form標(biāo)簽增加表單事件@submit.native.prevent,防止搜索框回車鍵刷新整個頁面

    2024年02月09日
    瀏覽(18)
  • 解決:element ui表格表頭自定義輸入框單元格el-input不能輸入問題

    解決:element ui表格表頭自定義輸入框單元格el-input不能輸入問題

    表格表頭如圖所示,有 40-45,45-50 數(shù)據(jù),且以輸入框形式呈現(xiàn),現(xiàn)想修改其數(shù)據(jù)或點擊右側(cè)加號增加新數(shù)據(jù)編輯。結(jié)果不能輸入,部分代碼如下 我看在這一塊 template 中不需要用到 scope 去獲取數(shù)據(jù),于是沒有加上 slot-scope=\\\"scope\\\" 結(jié)果不能輸入,解決方法就是在表頭自定義時將

    2024年02月03日
    瀏覽(36)
  • 解決使用element ui時el-input的屬性type=number,仍然可以輸入e的問題。

    使用element ui時el-input的屬性type=number,仍然可以輸入e, 其他的中文特殊字符都不可以輸入,但是只有e是可以輸入的,原因是e也輸入作為科學(xué)計數(shù)法的時候,e是可以被判定為數(shù)字的, 但是有些場景是需要把e這種情況屏蔽掉的,我們可以使用如下的方法。 在進(jìn)行鍵盤事件輸入

    2024年02月08日
    瀏覽(23)
  • element ui中的el-input回車鍵事件

    今天項目里面的登錄頁面,需要按鍵盤回車鍵就直接登錄,但是測試的時候,按了回車鍵后,直接刷新頁面了,這不是我想要的,之后網(wǎng)上查了一下 代碼如下: 上面的寫法沒問題,但是這樣又會出現(xiàn)一個問題,當(dāng)form表單中只有一個input框時,按回車鍵,頁面還是刷新的。 之

    2024年02月11日
    瀏覽(27)
  • Element UI el-input 只能輸入大于0的正整數(shù)

    當(dāng)輸入值以0開頭或者不為0-9的整數(shù)時,則用\\\' \\\'替換掉(/g表示全局匹配,則所有匹配項都會被替換掉),效果為不能輸入以0開頭或不為正整數(shù)的值。

    2024年02月14日
    瀏覽(28)
  • Element UI 中 el-input 標(biāo)簽去掉邊框的一種辦法

    最近在做一個簡單的頁面,想把 el-input 去掉邊框,在網(wǎng)上找了很多方法,最終發(fā)現(xiàn)下邊這種方法是可行的: HTML代碼: 樣式代碼如下: 注意這里的樣式語言用的是 less,其深度穿透寫法是 /deep/。 由此便可去除 el-input 的外邊框。

    2024年02月16日
    瀏覽(22)
  • element ui el-input輸入框type=number去掉上下箭頭

    使用vue框架寫法 如果是input標(biāo)簽type=number,將上述css代碼中 ::v-deep 去掉即可

    2024年02月12日
    瀏覽(28)
  • element-ui問題合集(el-input-number加減一次就失效,el-select同時收集id與name)

    element-ui問題合集(el-input-number加減一次就失效,el-select同時收集id與name)

    將id與name拼接成字符串,賦值給value,在使用時,獲取value后,再使用split()方法進(jìn)行分割 將el-input-number的v-model綁定對象之后,發(fā)現(xiàn)加減一次后就失效 ?

    2024年02月07日
    瀏覽(17)
  • Element plus中el-input 框回車觸發(fā)頁面刷新問題及解決方案

    Element plus中el-input 框回車觸發(fā)頁面刷新問題及解決方案

    技術(shù):vue3+element plus的UI框架 今天做了一個小小的功能,就是基于elementUi框架的一個輸入框,需要監(jiān)聽輸入框的回車事件,然后調(diào)取接口。 代碼如下: 在輸入框回車后會刷新頁面,查詢的原因如下 在 el-form 里加上 @submit.prevent , input輸入框里可以使用 @keyup.enter 監(jiān)聽回車事件

    2024年02月15日
    瀏覽(44)
  • 【踩坑筆記】vue3 element-plus el-input 無法輸入問題

    原因是 el-form 的 v-model=\\\"loginForm\\\" ref=\\\"loginForm\\\" 在vue3中值不能相同 把ref去掉或者改名即可 這是js的代碼( 對象記得用reactive,不然也會無法輸入 ) 這個是可以輸入的 這是無法輸入的 就改了個ref

    2024年02月11日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包