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

文章目录

  • 一、动态组件
    • (一) 什么是动态组件
    • (二)如何实现动态组件渲染
    • (三)使用 keep-alive 保持状态
    • (四)keep-alive 对应的生命周期函数
    • (五) keep-alive 的 include、exclude 属性
    • (六)了解注册名称和组件中name的区别
  • 二、插槽
    • (一) 什么是插槽
    • (二) 体验插槽的基础用法
      • 1、 没有预留插槽的内容会被丢弃
      • 2、后备内容
    • (三) 具名插槽
      • 1、 为具名插槽提供内容
      • 2、 具名插槽的简写形式
    • (四) 作用域插槽
      • 1、使用作用域插槽
      • 2、 解构插槽 Prop
  • 三、自定义指令
    • (一)什么是自定义指令
    • (二)自定义指令的分类
    • (三)私有自定义指令
    • (四)使用自定义指令
    • (五)为自定义指令动态绑定参数值
    • (六)通过 binding 获取指令的参数值
    • (七)update 函数
    • (八)函数简写
    • (九)全局自定义指令


一、动态组件

(一) 什么是动态组件

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

(二)如何实现动态组件渲染

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

示例代码如下:

<template>
  <div class="app-container">
    <h1 ref="myh12">App 根组件h1>
    <component :is="comName">component>

    <button @click="comName = 'Left'">展示Leftbutton>
    <button @click="comName = 'right'">展示Rightbutton>
  div>
template>

<script>
import Left from '@/components/Left.vue'
import Right from '@/components/Right.vue'
export default {
  data() {
    return {
      comName: 'Left'
    }
  },
  components: { Left, Right },//必须引入组件,否则找不见位置
}
script>

(三)使用 keep-alive 保持状态

默认情况下,切换动态组件时无法保持组件的状态。此时可以使用 vue 内置的 组件保持动态组件的状态。示例代码如下:

 <keep-alive>
   <component :is="comName">component>
 keep-alive>

(四)keep-alive 对应的生命周期函数

  • 当组件被缓存时,会自动触发组件deactivated 生命周期函数。
  • 当组件被激活时,会自动触发组件activated 生命周期函数。
export default {
  name:'Left',
  created() {
    console.log('组件被创建了')
  },
  destroyed() {
    console.log('组件被销毁了')
  },

  activated() {
    console.log('组件被激活了')
  },
  deactivated() {
    console.log('组件被缓存了')
  }
}

(五) keep-alive 的 include、exclude 属性

  • include 属性用来指定:只有名称匹配的组件被缓存
  • exclude属性用来指定:只有名称匹配的组件不会被缓存
  • 多个组件名之间使用英文的逗号分隔
  • 两个属性不要同时使用
<keep-alive include="Left,Right">
  <component :is="comName">component>
keep-alive>

或者

<keep-alive exclude="Left">
  <component :is="comName">component>
keep-alive>

(六)了解注册名称和组件中name的区别

  • 注册名称:以标签形式把组件渲染到页面中
  • 组件中声明的name:结合实现组件缓存功能

二、插槽

(一) 什么是插槽

  • 插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。
  • 可以把插槽认为是组件封装期间,为用户预留的内容的占位符

(二) 体验插槽的基础用法

在封装组件时,可以通过 元素定义插槽,从而为用户预留内容占位符。示例代码如下:

//父组件
<Left>这是个插槽Left>

//子组件--Left
<div class="left-container">
    <slot>slot>
div>

1、 没有预留插槽的内容会被丢弃

如果在封装组件时没有预留任何 插槽,则用户提供的任何自定义内容都会被丢弃

//父组件
<Left>没有预留插槽,这段文字会被丢弃Left>

//子组件--Left
<div class="left-container">
div>

2、后备内容

封装组件时,可以为预留的 插槽提供后备内容(默认内容)。如果组件的使用者没有为插槽提供任何内容,则后备内容会生效。

//父组件
<Left>Left>

//子组件--Left
<div class="left-container">
    <slot>这是插槽默认内容,没有提供具体内容时显示slot>
div>

(三) 具名插槽

如果在封装组件时需要预留多个插槽节点,则需要为每个 插槽指定具体的 name 名称。这种带有具体名称的插槽叫做“具名插槽”。

<div class="left-container">
  <header>
    <slot name="header">slot>
  header>
  <main>
    <slot>slot>
  main>
  <footer>
    <slot name="footer">slot>
  footer>
div>

注意:没有指定 name 名称的插槽,会有隐含的名称叫做 “default”。

1、 为具名插槽提供内容

在向具名插槽提供内容的时候,我们可以在一个