Vue(五):动态组件&插槽&自定义指令

目录

一、动态组件

1.1 什么是动态组件

1.2 动态切换组件的显示与隐藏

1.3 使用keep-alive保持状态

1.4 keep-alive对应的生命周期

1.5 keep-alive的include属性

1.6 组件注册名称和组件声明时name的区别

二、插槽

2.1 什么是插槽

2.2 v-slot

2.2.1 v-slot的基本使用

2.2.2 v-slot的简写是#

2.2.3 插槽的默认内容

2.3 具名插槽

2.4 作用域插槽

2.4.1 作用域插槽的基本用法

2.4.2 作用域插槽的解构赋值

2.4.3 基于插槽改造购物车案例

三、自定义指令

3.1  什么是自定义指令

3.2 自定义指令分类

3.2.1 私有自定义指令----基本使用

3.2.2 私有自定义指令---通过binding.value获取指令绑定的值

3.2.3 私有自定义指令---update函数

 3.3 自定义指令----函数简写(注意前提)

 3.4 全局自定义指令


一、动态组件

1.1 什么是动态组件

动态组件指的是动态切换组件的显示与隐藏

1.2 动态切换组件的显示与隐藏

vue提供了一个内置的组件,专门用来实现动态组件的渲染,控制显示页面的属性是is。示例代码如下:

 





实现效果如下:点击展示Left按钮,展示Left.vue页面。电视展示Right按钮,展示Right.vue页面 .效果类似于移动端App的底端Tabbar

Vue(五):动态组件&插槽&自定义指令_第1张图片Vue(五):动态组件&插槽&自定义指令_第2张图片

1.3 使用keep-alive保持状态

 问题描述:若在left.vue页面中添加加1的按钮,加到N后点击展示Right按钮,再点击展示left按钮。此时数字又变成了1。

Vue(五):动态组件&插槽&自定义指令_第3张图片

 解决:采用keep-alive解决上述问题。将要保持的标签外部加keep-alive标签即可

Vue(五):动态组件&插槽&自定义指令_第4张图片

注: keep-alive可以把内部的组件进行缓存,而不是销毁组件

Vue(五):动态组件&插槽&自定义指令_第5张图片

1.4 keep-alive对应的生命周期

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

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

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

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

注:只有加了keep-alive标签的,才有deactivated和activated生命周期函数。

注:生命周期函数应该在子页面中编写

app.vue:






left.vue:




1.5 keep-alive的include属性

include属性用来指定:只有名称匹配的组件会被缓存。多个组件名之间用英文逗号分隔

Vue(五):动态组件&插槽&自定义指令_第6张图片

 exclude用来指定哪些不被缓存。include和exclude不能同时使用

1.6 组件注册名称和组件声明时name的区别

组件的注册名称(App.vue):

Vue(五):动态组件&插槽&自定义指令_第7张图片

 组件声明时的Name(Left.vue)

Vue(五):动态组件&插槽&自定义指令_第8张图片

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

区别:(1)组件的注册名称的主要应用场景是:以标签的形式,把注释好的组件,渲染和使用到页面结构中。

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

二、插槽

2.1 什么是插槽

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

Vue(五):动态组件&插槽&自定义指令_第9张图片

插槽使用示例:

(1)left.vue中用标签占位,声明一个插槽

 Vue(五):动态组件&插槽&自定义指令_第10张图片

(2) App.vue中用p标签填充slot区域

Vue(五):动态组件&插槽&自定义指令_第11张图片

 效果如下:

Vue(五):动态组件&插槽&自定义指令_第12张图片

2.2 v-slot

2.2.1 v-slot的基本使用

注:vue官网规定,每一个slot插槽,都要有一个name名称,如果省略了slot的name属性,则有一个默认的名称叫做default。

默认情况下,在使用组件的时候,提供的内容都会填充到名字为default的插槽之中

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

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

template只是一个虚拟标签,不会被渲染成HTML元素

v-slot使用示例如下:

(1)left.vue中定义插槽,名称为test

Vue(五):动态组件&插槽&自定义指令_第13张图片

 (2)app.vue中使用插槽,通过v-slot 指定插槽名称

Vue(五):动态组件&插槽&自定义指令_第14张图片

2.2.2 v-slot的简写是#

Vue(五):动态组件&插槽&自定义指令_第15张图片

2.2.3 插槽的默认内容

若想指定默认内容。则操作如下:

Vue(五):动态组件&插槽&自定义指令_第16张图片

此时若注释app.vue中传入的内容,页面显示的是“slot的默认内容”。若不去除,则显示的是app.vue中指定的插槽内容。

2.3 具名插槽

具名插槽,顾名思义,就是给每个插槽都起对应的名称,方便用户后期渲染,示例如下:

(1)App.vue






(2)Article.vue





效果如下:

Vue(五):动态组件&插槽&自定义指令_第17张图片

2.4 作用域插槽

2.4.1 作用域插槽的基本用法

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

Vue(五):动态组件&插槽&自定义指令_第18张图片

2.4.2 作用域插槽的解构赋值

Article.vue:





App.vue:






如上,Article.vue中传入了一个对象,在Article.vue设置属性为userinfo对象

Vue(五):动态组件&插槽&自定义指令_第19张图片

App.vue中接收:

Vue(五):动态组件&插槽&自定义指令_第20张图片

 也可采用解构赋值:

Vue(五):动态组件&插槽&自定义指令_第21张图片

2.4.3 基于插槽改造购物车案例

利用插槽实现数量加减的功能:

Vue(五):动态组件&插槽&自定义指令_第22张图片

 在Goods.vue中添加

Vue(五):动态组件&插槽&自定义指令_第23张图片

 (2)App.vue中渲染插槽内容

Vue(五):动态组件&插槽&自定义指令_第24张图片

 

 Vue(五):动态组件&插槽&自定义指令_第25张图片

此时页面效果实现,但是点击加减无反应,且原始的数量值都是1

采用插槽后,Counter.vue属于App.vue的子组件,而不是孙子组件,不需要再像之前一样,借助Goods.vue传值。

(1)默认值属于父向子传值,采用自定义属性的方法。

(2)点击+ / - 属于子向父传值,采用自定义方法。代码如下:

 改造后的Counter.vue





App.vue:

Vue(五):动态组件&插槽&自定义指令_第26张图片

methods中定义getNewNum方法,将传过来的值,赋值给对应id项

Vue(五):动态组件&插槽&自定义指令_第27张图片

三、自定义指令

3.1  什么是自定义指令

vue官方提供了v-text,v-for,v-if等常用的指令,还允许开发者自定义指令。

3.2 自定义指令分类

(1)私有自定义指令 

(2)全局自定义指令

3.2.1 私有自定义指令----基本使用

在每个vue组件中,可以在directives节点下声明私有自定义指令,示例代码如下:

(1)定义:在directives节点下定义自定义指令

Vue(五):动态组件&插槽&自定义指令_第28张图片

 (2)使用:使用时在自定义指令前加v-

Vue(五):动态组件&插槽&自定义指令_第29张图片

3.2.2 私有自定义指令---通过binding.value获取指令绑定的值

 若想在v-color后加属性值,则directives中需要借助binding形参,binding.value就是v-color获取到的值,用法如下:

Vue(五):动态组件&插槽&自定义指令_第30张图片

 Vue(五):动态组件&插槽&自定义指令_第31张图片

Vue(五):动态组件&插槽&自定义指令_第32张图片

3.2.3 私有自定义指令---update函数

bind函数只调用一次:当指令第一次绑定到元素时调用,当DOM更新时bind函数不会被触发。update函数会在每次DOM更新时被调用。示例代码如下:

在App.vue中创建按钮,更改color的值,更改后color的值更改成功,但页面无更新。原因是bind函数只在第一次绑定元素时生效,后期值更新后不生效。需要借助update函数实现:

Vue(五):动态组件&插槽&自定义指令_第33张图片

Vue(五):动态组件&插槽&自定义指令_第34张图片

 注:bind和update函数都需要,bing函数负责第一次绑定元素,update负责后期更新

 3.3 自定义指令----函数简写(注意前提)

 若bind和update函数内部的语句一样,可简写:

Vue(五):动态组件&插槽&自定义指令_第35张图片

 Vue(五):动态组件&插槽&自定义指令_第36张图片

 3.4 全局自定义指令

全局共享自定义指令通过Vue.directive()在main.js中声明,示例代码如下:

参数1:字符串,表示全局自定义指令的名字

参数2:对象,用来接收指令的参数值

Vue(五):动态组件&插槽&自定义指令_第37张图片

可简写为:

Vue(五):动态组件&插槽&自定义指令_第38张图片

注:过滤器和自定义指令一般都全局定义!!!!

小知识

main.js中这个配置用来定义控制台是否展示提示 :

提示在上线前将模式修改为production,仅为提示,无实际意义,默认为false 

Vue(五):动态组件&插槽&自定义指令_第39张图片

Vue(五):动态组件&插槽&自定义指令_第40张图片

你可能感兴趣的:(vue,vue.js,前端,javascript)