1. Динамические имена свойств: Вы можете использовать выражения для установки имен динамических свойств или имен методов:
<!-- 属性name -->
<a :[name]="url"> ... </a>
<!-- 计算属性sss和s -->
<img :[sss]="/img/test.png"/>
<!-- 方法change1和change2 -->
<img :[change1()]="change2()"/>
data: {
name: 'href',
sss: 'src'
}
Примечание. Чтобы избежать пробелов, кавычек и т. д. и требовать строчных букв, вы можете использовать вычислительные свойства для работы со сложными выражениями, вам нужно использовать []
2. computed/methods/watch
-
computedбыть пригодным для использованияget/set
computed: {
top() {
return 'top'
},
name: {
get () {
return this.name
},
set (val) {
this.name = val
}
}
}
-
computedЕго можно кешировать, но нельзя передавать параметры, он будет меняться в соответствии с изменением атрибута в данных, то есть он будет меняться в соответствии с отзывчивой зависимостью, иDateНе реактивная зависимость, т.е. не изменится;methodТогда расчет будет выполняться каждый раз, но параметры можно будет передавать. -
watchИспользуется для обработки асинхронных или ресурсоемких операций, например при вводе в поиск.
3. привязка стиля
- прямой объект или переменный объект
- вычисляемое свойство
- прямой стиль или объект стиля
<!-- 属性名可加引号也可不加,属性小驼峰 -->
<div :style="{ 'color': 'red', fontSize: fontSize + 'px' }">样式3</div>
- Массив комбинированных тринокулярных/массивных комбинированных объектов
data: {
isActive: true,
activeClass: 'active'
}
<!-- 使用数组时变量和字符串需要通过引号来区分 -->
<div :class="[isActive ? activeClass : '', 'errorClass']"></div>
<!-- 使用对象时类名不加引号可表示变量也可表示字符串 -->
<div :class="[{ active: isActive }, 'errorClass']"></div>
4. v-if условный рендеринг
- быть пригодным для использования
templateэлементы упаковки,templateбудет рассматриваться как невидимый элемент обертки
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
- решение с несколькими условиями
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
5. key
- Добавить к
keyне допуститьvueПовторно используйте элементы, которые вы не хотите использовать повторно, как показано ниже.inputЕсли не добавитьkey,ноvueбудет повторно использованkey,а потомinputизvalueЗначение сохраняется после переключения, т.к.vueтолько что заменилplaceholder
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email-input">
</template>
6. v-if и v-show
-
v-ifКомпоненты разрушения и восстановления, если начальные условияfalse, ничего не делать, пока это не станет истинным, поэтому затраты на переключение высоки, подходят, когда условия работы редко меняются -
v-showдаdisplay:noneа такжеblockмеждуCSSПереключение, основанное на рендеринге, будет рендериться независимо от начальных условий, поэтому первоначальные накладные расходы на рендеринг высоки, и это подходит, когда частота переключения высока.
7. v-for
- быть пригодным для использования
inилиof - Также возможно перебирать объекты:
v-for="(value, key, index) in obj" - согласно с
templateВизуализация нескольких комбинированных элементов:
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider"></li>
</template>
</ul>
8. v-для и v-если
-
v-forболее высокий приоритет, поэтомуv-ifбудет повторяться для каждогоv-forВ цикле, поэтому старайтесь не использовать их вместе, вы можете использовать вычисляемое свойство для фильтрации данных перед обходом.
9. Изменить адаптивные данные
Vue.set(object, key, value)this.$set(object, key, value)this.items.splice(index, 1, newValue)- Массовое добавление объектов:
// 不要直接Object.assign(this.items, {age: 18}
this.items = Object.assign({}, this.items, {
age: 18,
favoriteColor: 'Vue Green'
})
10. Модификаторы событий
-
.passive: событие прокрутки по умолчанию запускается немедленно, то есть сообщает браузеру, что вы не хотите предотвращать срабатывание события по умолчанию, что может повысить производительность мобильного терминала.
<div @scroll.passive="onScroll">...</div>
-
.capture: Использовать режим захвата событий при добавлении прослушивателей событий, то есть события, инициированные самим элементом, сначала обрабатываются здесь, а затем передаются внутренним элементам для обработки -
.self: только тогда, когдаevent.targetОбработчик срабатывает, когда сам текущий элемент, то есть событие срабатывает не от внутреннего элемента -
.once: событие щелчка сработает только один раз. - Модификаторы клавиатуры:
<input @keyup.enter="submit">
11. v-model
- поле выбора
<!-- 单选框时,picked为字符串 "a",不是布尔值 -->
<input type="radio" value="a" v-model="picked">
<!-- 多选框时,toggle默认值设为字符串或布尔值时得到布尔值,设为数组时得到的是value值-->
<input type="checkbox" value="b" v-model="toggle">
<!-- 当选中第一个选项时,selected为字符串value的值 "abc" -->
<select v-model="selected">
<option value="abc">ABC</option>
</select>
- модификатор
.lazy:существуетchangeиногда вместоinputобновлять время от времени<input v-model.lazy="msg" >
Примечание: событие изменения запускается, когда ввод теряет фокус, а именно для переключателей, флажков и полей выбора, а событие ввода запускается, когда значение изменяется в значении, но скрипт не изменяет значение, когда значение триггера, а именно, для текста и текстовая область
- модификатор
.number: преобразование входного значения в числовое значение. - модификатор
.trim: фильтрация завершающих пробельных символов
12. Prop
- использовать
v-bind="obj"рассматривает каждое свойство объекта как отдельноеpropОн передается, поэтому его нужно получать один за другим при приеме.
<test v-bind="obj"></test>
-
propsХотя это односторонний поток данных, для ссылочных типов дочерний компонент все же может изменять состояние родительского компонента. -
propsбудет проверен перед созданием экземпляра компонента, поэтому свойства экземпляра будутdefaultилиvalidatorнедоступен в .
13. Пользовательские события
- Пользовательские события должны обращать внимание на то, чтобы имя события было в нижнем регистре или разделялось, т.к.
$emit('BaseEvent')Хотя название события не меняется, вhtmlИмя события будет преобразовано в нижний регистр и не будет отслеживаться.
14. slot
- именованный слот
<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<!-- 默认插槽也可不用加上template和v-slot -->
<template v-slot:default>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</template>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
- слот с прицелом
<!-- current-user组件 -->
<span>
<slot :user="user">
{{ user.lastName }}
</slot>
</span>
<!-- 父级组件通过自定义名称访问子级作用域 -->
<current-user>
<template v-slot:default="slotProps">
{{ slotProps.user.firstName }}
</template>
</current-user>
<!-- 支持缩写和解构 -->
<current-user>
<template #default="{ user = { firstName: Gust } }">
{{ user.firstName }}
</template>
</current-user>
15. Коммуникация компонентов
vuex/eventBusprop/$emit$children/$parentprovide/inject$refs
// 父或祖先级
provide: function () {
return {
getMap: this.getMap
}
}
// 后代级
inject: ['getMap']
16. scope
-
scopedproperties автоматически добавит уникальное свойство (например,data-v-21e5b78) указывает область действия CSS внутри компонента при компиляции.list-container:hoverбудет скомпилирован во что-то вроде.list-container[data-v-21e5b78]:hover
17. Маршрутизация
-
различать:
this.$routerотносится к маршрутизатору,this.$routeОтносится к текущему маршруту -
подстановочный знак: поймать все маршруты или
404 Not foundмаршрутизация
// 含通配符的路由都要放在最后,因为优先级由定义顺序决定
{
// 会匹配所有路径
path: '*'
}
{
// 会匹配以 `/user-` 开头的任意路径
path: '/user-*'
}
- При использовании подстановочного знака
$route.paramsавтоматически добавит файл с именемpathMatchпараметр. это содержитURLЧасти, соответствующие подстановочным знакам:
// 给出一个路由 { path: '/user-*' }
this.$router.push('/user-admin')
this.$route.params.pathMatch // 'admin'
// 给出一个路由 { path: '*' }
this.$router.push('/non-existing')
this.$route.params.pathMatch // '/non-existing'
-
нажмите
<router-link :to="...">эквивалентно вызовуrouter.push(...)метод, потому что<router-link>будет вызывать этот метод внутри, а затем вhistoryдобавить новую запись в стек -
использовал
push, если предусмотреноpathнеполный, тоparamsБудет проигнорирован, необходимо обеспечить маршрутизациюnameили рукописный в комплекте с параметрамиpath:
const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user
-
router.push/router.replace/router.goподражатьwindow.history.pushState/window.history.replaceState/window.history.go -
Именованные представления:
router-viewимя может быть установлено, еслиrouter-viewЕсли имя не задано, то по умолчанию используется значение по умолчанию.
<router-view></router-view>
<router-view name="a"></router-view>
<router-view name="b"></router-view>
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar,
b: Baz
}
}
]
})
- использование маршрута
props: параметры маршрута могут быть установлены как свойства компонента.
const User = {
props: ['id'],
template: '<div>User {{ id }}</div>'
}
// 通过布尔值设置
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User, props: true },
// 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
{
path: '/user/:id',
components: { default: User, sidebar: Sidebar },
props: { default: true, sidebar: false }
}
]
})
// 通过函数设置query
// URL /search?q=vue 会将 {name: 'vue'} 作为属性传递给 SearchUser 组件
const router = new VueRouter({
routes: [
{ path: '/search', component: SearchUser, props: (route) => ({ name: route.query.q }) }
]
})
-
beforeRouteEnter: быть пригодным для использованияbeforeRouteEnterЧтобы получить данные интерфейса заранее, вам необходимо получить доступ к экземплярам после NEXT:
beforeRouteEnter(to, from, next) {
axios('/text.json').then(res => {
next(vm => {
vm.datas = res
})
})
}
- Когда маршрут задан с параметрами, если вы перейдете на страницу, а затем вернетесь через клавишу возврата, маршрут сохранит параметры.
pushЕсли переход возвращается, параметр не будет сохранен, на что нужно обратить внимание, когда третья сторона вызывает модуль для передачи параметра.
18. loader
- Vue Loader компилирует один файл
templateblock, преобразует все встречающиеся ресурсы URL в запросы модуля webpack:
// <img src="../image.png">将会被编译成为:
createElement('img', {
attrs: {
src: require('../image.png') // 现在这是一个模块的请求了
}
})
- Правила преобразования URL ресурса
- Если это абсолютный путь, например.
/images/foo.png), останется как есть. - Если путь начинается с
.Вначале будут рассматриваться как относительные зависимости модулей и разрешаться в соответствии со структурой каталогов в вашей локальной файловой системе. - Если путь начинается с
~В начале следующие части будут рассматриваться как зависимости модуля. - Если путь начинается с
@Вначале это также рассматривается как зависимость модуля.