Как один из трех интерфейсных фреймворков, vue является обязательным навыком для фронтенд-разработчиков. Так как же систематически изучать и осваивать vue? С этой целью я сделал простое резюме системы системы знаний.Пожалуйста, потерпите меня и исправьте мои недостатки.Если вам это нравится, вы можете поставить большой палец вверх! В этой статье в основном описываются некоторые продвинутые приложения в разработке vue, и мы надеемся, что они будут полезны всем.
связанное предложение
Vue.use
Используемые нами сторонние плагины Vue.js. Если плагин является объектом, необходимо указатьinstall
метод. Если плагин является функцией, он будет использоваться какinstall
метод.install
Когда метод вызывается, онVue
Передать в качестве параметра. Этот метод нужно вызватьnew Vue()
звонили раньше.
Мы используем его при использовании плагинов или сторонних библиотек компонентов.Vue.use
такой метод, как
import iView from 'iview'
Vue.use(iView)
ТакVue.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
}
// additional parameters
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
}
}
Мы можем видеть из вышесказанного, что,plugin
Параметр представляет собой тип функции или объекта, сначалаVue
Будет искать этот плагин в списке установленных плагинов, если нет, установить плагин, если да, то выпрыгнуть из функции, которая гарантирует, что плагин будет установлен только один раз.
затем черезtoArray
Метод становится параметрами в массивы, а затем судитplugin
изinstall
является ли свойство функцией илиplugin
сама является функцией и, наконец, выполняетplugin.install
илиplugin
Методы.
Например
Возьмем практический пример
1. Напишите два плагина
const Plugin1 = {
install(a) {
console.log(a)
}
}
function Plugin2(b) {
console.log(b)
}
export { Plugin1, Plugin2 }
2. Внедрите и используйте эти два плагина
import Vue from 'vue'
import { Plugin1, Plugin2 } from './plugins'
Vue.use(Plugin1, '参数1')
Vue.use(Plugin2, '参数2')
На данный момент мы можем использовать два вышеупомянутых плагина, запустив код проекта.
Vue.mixin
Миксины предоставляют очень гибкий способ распространения повторно используемой функциональности в компонентах Vue. Объект миксина может содержать произвольные параметры компонента. Когда компонент использует примесь, все опции примеси будут «смешаны» с собственными опциями компонента.
1. Определите mixin.js
export default mixin {
data() {
return {
name: 'mixin'
}
},
created() {
console.log('mixin...', this.name);
},
mounted() {},
methods: { //日期转换
formatDate (dateTime, fmt = 'YYYY年MM月DD日 HH:mm:ss') {
if (!dateTime) {
return ''
}
moment.locale('zh-CN')
dateTime = moment(dateTime).format(fmt)
return dateTime
}
}
}
2. Используйте миксин в файле vue
import '@/mixin'; // 引入mixin文件
export default {
mixins: [mixin], //用法
data() {
return {
userName: "adimin",
time: this.formatDate(new Date()) //这个vue文件的数据源data里面的time就是引用混入进来的方法
}
}
}
Или используйте его глобально в main.js, все страницы могут его использовать
import mixin from './mixin'
Vue.mixin(mixin)
Параметры слияния
Когда компоненты и примеси имеют параметры с одинаковыми именами, эти параметры «объединяются» соответствующим образом.
-
data
Объекты внутренне рекурсивно объединяются, при этом данные компонентов имеют приоритет в случае конфликта. - Хуки-функции с одинаковыми именами будут объединены в массив, поэтому будут вызываться все. Хуки миксина будут вызываться перед собственными хуками компонента.
- параметры, значение которых является объектом, например.
methods
,components
иdirectives
, будут объединены в один и тот же объект. Когда имена ключей двух объектов конфликтуют, берется пара ключ-значение объекта-компонента.
Vue.extend
Vue.extend
Глобальный API, принадлежащий Vue. Он использует базовый конструктор Vue, создавая «подкласс». Параметр — это объект, содержащий параметры компонента. следующее:
<div id="app"></div>
var Profile = Vue.extend({
template: '<p>{{firstName}} {{lastName}}</p>',
data: function () {
return {
firstName: 'Walter',
lastName: 'White'
}
}
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#app')
Приложения
мы используемVue.extend
Инкапсулируйте некоторые глобальные плагины, такие какtoast
,diolog
Ждать.
Следующее инкапсулируетtoast
Компоненты например.
1. Напишите компоненты
- Определите тип всплывающего окна в соответствии с типом входящего сообщения (подсказка об успешном завершении, подсказка об ошибке, предупреждение, загрузка, обычный текст)
- Установите время, по истечении которого всплывающее окно исчезнет
<template>
<div>
<transition name="fade">
<div class="little-tip" v-show="showTip">
<img src="/success.png" alt="" width="36" v-if="type=='success'" />
<img src="/fail.png" alt="" width="36" v-if="type=='fail'" />
<img src="/warning.png" alt="" width="36" v-if="type=='warning'" />
<img src="/loading.png" alt="" width="36" v-if="type=='loading'" class="loading" />
<span>{{msg}}</span>
</div>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
showTip: true,
msg: '',
type: ''
}
},
mounted() {
setTimeout(() => {
this.showTip = false
}, 1500)
}
}
</script>
<style lang="less" scoped>
/* 样式略 */
</style>
2. ИспользуйтеVue.extend
дескриптор конструктораtoast
компонент монтируется наvue
под примером
import Vue from 'vue'
import Main from './toast.vue'
let Toast = Vue.extend(Main)
let instance
const toast = function(options) {
options = options || {}
instance = new Toast({
data: options
})
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
return instance.vm
}
export default toast
3. Вmain.js
вводитьtoast
установить цену и установить вvue
на прототипе
import Vue from 'vue'
import toast from './components/toast'
Vue.prototype.$toast = toast
4. Звоните в проект
this.$toast({ msg: '手机号码不能为空' })
this.$toast({
msg: '成功提示',
type: 'success'
})
Разница между Vue.extend и Vue.component
-
component
Сначала необходимо зарегистрировать компонент, а затемtemplate
Используйте зарегистрированное имя тега для реализации использования компонента.Vue.extend
Это программное письмо. - контроль
component
Независимо от того, отображать или нет, вам нужно передать состояние в родительский компонент, чтобы контролировать или использовать его вне компонента.v-if/v-show
добиться контроля иVue.extend
Независимо от того, является ли дисплей ручным или нет, необходимо монтировать и уничтожать компоненты вручную.
Vue.directive
Зарегистрируйтесь или получите глобальные директивы. Функция определения директивы предоставляет несколько функций ловушек (необязательно):
- bind: вызывается только один раз, когда директива привязывается к элементу в первый раз, вы можете определить действие инициализации, которое выполняется один раз во время привязки.
- вставленный: вызывается, когда связанный элемент вставляется в родительский узел (родительский узел может быть вызван, если он существует, он не обязательно должен существовать в документе).
- update: вызывается при обновлении шаблона, содержащего связанный элемент, независимо от того, изменилось ли связанное значение. Путем сравнения значений привязки до и после обновления.
- componentUpdated: вызывается, когда шаблон, содержащий связанный элемент, завершает цикл обновления.
- unbind: вызывается только один раз, когда инструкция отсоединяется от элемента.
Приложения
Ниже приведен пример копирования и вставки текста.
1. Напишите инструкцииcopy.js
const vCopy = {
bind (el, { value }) {
el.$value = value // 用一个全局属性来存传进来的值
el.handler = () => {
if (!el.$value) {
alert('无复制内容')
return
}
// 动态创建 textarea 标签
const textarea = document.createElement('textarea')
// 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
textarea.readOnly = 'readonly'
textarea.style.position = 'absolute'
textarea.style.left = '-9999px'
// 将要 copy 的值赋给 textarea 标签的 value 属性
textarea.value = el.$value
// 将 textarea 插入到 body 中
document.body.appendChild(textarea)
// 选中值并复制
textarea.select()
// textarea.setSelectionRange(0, textarea.value.length);
const result = document.execCommand('Copy')
if (result) {
alert('复制成功')
}
document.body.removeChild(textarea)
}
// 绑定点击事件,就是所谓的一键 copy 啦
el.addEventListener('click', el.handler)
},
// 当传进来的值更新的时候触发
componentUpdated (el, { value }) {
el.$value = value
},
// 指令与元素解绑的时候,移除事件绑定
unbind (el) {
el.removeEventListener('click', el.handler)
}
}
export default vCopy
2. Инструкции по регистрации
import copy from './copy'
// 自定义指令
const directives = {
copy
}
// 这种写法可以批量注册指令
export default {
install (Vue) {
Object.keys(directives).forEach((key) => {
Vue.directive(key, directives[key])
})
}
}
3. Вmain.js
импорт иuse
import Vue from 'vue'
import Directives from './JS/directives'
Vue.use(Directives)
Это можно использовать прямо в проектеvCopy
приказ.