搜尋
首頁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刪除
vue2与vue3中的生命周期执行顺序有什么区别vue2与vue3中的生命周期执行顺序有什么区别May 16, 2023 pm 09:40 PM

vue2与vue3中生命周期执行顺序区别生命周期比较vue2中执行顺序beforeCreate=>created=>beforeMount=>mounted=>beforeUpdate=>updated=>beforeDestroy=>destroyedvue3中执行顺序setup=>onBeforeMount=>onMounted=>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进行双向数据绑定Aug 25, 2023 pm 04:49 PM

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

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的双向绑定优化应用的数据性能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 10, 2022 pm 05:38 PM

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

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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

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

SublimeText3 Mac版

SublimeText3 Mac版

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

記事本++7.3.1

記事本++7.3.1

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