這篇文章帶大家了解一下vue2中的 v-model,看看v-model 是雙向綁定還是單向資料流,如何讓你開發的元件支援 v-model,希望對大家有所幫助。
閱讀這篇文章
你將:
- #弄清楚:
v-model
是什麼的文法糖?vue2
對原生元件究竟做了什麼特殊處理? - 弄清楚:
v-model
到底是單向資料流還是資料雙向綁定? - 弄清楚:
v-model
在語法糖之外的『副作用』? - 學習如何讓你的元件也支援
v-model
語法。
一、v-model
的本質是語法糖。
『
v-model
本質上不過是語法糖。它負責監聽用戶的輸入事件以更新數據,並對一些極端場景進行一些特殊處理。 ’ -- 官方文件。 【相關推薦:vue.js教學】
什麼是語法糖?
語法糖,簡單來說就是『便捷寫法』。
在大部分情況下, v-model="foo"
等價於:value="foo"
加上 @input ="foo = $event"
;
<!-- 在大部分情况下,以下两种写法是等价的 --> <el-input v-model="foo" /> <el-input :value="foo" @input="foo = $event" />
沒錯,在大部分情況下如此。
但也有例外:
vue2
為元件提供了model
屬性,可以讓使用者自訂傳值的prop名稱和更新值的事件名稱。這個暫且略過,第四節會細說。對於原生
html
原生元素,vue
幹了大量『髒活兒』,目的是為了能讓我們忽略html
在api上的差異性。下列元素的左右兩種寫法是等價的:-
textarea
元素:
- ##select
下拉方塊:
- #input type='radio'
單選方塊:
- input type='checkbox'
多重選取方塊:
##在程式設計思想上,這種幫助使用者『隱藏細節』的方式叫做
。 二、v-model 只是語法糖嗎? (冷知識)
v-model如果不只是語法糖,它還有副作用。
副作用如下:
v-model 綁定的是響應式物件上某個不存在的屬性,那麼vue
會悄悄地增加這個屬性,並讓它響應式。 舉個例子,看下面的程式碼:
// template中: <el-input v-model="user.tel"></el-input> // script中: export default { data() { return { user: { name: '公众号: 前端要摸鱼', } } } }
響應式資料中沒有定義
user.tel 屬性,但template
裡卻用v-model
綁定了user.tel
,猜一猜當你輸入時會發生什麼事? 看效果:
揭曉答案:
上會新增tel
屬性,並且tel
這個屬性還是響應式
的。 這就是『副作用』帶來的效果,你學會了嗎?
三、
v-model 是雙向綁定還是單向資料流?
2.1
v-model 是雙向綁定嗎?
是,官方說是。 『你可以用v-model 指令在表單
、<textarea></textarea>
和<select></select>
元素上建立雙向資料綁定。 』 —— vue2官方文件2.2 那
是單向資料流嗎?
是的,它甚至是單向資料流的典型範式。 雖然官方沒有明確表示這一點,但我們可以捋一捋兩者的關係。什麼是單項資料流?
- 子元件不能改變父元件傳遞給它的
屬性,建議的做法是它拋出事件,通知父元件自行改變綁定的值。
- v-model
- 的做法是怎麼樣的?
做法完全符合單一項目資料流。甚至於,它給出了一種在命名和事件定義上的規範。 <p>众所周知 <code>.sync
修饰符是单向数据流的另一个典型范式。
『单向数据流』总结起来其实也就8个字:『数据向下,事件向上』。
四、如何让你开发的组件支持 v-model
虽然不想说,但这确实是高频面试题。
在定义 vue
组件时,你可以提供一个 model
属性,用来定义该组件以何种方式支持 v-model
。
model
属性本身是有默认值的,如下:
// 默认的 model 属性 export default { model: { prop: 'value', event: 'input' } }
也就是说,如果你不定义 model
属性,或者你按照当面方法定义属性,当其他人使用你的自定义组件时,v-model="foo"
就完全等价于 :value="foo"
加上 @input="foo = $event"
。
如果把 model
属性进行一些改装,如下:
// 默认的 model 属性 export default { model: { prop: 'ame', event: 'zard' } }
那么,v-model="foo"
就等价于 :ame="foo"
加上 @zard="foo = $event"
。
没错,就是这么容易,让我们看个例子。
先定义一个自定义组件:
<template> <div> 我们是TI{{ ame }}冠军 <el-button @click="playDota2(1)">加</el-button> <el-button @click="playDota2(-1)">减</el-button> </div> </template> <script> export default { props: { ame: { type: Number, default: 8 } }, model: { // 自定义v-model的格式 prop: 'ame', // 代表 v-model 绑定的prop名 event: 'zard' // 代码 v-model 通知父组件更新属性的事件名 }, methods: { playDota2(step) { const newYear = this.ame + step this.$emit('zard', newYear) } } } </script>
然后我们在父组件中使用该组件:
// template中 <dota v-model="ti"></dota> // script中 export default { data() { return { ti: 8 } } }
看看效果:
让你的组件支持 v-model
就这么容易。
五、demo和源码
获取源码请访问github
https://github.com/zhangshichun/blog-vue2-demos/tree/master/src/views/about-v-model
更多编程相关知识,请访问:编程视频!!
以上是帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

vue2与vue3中生命周期执行顺序区别生命周期比较vue2中执行顺序beforeCreate=>created=>beforeMount=>mounted=>beforeUpdate=>updated=>beforeDestroy=>destroyedvue3中执行顺序setup=>onBeforeMount=>onMounted=>onBeforeUpdate=>onUpdated=>onBeforeUnmount=&g

在Vue中,v-model是用来实现双向绑定的一个重要指令,它可以让我们很方便地将用户输入的内容同步到Vue的data属性中。但是在一些情况下,我们需要对数据进行转换,比如将用户输入的字符串类型转换成数字类型,这时候就需要使用v-model的.number修饰符来实现。v-model.number的基本用法v-model.number是v-model的一个修

diff算法是一种通过同层的树节点进行比较的高效算法,避免了对树进行逐层搜索遍历。那么大家对diff算法吗有多少了解?下面本篇文章就来带大家深入解析下vue2的diff算法,希望对大家有所帮助!

解决Vue报错:无法使用v-model进行双向数据绑定在使用Vue进行开发时,经常会使用v-model指令来实现双向数据绑定,但有时候我们会遇到一个问题,就是在使用v-model时会报错,无法正确进行双向数据绑定。这可能是由于一些常见的错误导致的,下面我将介绍几种常见的情况以及相应的解决方法。组件的props属性未正确设置当我们在使用组件时,如果需要通过v-

Vue报错:无法正确使用v-model进行双向数据绑定,如何解决?引言:在使用Vue进行开发时,双向数据绑定是一项非常常见且强大的功能。然而,有时候我们可能会遇到一个问题,就是当我们尝试使用v-model进行双向数据绑定时,却遭遇到了报错。本文将介绍该问题的原因以及解决方案,并通过代码示例来演示如何解决该问题。问题描述:当我们在Vue中尝试使用v-model

如何解决Vue报错:无法正确使用v-model进行双向数据绑定引言:Vue是一种流行的前端框架,它提供了许多方便的功能,其中包括v-model指令用于实现双向数据绑定。然而,有时候我们在使用v-model时可能会遇到一些错误,特别是在处理复杂的数据结构时。本文将介绍几种常见的v-model错误,并提供解决方案和代码示例。错误:v-model与对象属性的双向绑

Vue中使用v-model的双向绑定优化应用的数据性能在Vue中,我们经常使用v-model指令来实现表单元素与数据之间的双向绑定。这种双向绑定的方式极大地简化了开发过程,并提高了用户体验。然而,由于v-model需要监听表单元素的input事件,当数据量较大时,这种双向绑定可能会带来一定的性能问题。本文将介绍如何优化使用v-model时的数据性能,并提供一

Vue中可以使用v-model指令来实现数据双向绑定,下面本篇文章就来带大家了解一下v-model指令,希望对大家有所帮助!


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器