搜尋
首頁web前端Vue.js帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

這篇文章帶大家了解一下vue2中的 v-model,看看v-model 是雙向綁定還是單向資料流,如何讓你開發的元件支援 v-model,希望對大家有所幫助。

帶你深入了解vue2中的 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 元素:

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

  • ##select 下拉方塊:

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

  • #input type='radio' 單選方塊:

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

  • input type='checkbox' 多重選取方塊:

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法##在程式設計思想上,這種幫助使用者『隱藏細節』的方式叫做

封裝

二、v-model 只是語法糖嗎? (冷知識)

v-model

不只是語法糖,它還有副作用。

副作用如下:
如果

v-model 綁定的是響應式物件上某個不存在的屬性,那麼vue 會悄悄地增加這個屬性,並讓它響應式。 舉個例子,看下面的程式碼:

// template中:
<el-input v-model="user.tel"></el-input>
// script中:
export default {
  data() {
    return {
      user: {
        name: &#39;公众号: 前端要摸鱼&#39;,
      }
    }
  }
}

響應式資料中沒有定義

user.tel

屬性,但template裡卻用v-model 綁定了user.tel,猜一猜當你輸入時會發生什麼事? 看效果:


帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法揭曉答案:

user

上會新增tel 屬性,並且tel 這個屬性還是響應式的。 這就是『副作用』帶來的效果,你學會了嗎?

三、

v-model

是雙向綁定還是單向資料流? 2.1

v-model

是雙向綁定嗎?

是,官方說是。

『你可以用v-model 指令在表單

<textarea></textarea><select></select> 元素上建立雙向資料綁定。 』 —— vue2官方文件2.2 那

v-model

是單向資料流嗎?

是的,它甚至是單向資料流的典型範式。

雖然官方沒有明確表示這一點,但我們可以捋一捋兩者的關係。

什麼是單項資料流?
  • 子元件不能改變父元件傳遞給它的
prop

屬性,建議的做法是它拋出事件,通知父元件自行改變綁定的值。

    v-model
  • 的做法是怎麼樣的?
v-model

做法完全符合單一項目資料流。甚至於,它給出了一種在命名和事件定義上的規範。 <p>众所周知 <code>.sync 修饰符是单向数据流的另一个典型范式。

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

『单向数据流』总结起来其实也就8个字:『数据向下,事件向上』。

四、如何让你开发的组件支持 v-model

虽然不想说,但这确实是高频面试题。

在定义 vue 组件时,你可以提供一个 model 属性,用来定义该组件以何种方式支持 v-model

model 属性本身是有默认值的,如下:

// 默认的 model 属性
export default {
  model: {
    prop: &#39;value&#39;,
    event: &#39;input&#39;
  }
}

也就是说,如果你不定义 model 属性,或者你按照当面方法定义属性,当其他人使用你的自定义组件时,v-model="foo" 就完全等价于 :value="foo" 加上 @input="foo = $event"

如果把 model 属性进行一些改装,如下:

// 默认的 model 属性
export default {
  model: {
    prop: &#39;ame&#39;,
    event: &#39;zard&#39;
  }
}

那么,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: &#39;ame&#39;, // 代表 v-model 绑定的prop名
    event: &#39;zard&#39; // 代码 v-model 通知父组件更新属性的事件名
  },
  methods: {
    playDota2(step) {
      const newYear = this.ame + step
      this.$emit(&#39;zard&#39;, newYear)
    }
  }
}
</script>

然后我们在父组件中使用该组件:

// template中
<dota v-model="ti"></dota>
// script中
export default {
  data() {
    return {
      ti: 8
    }
  }
}

看看效果:

帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

让你的组件支持 v-model 就这么容易。

五、demo和源码

获取源码请访问github 

https://github.com/zhangshichun/blog-vue2-demos/tree/master/src/views/about-v-model

更多编程相关知识,请访问:编程视频!!

以上是帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
當vue.js虛擬DOM檢測變化時會發生什麼?當vue.js虛擬DOM檢測變化時會發生什麼?May 14, 2025 am 12:12 AM

whenthevue.jsvirtualdomdetectschange,itupdatesthevirlualdom,diffsit和appliesminimalchangeStothereAldom.thisprocessensuresrocessensureshighhighpperformance byformance byavoidingunnnnnnnnnnneclastory dommaniplastions。

將Vue.js的虛擬DOM視為真實DOM的鏡像是多麼準確?將Vue.js的虛擬DOM視為真實DOM的鏡像是多麼準確?May 13, 2025 pm 04:05 PM

Vue.js的VirtualDOM既是真實DOM的鏡像,又不完全是。 1.創建和更新:Vue.js基於組件定義創建VirtualDOM樹,狀態變化時先更新VirtualDOM。 2.差異和修補:通過diff操作比較新舊VirtualDOM,僅將最小變化應用到真實DOM。 3.效率:VirtualDOM允許批量更新,減少直接DOM操作,優化渲染過程。 VirtualDOM是Vue.js優化UI更新的戰略工具。

vue.js vs.反應:可伸縮性和可維護性vue.js vs.反應:可伸縮性和可維護性May 10, 2025 am 12:24 AM

Vue.js和React在可擴展性和可維護性上的表現各有優勢。 1)Vue.js易於上手,適合小型項目,CompositionAPI提升了大型項目可維護性。 2)React適用於大型複雜項目,Hooks和虛擬DOM提高了性能和可維護性,但學習曲線較陡峭。

vue.js和React的未來:趨勢和預測vue.js和React的未來:趨勢和預測May 09, 2025 am 12:12 AM

Vue.js和React的未來趨勢和預測分別是:1)Vue.js將在企業級應用中廣泛應用,並在服務端渲染和靜態站點生成方面有突破;2)React將在服務器組件和數據獲取方面創新,並進一步優化並發模式。

Netflix的前端:深入研究其技術堆棧Netflix的前端:深入研究其技術堆棧May 08, 2025 am 12:11 AM

Netflix的前端技術棧主要基於React和Redux。 1.React用於構建高性能的單頁面應用,通過組件化開發提升代碼重用性和維護性。 2.Redux用於狀態管理,確保狀態變化可預測和可追踪。 3.工具鏈包括Webpack、Babel、Jest和Enzyme,確保代碼質量和性能。 4.性能優化通過代碼分割、懶加載和服務端渲染實現,提升用戶體驗。

vue.js和前端:構建交互式用戶界面vue.js和前端:構建交互式用戶界面May 06, 2025 am 12:02 AM

Vue.js是一種漸進式框架,適用於構建交互性強的用戶界面。其核心功能包括響應式系統、組件化開發和路由管理。 1)響應式系統通過Object.defineProperty或Proxy實現數據監聽,自動更新界面。 2)組件化開發允許將界面拆分為可複用的模塊。 3)VueRouter支持單頁面應用,提升用戶體驗。

Vuejs的缺點是什麼?Vuejs的缺點是什麼?May 05, 2025 am 12:06 AM

Vue.js的主要缺點包括:1.生態系統相對較新,第三方庫和工具不如其他框架豐富;2.學習曲線在復雜功能上變得陡峭;3.社區支持與資源不如React和Angular廣泛;4.大型應用中可能遇到性能問題;5.版本升級與兼容性挑戰較大。

Netflix:揭開其前端框架Netflix:揭開其前端框架May 04, 2025 am 12:16 AM

Netflix使用React作為其前端框架。 1.React的組件化開發和虛擬DOM機制提高了性能和開發效率。 2.使用Webpack和Babel優化代碼構建和部署。 3.採用代碼分割、服務端渲染和緩存策略進行性能優化。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具