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

vue 表單輸入格式化中文輸入法異常問(wèn)題

 更新時(shí)間:2018年05月30日 08:25:48   作者:張躍遷  
v-model 是 vue.js 提供的語(yǔ)法糖,根據(jù)不同的表單控件監(jiān)聽(tīng)不同的事件,實(shí)現(xiàn)對(duì)表單控件的數(shù)據(jù)雙向綁定。這篇文章主要介紹了vue 表單輸入格式化中文輸入法異常,需要的朋友可以參考下

v-model 是 vue.js 提供的語(yǔ)法糖,根據(jù)不同的表單控件監(jiān)聽(tīng)不同的事件,實(shí)現(xiàn)對(duì)表單控件的數(shù)據(jù)雙向綁定。

當(dāng)控件是 <input> 輸入框時(shí),v-model 監(jiān)聽(tīng)其 input 事件。

如下所示,這兩種寫(xiě)法有什么區(qū)別嗎?

<input :value="name" @input="name = $event.target.value"><input v-model="name">

輸入中文格式化問(wèn)題

表單輸入常見(jiàn)需求:對(duì)<input>控件輸入的內(nèi)容進(jìn)行格式化,譬如:轉(zhuǎn)成大寫(xiě)字母。如果輸入的值包含中文,格式化就會(huì)引起輸入法異常。

如下圖所示,也可以在線嘗試

如果使用 v-model 指令實(shí)現(xiàn)數(shù)據(jù)雙向綁定,就不會(huì)出現(xiàn)輸入法異常,如下圖所示,也可以在線嘗試

上面的問(wèn)題,可以看出 v-model 不只是給變量賦值,那么,它還做了些什么呢?

v-model 源碼分析

本文參考的 vue.js 源代碼是 2.5.16

翻看 v-model 源碼,可以看到 v-model 關(guān)注的仍然是 input 事件

input 事件綁定的回調(diào)代碼處理,如下:

這里可以看到,v-model 判斷了 composing 屬性,當(dāng)輸入法組合沒(méi)有結(jié)束的時(shí)候,直接返回,并沒(méi)有賦值。

composing 屬性并不是標(biāo)準(zhǔn) dom 元素屬性,那它是怎么來(lái)的呢?

這里可以看出,composing 屬性是 vue.js 添加到 dom 節(jié)點(diǎn)上的。

那么,是什么地方調(diào)用了這2個(gè)函數(shù)呢?可以看到,在插入dom節(jié)點(diǎn)時(shí),vue.js 監(jiān)聽(tīng)了 compositionstart / compositionend 事件

compositionstart / compositionend 這2個(gè) dom 事件,瀏覽器兼容性問(wèn)題可以查閱 MDN 說(shuō)明:

compositionstart 事件

compostionend 事件

源代碼中還發(fā)現(xiàn),在是否刷新 dom 屬性值時(shí),也用到了 composing 屬性:

這里可以看出,在輸入法組合過(guò)程中,vue.js 變量值的更新亦不會(huì)同步到 dom元素的 value 屬性。

綜上所述:

v-model 實(shí)際上是監(jiān)聽(tīng)了 <input> 控件的 input、compositionstart、compositionend 三個(gè)事件,在輸入法組合過(guò)程中就直接返回不賦值v-model 指令設(shè)置了變量 composing,此標(biāo)識(shí)還用于判斷是否更新 dom元素的 value 屬性

v-model 輸入中文觸發(fā)的事件

從上面源代碼分析可知,v-model 綁定 <input> 輸入中文時(shí),實(shí)際觸發(fā)的事件如下:

compositionstart => 3個(gè) input => compositionend 事件,這些都是 <input>控件觸發(fā)的。最后一個(gè) input 事件,是源代碼里面看到的 onCompositionEnd 回調(diào)里面 vue.js 觸發(fā)的。

1、compositionstart事件

修改dom對(duì)象的composing屬性為 true

2、3個(gè)input事件

由于dom對(duì)象的composing屬性為true,不會(huì)賦值,直接返回。

3、compositioinend事件

修改dom對(duì)象的composing屬性為 false

4、vue.js觸發(fā)的 input事件

由于dom對(duì)象的composing屬性為false,賦值,修改相應(yīng)變量的值。

格式化問(wèn)題原因分析

再次看下文章開(kāi)頭的示例,如果使用 v-model 指令實(shí)現(xiàn)數(shù)據(jù)雙向綁定,就不會(huì)出現(xiàn)輸入法異常,如下圖所示,也可以在線嘗試

由前面的分析可知:

v-model 指令設(shè)置了變量 composing,雖然代碼在 format 函數(shù)里更改了 this.name 的值,但此時(shí) composing 標(biāo)識(shí)阻止了將 this.name 的值同步給 input 元素的 value 屬性如果你感興趣的話,可以修改 vue.js 的源代碼,將 shouldUpdateValue 函數(shù)里對(duì) composing 屬性的判斷去掉,可以看到輸入法又跟之前一樣異常了

格式化問(wèn)題 bugfix

再次看下文章開(kāi)頭的示例,如果使用 :value, @input 實(shí)現(xiàn)數(shù)據(jù)雙向綁定,有兩個(gè)方案可以解決中文輸入異常的問(wèn)題。

方案一:監(jiān)聽(tīng) change 事件

等輸入結(jié)束失去焦點(diǎn)以后,再調(diào)用格式化方法,如下所示,也可以在線嘗試

方案二:監(jiān)聽(tīng) input 事件,同時(shí)判斷輸入法組合過(guò)程

在輸入法組合過(guò)程中,不進(jìn)行格式化,如下所示,也可以在線嘗試

總結(jié)

以上所述是小編給大家介紹的vue 表單輸入格式化中文輸入法異常問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 淺析Vue2/Vue3中響應(yīng)式的原理

    淺析Vue2/Vue3中響應(yīng)式的原理

    這篇文章主要是來(lái)和大家一起討論一下Vue2與Vue3中響應(yīng)式的原理,文中的相關(guān)示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解Vue有一定的幫助,需要的可以參考下
    2023-07-07
  • vue.js Router中嵌套路由的實(shí)用示例

    vue.js Router中嵌套路由的實(shí)用示例

    這篇文章主要給大家介紹了關(guān)于vue.js Router中嵌套路由的相關(guān)資料,所謂嵌套路由就是路由里面嵌套他的子路由,文章通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-06-06
  • 如何實(shí)現(xiàn)vue加載指令 v-loading

    如何實(shí)現(xiàn)vue加載指令 v-loading

    在日常的開(kāi)發(fā)中,加載效果是非常常見(jiàn)的,但是怎么才能方便的使用,本文介紹如何實(shí)現(xiàn)vue加載指令 v-loading,感興趣的朋友一起看看吧
    2024-01-01
  • webpack dev-server代理websocket問(wèn)題

    webpack dev-server代理websocket問(wèn)題

    這篇文章主要介紹了webpack dev-server代理websocket問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Vue手寫(xiě)防抖和節(jié)流函數(shù)代碼詳解

    Vue手寫(xiě)防抖和節(jié)流函數(shù)代碼詳解

    在Vue中函數(shù)的防抖和節(jié)流不是什么新鮮話題,這篇文章主要給大家介紹了關(guān)于Vue3中防抖/節(jié)流的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • vue項(xiàng)目配置sass及引入外部scss文件方式

    vue項(xiàng)目配置sass及引入外部scss文件方式

    這篇文章主要介紹了vue項(xiàng)目配置sass及引入外部scss文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • webpack4+Vue搭建自己的Vue-cli項(xiàng)目過(guò)程分享

    webpack4+Vue搭建自己的Vue-cli項(xiàng)目過(guò)程分享

    這篇文章主要介紹了webpack4+Vue搭建自己的Vue-cli,對(duì)于vue-cli的強(qiáng)大,使用過(guò)的人都知道,極大的幫助我們降低了vue的入門(mén)門(mén)檻,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • vue實(shí)現(xiàn)input框禁止輸入標(biāo)簽

    vue實(shí)現(xiàn)input框禁止輸入標(biāo)簽

    這篇文章主要介紹了vue實(shí)現(xiàn)input框禁止輸入標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中的install方法使用

    vue中的install方法使用

    這篇文章主要介紹了vue中的install方法使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻

    VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻

    這篇文章主要介紹了VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

隆化县| 安图县| 河间市| 和硕县| 马尔康县| 湛江市| 会理县| 丰都县| 临沧市| 晋宁县| 信丰县| 龙井市| 灵石县| 尖扎县| 临澧县| 中方县| 大丰市| 石嘴山市| 麻栗坡县| 中牟县| 安化县| 灵寿县| 石台县| 锦屏县| 庆安县| 定襄县| 康乐县| 望都县| 青阳县| 即墨市| 加查县| 三都| 股票| 潞城市| 舞阳县| 靖远县| 北川| 滦平县| 沙田区| 河曲县| 崇仁县|