VUE组件
动态组件
<button
v-for="item in tabs"
:key="item"
@click="setCurrentTab(item)"
:class="{ isActive: currentTab === item }"
>
{
{
item }}
</button>
<component :is="currentComponent"></component>
components: {
TabArticle, TabHome, TabPosts }
data() {
return {
tabs: ["Home", "Posts", "Article"],
currentTab: "Home",
};
}
methods: {
setCurrentTab(val) {
this.currentTab = val;
},
}
computed: {
currentComponent: function () {
return "tab-" + this.currentTab.toLowerCase();
}
}
异步组件(按需加载)
我们不仅可以在路由中使用异步加载组件,也可以在页面中
引入组件
import HomeHeader from './components/Header'
改成
components: {
HomeHeader: () => import('./components/Header')
}
使用vue异步组件,可以将复杂页面的框架代码和子组件代码拆开,优先加载框架代码,显著提高页面加载速度
keep-alive(用keep-alive组件来实现组件缓存)
![在这里插入图片描述](https://img-blog.csdnimg.cn/898f67f8dd9c4cfba9a335e76bade7b8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNjI0NjA1ODY=,size_18,color_FFFFFF,t_70,g_se,x_16#pic_center)
在动态组件上使用keep-alive(如tab切换组件),会保留这些组件的状态,避免反复重新渲染导致的性能问题
如果没用keep-alive,会重新创建渲染组件,造成不必要的浪费
Slots 允许外部环境将额外的内容组合在组件中。
<child>
<!-- 对应子组件中button的插槽 -->
<mybutton slot="button">slot按钮</mybutton>
<p>匿名插槽</p>
</child>
<div class="child-btn">
<slot name="button"></slot>
<slot><slot>
</div>
组件之间通信的方式
父向子传递数据通过props,子向父是通过events($emit)
通过父链、子链通信($parent/$children/$refs)
provide/inject Api
$attrs/$lisenters
bus
vuex
props/$emit
props:{
propA:Number,
propB:[String,Number]
propC:{
type:String,
required:true
}
propC:{
type:Number,
default:100
}
propE:{
type:Object,
default:function(){
return {
message:'hello' }
}
}
propF:{
validator:function(value){
return value > 10
}
}
}