Vue—动态组件&插槽&自定义指令

动态组件&插槽&自定义指令

动态组件

动态组件,指的是动态切换组件的显示和隐藏。

如何实现动态组件渲染

vue提供了一个内置的组件,专门用来实现动态组件的渲染

使用keep-alive

可以把内部的组件进行缓存,而不是销毁组件

<script>
	<keep-alive>
    	<component :is = "com'"></component>
    </keep-alive>
</script>

Keep-alive对应的生命周期函数

当组件被缓存时,会自动触发组件的 deactivated 生命周期函数

当组件被激活时,会自动触发组件的 activated 生命周期函数

​ 当组件第一次被创建的时候,既会执行 created生命周期,也会执行activated声明周期

当时,当组件被激活的时候,只会触发 activated 生命周期,不在触发 created 。因为组件没有被重新创建

keep-alive的 include 属性

include:只有名称匹配的组件会被缓存,多个组件中间使用,分割

exclude:指定谁不被缓存。

include 和 exclude 只能出现一个

<script>
	<keep-alive include = "Left">
    	<component :is = "com'"></component>
    </keep-alive>
</script>

扩展

当提供了 name 属性之后,组件的名称,就是 name 属性的值

对比

组件的 “注册名称”的主要应用场景是:以标签的形式,把注册好的组件,渲染和使用到页面结构之中

组件声明时候的“name”名称的主要应用场景: 结合 标签实现组件缓存功能,以及在调试工具总看到组件的 name 名称

插槽(slot)

是vue为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。

如果要把内容填充到指定名称的插槽中,需要使用 v-slot: 这个指令

v-slot: 后面要跟上插槽的名字

v-slot: 指令不能直接用在元素身上,必须用在template标签上

template 这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是不会被渲染为任何实质性的 html 元素

具名插槽

作用域插槽

在封装组件时,为预留的 提供属性对应的值,这种用法,叫做“作用域插槽”

App.vue根组件中的用法


<Article>
	<template #title>
        <h3>好诗~</h3>
    </template>
    <template #content="scope">
        <div>
           <p>啊,大海,全是水</p>
           <p>啊,蜈蚣,全是腿</p>
           <p>啊,辣椒,净辣嘴</p>
           <p>{{scope.msg}}</p>
        </div>
     </template> 
    <template #author>
            <h6>作者:leo</h6>
     </template>
 </Article>

自定义指令

自定义指令的分类

私有自定义指令

在每个vue组件中,可以在 directives 节点下声明 私有自定义指令

<script>
	export default{
        directives:{
            color:{
                //当指令第一次被绑定到元素上的时候,会立即触发bind函数
                //形参中的 el,表示当前指令所绑定到的那个  DOM 对象
                bind(el,binding){
                    el.style.color = binding.value
                },
                //每次 DOM  更新时被调用
                update(el,binding){
                    el.style.color = binding.value
                }
            }
        }
    }
</script>
函数简写
<script>
	export default{
        color(el,binding){
            el.style.color = binding.value 
        }
    }
</script>

全局自定义指令

全局共享的自定义指令需要 通过 "Vue.directive()"进行声明,在 main.js 中声明

	Vue.directive('color',(el,binding)=>{
        el.style.color = binding.value
    	}
    })
上一篇:剖析依赖属性


下一篇:Binding(四):数据校验