В этой статье в основном рассматриваются точки знаний Vue со следующих аспектов:
1. MVC && MVVM
2. 数据双向绑定
3. Vue的生命周期
4. 虚拟dom的实现原理
5. vue-router
6. Proxy
7. vuex
MVC && MVVM
M -- модельный слой, представляющий модель данных
V -- слой представления, представляющий слой представления, отображение пользовательского интерфейса
C — уровень управления, уровень управления, обрабатывает сложную бизнес-логику
VM — слой viewModel, объект, который синхронизирует представление и модель, на самом деле можно понимать как двустороннюю привязку данных.
Vue — это фреймворк шаблона MVVM.
Принцип реализации V-Show и V-if
Когда V-Show имеет значение false, DISPLAY: '' устанавливается JS, устанавливая Display: ''; поэтому для того, чтобы JS установил свойства отображения недействительными.
V-If - вручную добавлять или удалять элементы DOM через JS.
Связь между компонентами
Связь между компонентами делится на следующие виды:
1. Родитель --> Ребенок:
Родительский элемент передается в формате атрибутов, а дочерний элемент принимается с атрибутом props;
// 父元素
<editor :name='data'></editor>
// 子元素
props: {
name: {
type: Object,
defalut: function(){
}
}
}
2. Ребенок --> Отец:
Привяжите событие к родительскому компоненту и используйте $emit для запуска события из компонента.
3. Компоненты Brother:
4. Когда компоненты глубоко вложены: vuex
Двусторонняя привязка данных Vue
Так называемая двусторонняя привязка данных относится к взаимодействию между уровнем представления и уровнем данных.Например, когда поле ввода вводит данные, сохраненные данные изменяются соответствующим образом; когда данные сохраненных данных переназначаются, значение поля ввода также меняется.
Реализация двусторонней привязки данных осуществляется в основном через режим захвата данных + публикация-подписчик, захват набора и получения каждого атрибута, публикация подписчику при изменении данных и запуск соответствующего обратного вызова.
Настоящая вещь — это свойство Object.defineProperty.
Говоря об этом принципе, вы можете сначала понять модель публикации-подписки.
Модель публикации-подписки:
Я сначала тоже немного не понял этот режим, но увидевэта статьяОдна из метафор понятна мгновенно.
По сути, эта модель публикации-подписки аналогична обычной модели подписки на публичные аккаунты WeChat.
- Вся модель публикации-подписки похожа на платформу, которая позволяет пользователям подписываться и публиковать, что похоже на платформу общедоступных учетных записей WeChat.
- Подписчики могут подписаться на несколько операций, так же как мы можем подписаться на несколько официальных учетных записей, но нам нужно предоставить платформе имя, на которое мы хотим подписаться, а также некоторую информацию о самих подписчиках.
- Как издатель, это фактически как публичный аккаунт, ему все равно, кто является конкретными подписчиками, пока подписанные пользователи будут получать опубликованную информацию. Вся операция публикации должна информировать платформу о том, какую официальную учетную запись необходимо опубликовать и какую информацию опубликовать.
- Подписчики также могут отменить подписку, поэтому платформе необходимо знать, какой пользователь инициировал отмену и как называется отмененная официальная учетная запись.
Далее формируется простая модель публикации-подписки, далее много говорить не буду, просто переходим к коду:
const SubPub = function() {
// 用Object格式,可以通过value存储订阅者的一些信息
// 订阅器 --- 类似于微信公众号这个平台,每一个元素类似于一个公众号,key值为公众号的名字,value值记录订阅公众号的人;
this._observer = {};
}
SubPub.prototype = {
// 订阅函数,需要提供我要订阅的公众号名称,以及自己的姓名
subscribe: function(type, callback) {
const self = this;
if(Type(callback) !== 'function') return;
if(!self._observer[type]) this._observer[type] = []
this._observer[type].push(callback);
return self;
},
// 发布函数,需要提供哪个公众号需要发布信息,以及发布的内容;
publish: function() {
const self = this;
const type = Array.prototype.shift.call(arguments); // 因为arguments不是数组,是一种类数组类型,所以没有shift、slice这些方法
//发布的内容
const theme = Array.prototype.slice.call(arguments);
const subs = self._observer[type];
if(!subs || !subs.length) return;
subs.forEach(sub => {
sub.apply(self, theme);
});
return this;
},
// 取消订阅,需要提供取消公众号的名字,和发起该取消操作的用户
removeSub: function(type, callback) {
const _subs = this._observer[type];
if(!_subs || !_subs.length) return;
_subs.map((item, index) => {
if(item === callback) {
_subs.splice(index, 1);
}
})
return this;
}
}
function Type(value) {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
// 实例一个发布订阅器
let sp = new SubPub();
// 定义订阅者
const sub1 = function(data) {
console.log('sub1' + data);
}
const sub2 = function(data) {
console.log('sub2' + data);
}
const sub3 = function(data) {
console.log('sub3' + data);
}
// 发起订阅操作
sp.subscribe('click', sub1);
sp.subscribe('input',sub1);
sp.subscribe('qqq',sub1);
sp.subscribe('click', sub2);
sp.subscribe('input', sub3);
// 开启发布
sp.publish('click', '第一次发布click事件');
sp.publish('input', '第一次发布input事件');
sp.removeSub('click', sub1).publish('click', '第二次发布click事件');
Как использовать Object.defineProperty
Далее давайте посмотрим на использование Object.defineProperty.
let obj = {};
let song = '七里香';
obj.singer = 'JayZhou';
Object.defineProperty(obj, 'music', {
configurable: true, // 可以配置对象, 为true的时候才可以删除属性
enumerable: false, // 是否可枚举
get () {
return song;
},
set (val) {
song = val;
}
});
console.log(obj.music); // {singer: '周杰伦', music: '七里香'}
obj.music = '听妈妈的话';
console.log(obj.music);
delete obj.music
console.log(obj);
for(var i in obj) {
console.log(i); // 只有singer 因为music是不可枚举的
}
недостаток:
- Невозможно отслеживать изменения массива
Принцип реализации шаблона Vue MVVM:
- Соблюдайте: слушатель данных, который контролирует все свойства объекта данных, включая суб-свойства, и если он меняется, получает новейшее значение и уведомляет подписчиков
- компиляция: парсер инструкций, который сканирует и анализирует инструкции узла каждого элемента, заменяет данные в соответствии с шаблоном инструкции и связывает соответствующие функции.
- наблюдатель: подписчик, который будет действовать как мост между прослушивателем данных и синтаксическим анализатором директив. Возможность подписываться на изменения данных каждого атрибута, получать уведомления об изменениях данных, выполнять функции обратного вызова и обновлять страницы пользовательского интерфейса.
- Функция входа Mvvm объединяет три
Жизненный цикл Vue
Жизненный цикл vue относится к процессу создания --> монтирования --> обновления --> уничтожения.
Всего 8 шагов:
beforeCreate, created,
beforeMount, mounted,
beforeUpdate, updated,
beforeDestroy, destroyed
Vue виртуальный DOM
Так называемый виртуальный DOM — это объект JS, используемый для хранения древовидной структуры DOM.
Обработать:
- создать дерево дома
- Используйте алгоритм diff для сравнения, сохраните объект различий исправлений и нажмите следующие четыре формата.
- Изменение типа узла
- изменение свойства
- изменение текста
- добавить/переместить/удалить дочерние узлы
3. Различия в рендеринге
- Пройдите патчи и удалите узлы, которые необходимо изменить.
- Частично обновите дом, используйте document.fragments для работы с домом и выполните однократное обновление браузера.
document.fragment:
является узлом DOM, а не частью основного дерева DOM.
Обычно используется для создания фрагментов документа, добавления элементов к фрагментам документа, а затем добавления фрагментов документа к дереву DOM. Поскольку фрагмент документа хранится в памяти, а не в дереве DOM, вставка дочерних элементов не приведет к перекомпоновке браузера, поэтому производительность выше.
nextTick
Используется для выполнения обратного вызова после рендеринга dom, в новой версии по умолчанию используются микрозадачи.
vue-router
модель:хэш, история
Режим прыжка:
- this.$router.push()
- <router-link to=''></router-link>
- this.$router.replace()
Обитатель:
<router-view></router-view>
По умолчанию он находится в режиме HASH, а история требует конфигурации фона, которая реализована с помощью API истории HTML5 для мониторинга изменений.
Разница между маршрутизатором и маршрутом:
$маршрутизатор:Это экземпляр VueRouter, глобального объекта, который в основном реализует использование переходов маршрутизации. Общие методы router.push() и router.replace().
Метод push добавляет новую запись в стек истории браузера.
replace заменяет маршрут без истории.
маршрут:Является информационным объектом маршрутизации, каждый маршрут имеет объект маршрута, который является локальным объектом. Вы можете получить такие параметры, как имя, запрос, параметры и путь.
Proxy
Определение: изMDNОпределение: используется для определения пользовательского поведения для основных операций (таких как: поиск свойства, назначение, перечисление, вызов функции и т. д.);
Кроме тогоРуан ИфэнОбъяснение относительно простое для понимания: перед целевым объектом устанавливается уровень перехвата, и доступ внешних объектов к объекту должен сначала пройти этот уровень перехвата, поэтому предусмотрен механизм фильтрации и перезаписи доступа целевого объекта. внешний мир.
грамматика:
let p = new Proxy(target, handler);
Простой пример:
var proxy = new Proxy({}, {
get: function(target, key, receiver) {
console.log(`get ${key}`);
return Reflect.get(target, key, receiver);
},
set: function(target, key, value, receiver) {
console.log(`set ${key}`);
return Reflect.set(target, key, value, receiver);
}
});
proxy.name = 'jack';
// set name
console.log(proxy.name);
// get name
// jack
В приведенном выше примере перехватывается пустой объект.
В Vue3.0 следует использовать Proxy вместо defineProperty. Proxy намного сильнее, чем defineProperty, с точки зрения работы и базовых функций.
преимущество:
- Вы можете отслеживать изменения в массиве, чего не может сделать defineProperty
- Слушайте непосредственно объект, а не свойства объекта, и создавайте новый объект
Vuex
Что такое Векс?
Vuex — это инструмент управления состоянием для Vue, который централизованно хранит состояние всех компонентов и использует соответствующие правила для обеспечения предсказуемого изменения состояния.
Основные свойства Vuex:
Vuex имеет пять основных свойств: состояние, геттер, мутация, действие, модуль.
- Состояние: состояние хранения данных; доступ к нему можно получить через this.$store.state; соответствует данным в vue; способ хранения данных является гибким, компоненты vue могут считывать данные из хранилища, и если данные изменяются, компонент также соответственно реагировать на обновление.
- Getter: Эквивалентно вычисляемому свойству хранилища.Его возвращаемое значение будет кэшироваться в соответствии с его зависимостями и будет пересчитываться только при изменении его зависимостей.
- Мутация: единственный способ изменить хранилище vuex — отправить мутацию.
- Действие: содержит произвольные асинхронные операции, которые косвенно изменяют состояние, отправляя мутации.
- Модуль: разделите магазин на модули, каждый модуль имеет четыре вышеуказанных метода, даже подмодули.
процесс передачи данных vuex
- Когда компонент изменяет данные, вызовите диспетчеризацию, чтобы вызвать метод в действии;
- Каждое действие имеет метод фиксации, который можно использовать для изменения методов в мутациях посредством фиксации для изменения данных.
- В мутации будет параметр состояния, чтобы данные состояния можно было изменить с помощью мутации.
- После изменения данных страница меняется
Зачем использовать vuex?
- Когда компоненты вложены в несколько слоев, передача данных между родительскими и дочерними компонентами усложняется.
- Повышение удобочитаемости и ремонтопригодности кода
- Данные реагируют, сокращая операции по распространению данных;