написать впереди
Поскольку меня очень интересует Vue.js, а технологический стек, над которым я обычно работаю, тоже Vue.js, я потратил некоторое время на изучение и изучение исходного кода Vue.js за последние несколько месяцев и сделал резюме и вывод.
Оригинальный адрес статьи:GitHub.com/ответы на….
В процессе обучения в Vue были добавлены китайские аннотации.GitHub.com/ответы на…, я надеюсь, что это может быть полезно другим друзьям, которые хотят изучить исходный код Vue.
Могут быть некоторые отклонения в понимании.Вы можете поднимать вопросы и указывать, учиться вместе и добиваться прогресса вместе.
Что такое компонент Vue?
Связь между компонентами Vue
Родительский компонент взаимодействует с дочерним компонентом
Способ 1: реквизит
использоватьprops, родительские компоненты могут использовать свойства для передачи данных дочерним компонентам.
Шаблон vue родительского компонента
<template>
<child :msg="message"></child>
</template>
<script>
import child from './child.vue';
export default {
components: {
child
},
data () {
return {
message: 'father message';
}
}
}
</script>
Шаблон vue дочернего компонента child.vue
<template>
<div>{{msg}}</div>
</template>
<script>
export default {
props: {
msg: {
type: String,
required: true
}
}
}
</script>
Способ 2. Используйте $children
использовать$childrenДочерние компоненты могут быть доступны в родительских компонентах.
Дочерний компонент взаимодействует с родительским компонентом
Способ 1: Использованиеvue событие
Родительский компонент передает метод события дочернему компоненту, дочерний компонент запускает событие через $emit и вызывает обратно родительский компонент.
Шаблон vue родительского компонента
<template>
<child @msgFunc="func"></child>
</template>
<script>
import child from './child.vue';
export default {
components: {
child
},
methods: {
func (msg) {
console.log(msg);
}
}
}
</script>
Шаблон vue дочернего компонента child.vue
<template>
<button @click="handleClick">点我</button>
</template>
<script>
export default {
props: {
msg: {
type: String,
required: true
}
},
methods () {
handleClick () {
//........
this.$emit('msgFunc');
}
}
}
</script>
Способ 2. Измените данные родительского компонента, изменив реквизиты, переданные родительским компонентом.
Этот метод можно использовать только тогда, когда родительский компонент передает ссылочную переменную, а литеральные переменные не могут достичь соответствующего эффекта. Поскольку переменная drink в конечном итоге указывает на один и тот же адрес памяти, будь то данные в родительском компоненте или данные в свойствах, полученных дочерним компонентом, изменение данных свойств в дочернем компоненте изменяет данные родительского компонента.
Однако делать это не рекомендуется, и не рекомендуется напрямую изменять значение реквизита.Если данные используются для модификации отображения, я часто помещаю их в данные в фактической разработке и использую, когда это необходимо. быть переданы обратно родительскому компоненту.Событие возвращает данные. Таким образом, компоненты остаются независимыми и разъединенными, и поток данных не будет ненормально хаотичным из-за использования одних и тех же данных.Цель модификации данных достигается только путем передачи данных через определенный интерфейс, а состояние внутренних данных управляется специальными данными.
Способ 3: используйте $parent
использовать$parentМожет получить доступ к данным родительского компонента.
Передача данных между компонентами, не являющимися родительскими и дочерними, и компонентами-братами.
Связь между компонентами, не являющимися родительскими и дочерними, официально рекомендованная Vue.Используйте экземпляр Vue в качестве центральной шины событий.
Внутри Vue есть механизм событий, вы можете обратиться кисходный код.
Метод $on используется для прослушивания события.
$emit используется для запуска события.
/*新建一个Vue实例作为中央事件总嫌*/
let event = new Vue();
/*监听事件*/
event.$on('eventName', (val) => {
//......do something
});
/*触发事件*/
event.$emit('eventName', 'this is a message.');
Многоуровневая связь между родительскими и дочерними компонентами:
В Vue1.0 реализованы методы $broadcast и $dispatch для трансляции (или отправки) дочернему компоненту (или родительскому компоненту), и когда дочерний компонент (или родительский компонент) прослушивает событие и возвращает значение true, он будет быть отправлены дочернему компоненту (или родительскому компоненту).Компоненты уровня дедушки продолжают транслировать (или отправлять) события. Но этот метод был удален в Vue2.0.
Я изучал библиотеку компонентов Ele.me с открытым исходным кодом доelementКогда я обнаружил, что они повторно реализовали методы вещания и отправки и представили их в виде миксинов, подробности см.«Поговорим о трансляции и отправке библиотеки компонентов элементов». Но он немного отличается от двух методов Vue1.0. Эти два метода реализуют функцию трансляции событий компонентам-потомкам и диспетчеризации событий многоуровневым родительским компонентам. Но это не событие, транслируемое в широком смысле, ему нужно указать commentName для трансляции (отправки) событий на указанный компонент имени компонента.
Фактически, внутренняя реализация этих двух методов по-прежнему использует $parent и $children для обхода дочерних узлов или запроса родительских узлов уровень за уровнем.При доступе к указанному имени компонента вызывается $emit для запуска указанного события.
Комплексное управление данными одностраничных приложений
Когда приложение достаточно сложное, используйтеvuexОсуществлять управление данными.
о
Автор: Ран Мо
Электронная почта: answerhuto@gmail.com или answerhuto@126.com
Github: github.com/answershuto
Знать домашнюю страницу:ууууууу. chi.com/people/grass-…
Знать столбец:zhuanlan.zhihu.com/ranmo
Самородки:Талант /user/289926…
Ос Китай:no.OSCHINA.net/U/3161824/no…
Пожалуйста, указывайте источник при перепечатке, спасибо.
Добро пожаловать, чтобы обратить внимание на мой общедоступный номер