Что мы знаем о vue.use?
При разработке vue все должны быть в постоянном контактеVue.use()
Метод, объяснение, данное на официальном сайте:через глобальный методVue.use()
Используйте плагины; Я думаю, что более уместно понимать использование как регистрацию, сначала посмотрите на следующие распространенные сценарии регистрации.
import Router from 'vue-router'
Vue.use(Router)
import Vuex from 'vuex'
Vue.use(Vuex)
import Echarts from 'echarts'
Vue.prototype.$echarts = Echarts
Регистрация ечартов очень проста, она висит прямо на прототипе метода Vue, отношение наследования через цепочку прототипов может передаваться в любом компоненте.this.$echarts
Доступ к экземпляру echarts, давайте напишем простой пример, чтобы доказать это.
function myVue(title){
this.title = title
}
myVue.prototype.myUse = '在原型上添加公共属性'
const A = new myVue('我是实例A')
const B = new myVue('我是实例B')
console.log(A.title, B.title, A.myVue, B.myVue, )
// 我是实例A 我是实例B 在原型上添加公共属性 在原型上添加公共属性
И регистрацию Router и Vuex нужно анализироватьVue.use()
Исходный код , прежде чем анализировать исходный код, обобщите официальныеVue.use()
Описание метода:
- через глобальный метод
Vue.use()
Используйте плагины - Vue.use автоматически предотвратит множественную регистрацию одного и того же плагина.
- Это нужно сделать до того, как вы вызовете новый Vue() для запуска приложения.
-
Vue.use()
Метод передает хотя бы один параметр. Тип параметра должен быть "Объект" или "Функция". Если это "Объект", то объект должен определить метод установки. Если это "Функция", то эта функция используется в качестве метода установки. существуетVue.use()
При выполнении установка будет выполняться по умолчанию.При выполнении установки первым параметром является Vue, а остальные параметрыVue.use()
Дополнительные параметры, переданные во время выполнения.
Официальный сайт говоритVue.use()
Он используется для использования плагинов, тогда входящие Router и Vuex — это плагины, на которые здесь ссылаются, и этот плагин, по сути, является методом установки. Что касается логики, реализованной внутри метода install, то она определяется бизнесом самого плагина.
Анализ исходного кода
Прежде всего, давайте поговорим о Flow, этих странных способах записи в исходном коде vue.Vue.use = function (plugin: Function | Object)
— это синтаксис Flow, инструмента статической проверки типов для JavaScript, разработанного Facebook. JavaScript — язык с динамической типизацией, и его гибкость очевидна для всех, но побочным эффектом слишком гибкости является то, что на нем легко писать очень скрытые и скрытые коды. во время выполнения может появиться странность.
Теперь мы официально приступаем к анализу исходного кода,Vue.use()
Исходный код очень прост менее 30 строк, в первую очередь посмотреть на SRC / CORE / GLOBAL-API / USE.JS DOWNVue.use()
Определение метода:
import { toArray } from '../util/index'
export function initUse (Vue: GlobalAPI) {
Vue.use = function (plugin: Function | Object) {
const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
const args = toArray(arguments, 1)
args.unshift(this)
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args)
} else if (typeof plugin === 'function') {
plugin.apply(null, args)
}
installedPlugins.push(plugin)
return this
}
}
Функция инструмента используется в приведенном выше исходном коде.toArray
, функция определена в src/shared/util.js
export function toArray (list: any, start?: number): Array<any> {
start = start || 0
let i = list.length - start
const ret: Array<any> = new Array(i)
while (i--) {
ret[i] = list[i + start]
}
return ret
}
Понять, какую логику реализует исходный код
Vue.use = function (plugin: Function | Object) {
Метод использования определяется в глобальном API Vue, получение параметра плагина может быть либо функцией, либо объектом, что соответствует предыдущим официальным правилам.Vue.use()
Ему соответствует тип, требуемый первым параметром.
if (installedPlugins.indexOf(plugin) > -1) {
Используется для определения того, был ли плагин уже зарегистрирован, чтобы предотвратить повторную регистрацию.
const args = toArray(arguments, 1)
аргументыVue.use()
Список параметров метода представляет собой массив класса, а под константой сначала понимается следующая 1. Функция метода toArray заключается в перехвате первого параметра Array от индекса 1 до конца. также получилVue.use()
У метода есть и другие параметры, кроме первого, которые нужно передать при вызове метода instll.
if (typeof plugin.install === 'function') {
} else if (typeof plugin === 'function') {
Оператор if здесь должен судитьVue.use()
Первый передаваемый параметр — это объект или функция.
plugin.install.apply(plugin, args)
plugin.apply(null, args)
После оценки выполните соответствующий метод установки, используйте команду apply, чтобы изменить эту точку, и передайте оставшиеся параметры, полученные с помощью toArray.
installedPlugins.push(plugin)
Наконец, запишите, что компонент был зарегистрирован
Теперь мы находимVue.use()
По сути, регистрация метода установки выполняет метод установки.Содержание в установке определяется самим разработчиком.Вообще говоря, хук может быть ближе к семантике.
Какая польза от Vue.use()
При установке мы можем получить Vue, после чего работа, связанная с Vue, может быть рассмотрена наVue.use()
метод, например:
- директивная регистрация
- регистрация миксина
- регистрация фильтров
- регистрация компонентов
- крепление прототипа
- ...
графики зарегистрированы с помощью Vue.use()
main.js
import Vue from 'vue'
import echarts from './echarts.js'
Vue.use(echarts)
new Vue({
...
})
echarts.js
import Echarts from 'echarts'
export default {
install(Vue){
Vue.prototype.$echarts = Echarts
}
}
Преимущество написания таким образом заключается в том, что в установочном файле можно выполнить больше работы по настройке, main.js не будет раздуваться, и им будет удобнее управлять.
Глобальные компоненты регистрируются с помощью Vue.use().
base.js
import a from './a'
import b from './b'
let components = { a, b }
const installBase = {
install (Vue) {
Object.keys(components).map(key => Vue.component(key, components[key]))
}
}
main.js
import Vue from 'vue'
import base from './base.js'
Vue.use(base)
new Vue({
...
})