Heim > Web-Frontend > View.js > Hauptteil

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

青灯夜游
Freigeben: 2022-01-04 19:12:20
nach vorne
4908 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie das V-Modell in vue2 verstehen, ob es sich bei dem V-Modell um eine bidirektionale Bindung oder einen unidirektionalen Datenfluss handelt, und wie Sie dafür sorgen, dass die von Ihnen entwickelten Komponenten das V-Modell unterstützen an alle.

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

Lesen Sie diesen Artikel

Sie werden:

  • Verstehen: Was ist der syntaktische Zucker von v-model? Welche Sonderbehandlung führt vue2 für native Komponenten durch?
  • 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" />
Nach dem Login kopieren

没错,在大部分情况下如此。

但也有例外:

  • vue2 给组件提供了 model 属性,可以让用户自定义传值的prop名更新值的事件名。这个暂且略过,第四节会细说。

  • 对于原生 html 原生元素,vue 干了大量『脏活儿』,目的是为了能让我们忽视 html 在api上的差异性。以下元素的左右两种写法是等价的:

  • textarea 元素:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

  • select 下拉框:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

  • input type=&#39;radio&#39; 单选框:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

  • input type=&#39;checkbox&#39; 多选框:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

在编程思想上,这种帮助使用者『隐藏细节』的方式叫封装

二、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;,
      }
    }
  }
}
Nach dem Login kopieren

响应式数据中没有定义 user.tel 属性,但是 template 里却用 v-model 绑定了 user.tel,猜一猜当你输入时会发生什么?

看效果:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

揭晓答案吧:user 上会新增 tel 属性,并且 tel 这个属性还是响应式的。

这就是『副作用』带来的效果,你学会了吗?

三、 v-model 是双向绑定还是单向数据流?

2.1 v-model 是双向绑定吗?

是,官方说是。

『你可以用 v-model 指令在表单 <input><textarea><select> 元素上创建双向数据绑定。』 —— vue2官方文档

2.2 那 v-model 是单向数据流吗?

是的,它甚至是单向数据流的典型范式。

虽然官方没有明确表示这点,但我们可以捋一捋两者的关系。

  • 什么是单项数据流?

子组件不能改变父组件传递给它的 prop 属性,推荐的做法是它抛出事件,通知父组件自行改变绑定的值。

  • v-model 的做法是怎样的?

v-modelFinden Sie heraus: Ist v-model einseitiger Datenfluss oder zweiseitige Datenbindung?

Finden Sie heraus: Was sind die „Nebenwirkungen“ von v-model über den syntaktischen Zucker hinaus? 🎜Erfahren Sie, wie Sie dafür sorgen, dass Ihre Komponenten auch die v-model-Syntax unterstützen.

1 Die Essenz von v-model ist syntaktischer Zucker. 🎜
🎜『v-model ist im Wesentlichen nur syntaktischer Zucker. Es ist dafür verantwortlich, Benutzereingabeereignisse abzuhören, um Daten zu aktualisieren und eine spezielle Verarbeitung für einige extreme Szenarien durchzuführen. 』 --Offizielle Dokumentation. [Verwandte Empfehlungen: vue.js-Tutorial]🎜
🎜Was ist syntaktischer Zucker? 🎜
🎜Syntaktischer Zucker ist, einfach ausgedrückt, „bequemes Schreiben“. 🎜
🎜In den meisten Fällen ist v-model="foo" äquivalent zu :value="foo" plus @input= "foo = $event"; 🎜
// 默认的 model 属性
export default {
  model: {
    prop: &#39;value&#39;,
    event: &#39;input&#39;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Ja, in den meisten Fällen. 🎜🎜Aber es gibt Ausnahmen: 🎜
    🎜🎜vue2 stellt das Attribut model für die Komponente bereit und ermöglicht Benutzern zum Anpassen Definieren Sie den Requisitennamen des übergebenen Werts und den Ereignisnamen des aktualisierten Werts. Ich überspringe dies vorerst und gehe in Abschnitt 4 näher darauf ein. 🎜🎜🎜Für die nativen html-nativen Elemente hat vue viel „Drecksarbeit“ geleistet, damit wir html</ ignorieren Code> Unterschiede in der API. Die linken und rechten Schreibmethoden der folgenden Elemente sind gleichwertig: 🎜</li>🎜<code>textarea Element:
🎜Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen🎜🎜🎜auswählen Dropdown-Feld:< /li> 🎜Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen 🎜🎜🎜input type='radio' Optionsfeld: 🎜Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen🎜🎜🎜input type='checkbox' Mehrfach-Kontrollkästchen: 🎜Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen🎜🎜 In Bezug auf das Programmierdenken wird diese Art, Benutzern dabei zu helfen, „Details zu verbergen“, als Kapselung bezeichnet. 🎜

2. Ist das V-Modell nur syntaktischer Zucker? (Trivia) 🎜
🎜v-model ist nicht nur syntaktischer Zucker, es hat auch Nebenwirkungen. 🎜
🎜Die Nebenwirkungen sind wie folgt: Wenn v-model an eine nicht vorhandene Eigenschaft des reaktionsfähigen Objekts gebunden ist, dann wird vue dies tun Fügen Sie diese Eigenschaft leise hinzu und machen Sie sie reaktionsfähig. 🎜🎜Sehen Sie sich zum Beispiel den folgenden Code an: 🎜
// 默认的 model 属性
export default {
  model: {
    prop: &#39;ame&#39;,
    event: &#39;zard&#39;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Das Attribut user.tel ist in den Antwortdaten nicht definiert, aber wird in <code>template< verwendet /code> >v-model ist an user.tel gebunden. Raten Sie, was passiert, wenn Sie eingeben? 🎜🎜Sehen Sie den Effekt:
🎜🎜 Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen🎜🎜Entdecken Sie die Antwort: tel wird zum Benutzer hinzugefügt und tel wird weiterhin responsiv sein Formeln. 🎜🎜Das ist der Effekt von „Nebenwirkungen“, hast du das gelernt? 🎜

3. Ist v-model eine bidirektionale Bindung oder ein unidirektionaler Datenfluss? 🎜

2.1 Ist v-model eine bidirektionale Bindung?

🎜Ja, der Beamte hat ja gesagt. 🎜
🎜『Sie können die V-Model-Direktive in den Formen <input>, <textarea> und <select>< verwenden /code > Erstellen Sie eine bidirektionale Datenbindung für das Element. 』——offizielles Dokument von vue2🎜

2.2 Ist v-model ein einseitiger Datenfluss?

🎜Ja, es ist sogar ein typisches Paradigma für den unidirektionalen Datenfluss. 🎜
🎜Obwohl der Beamte dies nicht ausdrücklich angegeben hat, können wir die Beziehung zwischen den beiden herausfinden. 🎜🎜🎜Was ist ein einzelner Datenstrom? 🎜Eine untergeordnete Komponente kann das von der übergeordneten Komponente an sie übergebene prop-Attribut nicht ändern. Der empfohlene Ansatz besteht darin, ein Ereignis auszulösen und die übergeordnete Komponente zu benachrichtigen, das zu ändern gebundener Wert für sich. 🎜🎜🎜Wie funktioniert v-model? 🎜v-model Der Ansatz entspricht vollständig dem Einzeldatenfluss. Es bietet sogar einen Standard für die Benennung und Ereignisdefinition. 🎜

众所周知 .sync 修饰符是单向数据流的另一个典型范式。

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

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

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

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

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

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

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

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

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

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

那么,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>
Nach dem Login kopieren

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

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

看看效果:

Sie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen

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

五、demo和源码

获取源码请访问github 

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

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

Das obige ist der detaillierte Inhalt vonSie erhalten ein umfassendes Verständnis des V-Modells in vue2 und erfahren, wie Komponenten diese Syntax unterstützen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage