Прочтите эту статью 📖
Ты будешь:
- Разберись:
v-model
Для чего нужен синтаксический сахар?vue2
Какая специальная обработка проводится для родных компонентов? - Разберись:
v-model
в конце концовОднонаправленный поток данныхещедвусторонняя привязка данных? - Разберись:
v-model
«Побочные эффекты» помимо синтаксического сахара? - Узнайте, как сделать так, чтобы ваши компоненты также поддерживали
v-model
грамматика.
один,v-model
по сути является синтаксическим сахаром.
『
v-model
По сути, не более чем синтаксический сахар. Он отвечает за прослушивание событий пользовательского ввода для обновления данных и выполняет некоторую специальную обработку для некоторых экстремальных сценариев. 』 -- официальная документация
Что такое синтаксический сахар?
Синтаксический сахар — это просто «удобное написание».
В большинстве случаев,v-model="foo"
Эквивалентно:value="foo"
плюс @input="foo = $event"
;
<!-- 在大部分情况下,以下两种写法是等价的 -->
<el-input v-model="foo" />
<el-input :value="foo" @input="foo = $event" />
да, вВ большинстве случаевв этом случае.
Но есть исключения:
-
vue2
предоставляется компонентуmodel
свойства, которые могут быть настроены пользователемимя свойства передается по значениюа такжеИмя события обновленного значения. Я пока пропущу это и подробно обсужу в разделе 4. -
для родного
html
родные элементы,vue
Делать много «грязной работы», чтобы заставить нас игнорироватьhtml
Различия в API. Левая и правая версии следующих элементов эквивалентны:
-
textarea
элемент:
-
select
выпадающий список:
-
input type='radio'
Одиночная коробка:
-
input type='checkbox'
Флажок:
В программировании этот способ помочь пользователям «скрыть детали» называетсяупаковка.
2. Является ли v-model просто синтаксическим сахаром? (Викторина)
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
Двусторонняя привязка или односторонний поток данных?
2.1 v-model
Это двухсторонняя привязка?
Да, это официально.
"Вы можете использовать директиву v-model в форме<input>
,<textarea>
а также<select>
Создайте двустороннюю привязку данных к элементу. 』—официальная документация vue2
2.2 Этоv-model
Это односторонний поток данных?
Да, это даже типичная парадигма однонаправленного потока данных.
Хотя чиновник прямо не сказал об этом, мы можем взглянуть на отношения между ними.
- Что такое единый поток данных?
Дочерний компонент не может изменить то, что ему передает родительский компонент.prop
Properties, рекомендуемая практика заключается в том, что он генерирует события, чтобы уведомить родительский компонент об изменении связанного значения самостоятельно.
-
v-model
Каков подход?
v-model
Практика полностью соответствует одноэлементному потоку данных. Скорее, он дает соглашение об именах и определениях событий.
хорошо известный.sync
Модификаторы — еще одна типичная парадигма однонаправленного потока данных.
«Односторонний поток данных» можно описать восемью словами: «Данные вниз, события вверх».
В-четвертых, как сделать так, чтобы разрабатываемые вами компоненты поддерживалиv-model
Хотя я не хочу этого говорить, это действительно часто задаваемый вопрос на собеседовании. 🤣
по определениюvue
компонент, вы можете предоставитьmodel
Атрибуты, которые определяют, как этот компонент поддерживаетv-model
.
model
Сами свойства имеют значения по умолчанию, а именно:
// 默认的 model 属性
export default {
model: {
prop: 'value',
event: 'input'
}
}
То есть, если вы не определяетеmodel
свойства, или вы определяете свойства лицом к лицу, когда другие используют ваш пользовательский компонент,v-model="foo"
полностью эквивалентен:value="foo"
плюс@input="foo = $event"
.
если поставитьmodel
Некоторые изменения внесены в свойства, а именно:
// 默认的 model 属性
export default {
model: {
prop: 'ame',
event: 'zard'
}
}
Так,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>
Затем мы используем компонент в родительском компоненте:
// template中
<dota v-model="ti"></dota>
// script中
export default {
data() {
return {
ti: 8
}
}
}
Взгляните на эффект:
Сделайте так, чтобы ваши компоненты поддерживалиv-model
Это так просто.
Пять, демо и исходный код
Чтобы получить исходный код, пожалуйста, посетите githubгитхаб чжаншичуня
6. Конец
я春哥
.
Я люблюvue.js
, ElementUI
, Element Plus
Что касается стека родственных технологий, то моя цель — поделиться с вами самыми практичными и полезными моментами знаний, надеюсь, каждый сможет пораньше уйти с работы, быстро закончить работу и успокоиться.
ты сможешьНаггетсСледуй за мной или вНет публикинайди меня в:前端要摸鱼
.
Надеюсь, вам всем весело.