введение
В одностраничном приложении Vue мы привыкли использовать трилогию синтаксиса шаблона, кода js и стиля. Этот универсальный метод написания может удовлетворить большинство потребностей разработки. Vue также предоставляет на официальном сайте множество гибких и эффективных синтаксисов и API предоставляются для использования разработчиками. Давайте посмотрим на эти полезные и интересные.
текст
1. Миксин
Миксины предоставляют очень гибкий способ распространения повторно используемой функциональности в компонентах Vue. Миксин может содержать любые параметры компонента, т. е. жизненный цикл, базовые данные, методы экземпляра, и когда компонент использует миксин, все параметры из миксина будут «подмешаны» к собственным параметрам компонента. Когда нам нужно использовать данные и методы на каждой отдельной странице外部的对象中Затем определение импортируется в соответствующий экземпляр. Это можно рассматривать как усиление экземпляра.
// 单页面组件
<template>
<div class=''>
{{mixinData}} // '我是混入的数据'(可以引入到混入的对象的data)
</div>
</template>
<script>
import mixin from'./mixin'
export default {
mixins:[mixin],
data () {
return {
innerData:'我是单页面本身的数据'
};
},
methods: {
mixins(){
alert('我是单页面的方法')
}
},
created() {
alert('我是单页面本身created的生命周期')
this.mixins() //
},
}
// 混入的对象mixin
export default {
created(){
alert('我是mixin内部的created的生命周期')
},
data(){
return {
mixinData:'我是混入的数据'
}
},
methods: {
mixins(){
alert('我是mixin内部的方法')
}
},
}
Результат вывода:我是mixin内部的created的生命周期 -> 我是单页面本身created的生命周期 -> 我是单页面的方法
сводная записка敲黑板:
- Крюк функционирует с тем же именем (созданным, установленным и т. Д.) Будет объединена в массив, поэтому все будут вызываться. Кроме того, крючки микса будут называться перед собственными крючками компонента.
- Опции, значением которых является объект, такие как методы, компоненты, директивы и т. д., будут объединены в один и тот же объект. Когда имена ключей двух объектов конфликтуют, возьмите пару ключ-значение объекта-компонента.
一切以组件优先 - Данные объекта данных имеют приоритет над данными компонента в случае конфликта
2. Функция рендеринга
VUE по-прежнему использует синтаксис разделенных шаблонов html js css в файлах шаблонов для создания одностраничных приложений, но я считаю, что контроль над тегами html немного недостаточен, и может быть недостаточно поддержки для отображения разных тегов в соответствии с разными данными. нужно полностью пройти все возможные ситуации. Это, безусловно, избыточно и неэффективно.
Здесь мы представляем официальные примеры для лучшего объяснения.
<template>
<div class=''> // 根绝参数来渲染出不同的行标签你会发现下面的代码是冗余的,不但代码冗长,而且在每一个级别的标题中重复书写了 <slot></slot>
<h1 v-if="type === 1">
<slot></slot>
</h1>
<h2 v-else-if="type === 2">
<slot></slot>
</h2>
<h3 v-else-if="type === 3">
<slot></slot>
</h3>
</div>
</template>
<script>
export default {
props: {
type: {
type: Number, // 引入了一个父组件传入的参数
default: 1
},
},
}
</script>
<style lang='less' scoped>
</style>
если больше行标签Затем число в шаблоне будет постепенно увеличиваться, и в то же время будет увеличиваться повторное выполнение суждения. Такого трудоемкого и неблагодарного дела нам следует избегать. Итак, мы представимrender()рендерить. то есть использоватьrenderфункция вместо этогоtemplate标签на отрисовке этикеток.
子组件
import Vue from 'vue'
Vue.component('Heading',{
render:function(createElement){
return createElement(`h${this.type}`,this.$slots.default) // 这行代码完成了模板渲染中的关于h标签的选择部分
},
props: {
type: {
type: Number,
default: 1
},
},
})
<!--父组件-->
<Heading :type="2">123</Heading> // 渲染结果 <h2>123</h2>
createElementЭто допустимый параметр функции рендеринга.С помощью createElement можно построить древовидную структуру для рендеринга. Первый параметр — метка, второй — значение атрибута, соответствующее метке, а третий может быть вложеннымcreateElement数组То есть массив вложенных тегов. внутри массиваcreateElement选项Также может быть вложенным. Подробные решения и примеры можно найти в официальной документации.Вот идея.
import Vue from 'vue'
Vue.component('Heading',{
render:function(createElement){
return createElement(`div`,[createElement('h1','h1的内容'),createElement('h2','h2的内容')])
},
})
上述的渲染函数出来的dom等同于:
<div>
<h1>h1的内容</h1>
<h2>h2的内容</h2>
</div>
3. Функциональные компоненты
Разница между функциональными компонентами и общими компонентами в том, что нет жизненного цикла, отзывчивых данных, вычисляемых свойств и т. д., то есть функциональные компоненты можно понимать как компонент без экземпляра vue, и он принимает только один
props, что также принесло ему характеристики быстрого рендеринга.
Сценарий личного использования: я буду использовать инкапсуляцию в нескольких одноуровневых компонентах. Например, здесь у меня есть требование к отображению: я хочу отобразить тот же источник данных с помощью дополнительных методов отображения, таких как карточки и списки. Если мы напишем весь этот код в одном компоненте
解耦度低, если мы напишем дисплей как компонент и введем все родительские компоненты, то снова появится код冗余. Таким образом, мы можем предоставить компонент для分发Компоненты, отвечающие условиям. Каждый из них может использоваться отдельно в сборе дисплея, а компоненты могут использоваться в одном корпусе.
// 父组件
<template>
<div class='father'>
<card-component v-if="type===card"></card-component> // 不同组件我们需要都引入到父组件中
<list-component v-if="type===list"></list-component>
<circle-component v-if="type===circle"></circle-component>
</div>
</template>
<script>
export default {
data () {
return {
type:'card'
};
},
}
</script>
//重写父组件
<template>
<div class='father'>
<function-component :type="type"></function-component> // 函数组件分发
</div>
</template>
//函数组件
<template functional> // functional是标记模板语法这个组件是函数式组件,如果不使用模板就应该设置functional:true
<div class='father'>
<card-component v-if="prop.type===card"></card-component> // 不同组件我们引入函数组件
<list-component v-if="prop.type===list"></list-component>
<circle-component v-if="prop.type===circle"></circle-component>
</div>
</template>
конец
Если появятся новые, они будут продолжать обновляться.