Подготовка к фронтенд-интервью — статьи на Vue

Vue.js опрос
В этой статье в основном рассматриваются точки знаний 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.
  1. Вся модель публикации-подписки похожа на платформу, которая позволяет пользователям подписываться и публиковать, что похоже на платформу общедоступных учетных записей WeChat.
  2. Подписчики могут подписаться на несколько операций, так же как мы можем подписаться на несколько официальных учетных записей, но нам нужно предоставить платформе имя, на которое мы хотим подписаться, а также некоторую информацию о самих подписчиках.
  3. Как издатель, это фактически как публичный аккаунт, ему все равно, кто является конкретными подписчиками, пока подписанные пользователи будут получать опубликованную информацию. Вся операция публикации должна информировать платформу о том, какую официальную учетную запись необходимо опубликовать и какую информацию опубликовать.
  4. Подписчики также могут отменить подписку, поэтому платформе необходимо знать, какой пользователь инициировал отмену и как называется отмененная официальная учетная запись.
Далее формируется простая модель публикации-подписки, далее много говорить не буду, просто переходим к коду:
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是不可枚举的
}
недостаток:
  1. Невозможно отслеживать изменения массива

Принцип реализации шаблона Vue MVVM:

  1. Соблюдайте: слушатель данных, который контролирует все свойства объекта данных, включая суб-свойства, и если он меняется, получает новейшее значение и уведомляет подписчиков
  2. компиляция: парсер инструкций, который сканирует и анализирует инструкции узла каждого элемента, заменяет данные в соответствии с шаблоном инструкции и связывает соответствующие функции.
  3. наблюдатель: подписчик, который будет действовать как мост между прослушивателем данных и синтаксическим анализатором директив. Возможность подписываться на изменения данных каждого атрибута, получать уведомления об изменениях данных, выполнять функции обратного вызова и обновлять страницы пользовательского интерфейса.
  4. Функция входа Mvvm объединяет три

Жизненный цикл Vue

Жизненный цикл vue относится к процессу создания --> монтирования --> обновления --> уничтожения.

Всего 8 шагов:

beforeCreate, created,
beforeMount, mounted,
beforeUpdate, updated,
beforeDestroy, destroyed

Vue виртуальный DOM

Так называемый виртуальный DOM — это объект JS, используемый для хранения древовидной структуры DOM.
Обработать:
  1. создать дерево дома
  2. Используйте алгоритм diff для сравнения, сохраните объект различий исправлений и нажмите следующие четыре формата.
  • Изменение типа узла
  • изменение свойства
  • изменение текста
  • добавить/переместить/удалить дочерние узлы
3. Различия в рендеринге
  • Пройдите патчи и удалите узлы, которые необходимо изменить.
  • Частично обновите дом, используйте document.fragments для работы с домом и выполните однократное обновление браузера.

document.fragment:

является узлом DOM, а не частью основного дерева DOM.
Обычно используется для создания фрагментов документа, добавления элементов к фрагментам документа, а затем добавления фрагментов документа к дереву DOM. Поскольку фрагмент документа хранится в памяти, а не в дереве DOM, вставка дочерних элементов не приведет к перекомпоновке браузера, поэтому производительность выше.

nextTick

Используется для выполнения обратного вызова после рендеринга dom, в новой версии по умолчанию используются микрозадачи.

vue-router

модель:хэш, история
Режим прыжка:
  1. this.$router.push()
  2. <router-link to=''></router-link>
  3. 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, с точки зрения работы и базовых функций.

преимущество:

  1. Вы можете отслеживать изменения в массиве, чего не может сделать defineProperty
  2. Слушайте непосредственно объект, а не свойства объекта, и создавайте новый объект

Vuex

  • Что такое Векс?

Vuex — это инструмент управления состоянием для Vue, который централизованно хранит состояние всех компонентов и использует соответствующие правила для обеспечения предсказуемого изменения состояния.
  • Основные свойства Vuex:

Vuex имеет пять основных свойств: состояние, геттер, мутация, действие, модуль.
  1. Состояние: состояние хранения данных; доступ к нему можно получить через this.$store.state; соответствует данным в vue; способ хранения данных является гибким, компоненты vue могут считывать данные из хранилища, и если данные изменяются, компонент также соответственно реагировать на обновление.
  2. Getter: Эквивалентно вычисляемому свойству хранилища.Его возвращаемое значение будет кэшироваться в соответствии с его зависимостями и будет пересчитываться только при изменении его зависимостей.
  3. Мутация: единственный способ изменить хранилище vuex — отправить мутацию.
  4. Действие: содержит произвольные асинхронные операции, которые косвенно изменяют состояние, отправляя мутации.
  5. Модуль: разделите магазин на модули, каждый модуль имеет четыре вышеуказанных метода, даже подмодули.
  • процесс передачи данных vuex

  1. Когда компонент изменяет данные, вызовите диспетчеризацию, чтобы вызвать метод в действии;
  2. Каждое действие имеет метод фиксации, который можно использовать для изменения методов в мутациях посредством фиксации для изменения данных.
  3. В мутации будет параметр состояния, чтобы данные состояния можно было изменить с помощью мутации.
  4. После изменения данных страница меняется
  • Зачем использовать vuex?

  1. Когда компоненты вложены в несколько слоев, передача данных между родительскими и дочерними компонентами усложняется.
  2. Повышение удобочитаемости и ремонтопригодности кода
  3. Данные реагируют, сокращая операции по распространению данных;