目錄
閱讀這篇文章
一、v-model 的本質是語法糖。
是雙向綁定還是單向資料流? 2.1
是雙向綁定嗎?
是單向資料流嗎?
四、如何让你开发的组件支持 v-model
五、demo和源码
首頁 web前端 Vue.js 帶你深入了解vue2中的 v-model,看看如何讓元件支援該語法

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

Jan 04, 2022 pm 07:11 PM
v-model vue2

這篇文章帶大家了解一下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><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

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
vue2與vue3中的生命週期執行順序有何不同 vue2與vue3中的生命週期執行順序有何不同 May 16, 2023 pm 09:40 PM

vue2與vue3中生命週期執行順序區別生命週期比較vue2中執行順序beforeCreate=>created=>beforeMount=>mounted=>beforeUpdate=>updated=>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore> onBeforeUpdate=>onUpdated=>onBeforeUnmount=&g

Vue中如何使用v-model.number實現輸入框的資料類型轉換 Vue中如何使用v-model.number實現輸入框的資料類型轉換 Jun 11, 2023 am 08:54 AM

在Vue中,v-model是用來實現雙向綁定的一個重要指令,它可以讓我們很方便地將使用者輸入的內容同步到Vue的data屬性中。但是在某些情況下,我們需要對資料進行轉換,例如將使用者輸入的字串類型轉換成數字類型,這時候就需要使用v-model的.number修飾符來實現。 v-model.number的基本用法v-model.number是v-model的一個修

快速搞懂Vue2 diff演算法(圖文詳解) 快速搞懂Vue2 diff演算法(圖文詳解) Mar 17, 2023 pm 08:23 PM

diff演算法是一種透過同層的樹節點進行比較的高效演算法,避免了對樹進行逐層搜尋遍歷。那麼大家對diff演算法嗎有多少了解呢?以下這篇文章就來帶大家深入解析下vue2的diff演算法,希望對大家有幫助!

Vue中使用v-model的雙向綁定最佳化應用的資料效能 Vue中使用v-model的雙向綁定最佳化應用的資料效能 Jul 17, 2023 pm 07:57 PM

Vue中使用v-model的雙向綁定最佳化應用的資料效能在Vue中,我們經常使用v-model指令來實現表單元素與資料之間的雙向綁定。這種雙向綁定的方式極大地簡化了開發過程,並提高了使用者體驗。然而,由於v-model需要監聽表單元素的input事件,當資料量較大時,這種雙向綁定可能會帶來一定的效能問題。本文將介紹如何最佳化使用v-model時的資料效能,並提供一

Vue報錯:無法正確使用v-model進行雙向資料綁定,如何解決? Vue報錯:無法正確使用v-model進行雙向資料綁定,如何解決? Aug 19, 2023 pm 08:46 PM

Vue報錯:無法正確使用v-model進行雙向資料綁定,如何解決?引言:在使用Vue進行開發時,雙向資料綁定是一項非常常見且強大的功能。然而,有時候我們可能會遇到一個問題,就是當我們嘗試使用v-model進行雙向資料綁定時,卻遭遇到了報錯。本文將介紹該問題的原因以及解決方案,並透過程式碼範例來示範如何解決該問題。問題描述:當我們在Vue中嘗試使用v-model

如何解決Vue報錯:無法正確使用v-model進行雙向資料綁定 如何解決Vue報錯:無法正確使用v-model進行雙向資料綁定 Aug 25, 2023 pm 04:13 PM

如何解決Vue報錯:無法正確使用v-model進行雙向資料綁定引言:Vue是一種流行的前端框架,它提供了許多方便的功能,其中包括v-model指令用於實現雙向資料綁定。然而,有時我們在使用v-model時可能會遇到一些錯誤,特別是在處理複雜的資料結構時。本文將介紹幾種常見的v-model錯誤,並提供解決方案和程式碼範例。錯誤:v-model與物件屬性的雙向綁定

解決Vue報錯:無法使用v-model進行雙向資料綁定 解決Vue報錯:無法使用v-model進行雙向資料綁定 Aug 25, 2023 pm 04:49 PM

解決Vue報錯:無法使用v-model進行雙向資料綁定在使用Vue進行開發時,經常會使用v-model指令來實現雙向資料綁定,但有時候我們會遇到一個問題,就是在使用v- model時會報錯,無法正確進行雙向資料綁定。這可能是由於一些常見的錯誤導致的,以下我將介紹幾種常見的情況以及相應的解決方法。組件的props屬性未正確設定當我們在使用組件時,如果需要通過v-

實例詳解Vue中v-model指令的用法 實例詳解Vue中v-model指令的用法 Aug 10, 2022 pm 05:38 PM

Vue中可以使用v-model指令來實現資料雙向綁定,以下這篇文章就來帶大家了解一下v-model指令,希望對大家有幫助!

See all articles