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 werden:
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" />
没错,在大部分情况下如此。
但也有例外:
vue2
给组件提供了 model
属性,可以让用户自定义传值的prop名和更新值的事件名。这个暂且略过,第四节会细说。
对于原生 html
原生元素,vue
干了大量『脏活儿』,目的是为了能让我们忽视 html
在api上的差异性。以下元素的左右两种写法是等价的:
textarea
元素:select
下拉框:input type='radio'
单选框:input type='checkbox'
多选框:在编程思想上,这种帮助使用者『隐藏细节』的方式叫封装。
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
,猜一猜当你输入时会发生什么?
看效果:
揭晓答案吧:user
上会新增 tel
属性,并且 tel
这个属性还是响应式的。
这就是『副作用』带来的效果,你学会了吗?
v-model
是双向绑定还是单向数据流?v-model
是双向绑定吗?是,官方说是。
『你可以用 v-model 指令在表单 <input>
、<textarea>
及 <select>
元素上创建双向数据绑定。』 —— vue2官方文档
v-model
是单向数据流吗?是的,它甚至是单向数据流的典型范式。
虽然官方没有明确表示这点,但我们可以捋一捋两者的关系。
子组件不能改变父组件传递给它的 prop
属性,推荐的做法是它抛出事件,通知父组件自行改变绑定的值。
v-model
的做法是怎样的?v-model
Finden Sie heraus: Ist v-model
einseitiger Datenfluss oder zweiseitige Datenbindung?
v-model
über den syntaktischen Zucker hinaus? 🎜Erfahren Sie, wie Sie dafür sorgen, dass Ihre Komponenten auch die v-model
-Syntax unterstützen. 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: 'value', event: 'input' } }
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: auswählen
Dropdown-Feld:< /li> 🎜 🎜🎜🎜input type='radio'
Optionsfeld: 🎜🎜🎜🎜input type='checkbox'
Mehrfach-Kontrollkästchen: ul>🎜🎜🎜 In Bezug auf das Programmierdenken wird diese Art, Benutzern dabei zu helfen, „Details zu verbergen“, als Kapselung bezeichnet. 🎜🎜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: 'ame', event: 'zard' } }
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:tel
wird zum Benutzer
hinzugefügt und tel
wird weiterhin responsiv sein Formeln. 🎜🎜Das ist der Effekt von „Nebenwirkungen“, hast du das gelernt? 🎜v-model
eine bidirektionale Bindung oder ein unidirektionaler Datenfluss? 🎜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
修饰符是单向数据流的另一个典型范式。
『单向数据流』总结起来其实也就8个字:『数据向下,事件向上』。
四、如何让你开发的组件支持 v-model
虽然不想说,但这确实是高频面试题。
在定义 vue
组件时,你可以提供一个 model
属性,用来定义该组件以何种方式支持 v-model
。
model
属性本身是有默认值的,如下:
// 默认的 model 属性
export default {
model: {
prop: 'value',
event: 'input'
}
}
Nach dem Login kopierenNach dem Login kopieren也就是说,如果你不定义 model
属性,或者你按照当面方法定义属性,当其他人使用你的自定义组件时,v-model="foo"
就完全等价于 :value="foo"
加上 @input="foo = $event"
。
如果把 model
属性进行一些改装,如下:
// 默认的 model 属性
export default {
model: {
prop: 'ame',
event: 'zard'
}
}
Nach dem Login kopierenNach 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: 'ame', // 代表 v-model 绑定的prop名
event: 'zard' // 代码 v-model 通知父组件更新属性的事件名
},
methods: {
playDota2(step) {
const newYear = this.ame + step
this.$emit('zard', newYear)
}
}
}
</script>
Nach dem Login kopieren然后我们在父组件中使用该组件:
// template中
<dota v-model="ti"></dota>
// script中
export default {
data() {
return {
ti: 8
}
}
}
Nach dem Login kopieren看看效果:
让你的组件支持 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!