【Vue】2-14、插槽 自定义指令

news/2024/7/5 2:31:18

一、插槽

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

<template>
  <div class="app-container">
    <h1>App 根组件</h1>
    <hr />

    <div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left>
        <!-- 
          默认情况下,在使用组件的时候提供的内容都会被填充到名称为 default 的插槽当中
          v-slot 指令只能用于 template 组件中
        -->
        <!--  <template v-slot:default> -->
        <template #default>
          <p>这是在 Left 组件中声明的 p 标签</p>
        </template>
      </Left>
    </div>
  </div>
</template>

<script>
import Left from "@/components/Left.vue";

export default {
  components: {
    Left,
  },
};
</script>

<style lang="less">
    .app-container {
        padding: 1px 20px 20px;
        background-color: #efefef;
    }
    .box {
        display: flex;
    }
</style>

<template>
  <div class="left-container">
    <h3>Left 组件</h3>
    <hr />
    <!-- 声明插槽区域 -->
    <!-- Vue 官方规定每个插槽都要有一个 name 名称,若省略了 name 属性,则有一个默认 name 名称:default -->
    <slot>
      <!-- 若用户没有在使用 Left 组件时指定插槽中的内容,即默认展示 slot 标签中的内容:官方称为 “后备内容” -->
      这是 deault 插槽中默认的内容
    </slot>
  </div>
</template>

<script>
export default {};
</script>

<style lang="less">
    .left-container {
          padding: 0 20px 20px;
          background-color: orange;
          min-height: 250px;
          flex: 1;
    }
</style>

二、具名插槽 

带有 name 名称的 slot 插槽就是具名插槽  

<template>
  <div class="aricle-container">
    <!-- 文字的标题 -->
    <div class="header-box">
      <slot name="title"></slot>
    </div>
    <!-- 文字的内容 -->
    <div class="content-box">
      <slot name="content"></slot>
    </div>
    <!-- 文字的作者 -->
    <div class="footer-box">
      <slot name="author"></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: "Article",
  data() {
    return {};
  },
};
</script>

<style lang="less" scoped>
.aricle-container {
  > div {
    min-height: 150px;
  }
  .header-box {
    background-color: pink;
  }
  .content-box {
    background-color: lightskyblue;
  }
  .footer-box {
    background-color: lightgreen;
  }
}
</style>
<template>
  <div class="app-container">
    <h1>App 根组件</h1>

    <Article>
      <template #title>
        <h3>一首诗</h3>
      </template>
      <template #content>
        <div>
          <p>锄禾日当午,汗滴禾下土</p>
          <p>锄禾日当午,汗滴禾下土</p>
          <p>锄禾日当午,汗滴禾下土</p>
          <p>锄禾日当午,汗滴禾下土</p>
        </div>
      </template>
      <template #author>
        <p>佚名</p>
      </template>
    </Article>

    <hr />

    <div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left style="display: none">
        <!-- 
          默认情况下,在使用组件的时候提供的内容都会被填充到名称为 default 的插槽当中
          v-slot 指令只能用于 template 组件中
        -->
        <!--  <template v-slot:default> -->
        <template #default>
          <p>这是在 Left 组件中声明的 p 标签</p>
        </template>
      </Left>
    </div>
  </div>
</template>

<script>
import Left from "@/components/Left.vue";
import Article from "@/components/Article.vue";

export default {
  components: {
    Left,
    Article,
  },
};
</script>

<style lang="less">
.app-container {
  padding: 1px 20px 20px;
  background-color: #efefef;
}
.box {
  display: flex;
}
</style>

作用域插槽:  

<!-- 在封装组件时,为预留的 slot 提供属性对应的值,这种做法叫做:作用域插槽 -->
<div class="content-box">
	<slot name="content" msg="hello vue"></slot>
</div>
<template #content="obj">
 <div>
     <p>锄禾日当午,汗滴禾下土</p>
     <p>锄禾日当午,汗滴禾下土</p>
     <p>锄禾日当午,汗滴禾下土</p>
     <p>锄禾日当午,汗滴禾下土</p>
     <p>{{ obj }}</p>
 </div>
</template>

三、自定义指令 

1、私有自定义指令

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

directives:{
	color:{
		// 为绑定到的 HTML 元素设置红色的文字
		bind(el){
			// 形参中的 el 是绑定了此指令的、原生的 DOM 对象
			el.style.color = 'pink'
		}
	}
}

注意:

当指令第一次绑定到元素时调用 bind 函数,当 DOM 更新时 bind 函数不会触发。

update 函数会在每次 DOM 更新时被调用

directives: {
    color: {
      // 为绑定到的 HTML 元素设置红色的文字
      bind(el, binding) {
        // 形参中的 el 是绑定了此指令的、原生的 DOM 对象
        el.style.color = binding.value;
      },
      update(el, binding) {
        el.style.color = binding.value;
      },
    },
  },

若 bind 和 update 函数中的逻辑完全相同,则对象格式的自定义指令可以简写成函数格式:  

color(el, binding) {
    el.style.color = binding.value;
},

2、全局自定义指令

全局共享的自定义指令需要通过 Vue.directive() 进行声明

// 参数一:字符串,表示全局自定义指令的名字
// 参数二:对象,用来接收指令的参数值
Vue.directive('color',function(el,binfing){
	el.style.color = binding.value
})

一  叶  知  秋,奥  妙  玄  心


http://lihuaxi.xjx100.cn/news/2006014.html

相关文章

mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题

mfc140.dll是Microsoft Foundation Class (MFC)库中的一个非常重要的DLL文件。它承载了许多被执行程序使用的函数和资源。这个库主要被广泛应用于开发Windows操作系统上的应用程序。然而&#xff0c;有时候我们可能会遭遇到mfc140.dll缺失或损坏的情况&#xff0c;这会导致依赖…

Vue中的插槽Slot如何使用

在Vue中&#xff0c;插槽&#xff08;Slot&#xff09;允许你在组件的模板中定义一些可变内容&#xff0c;以便在使用组件时进行替换或传递额外的内容。插槽是Vue中组件化开发的一个重要特性&#xff0c;它使得组件更加灵活和可复用。 以下是使用插槽的步骤&#xff1a; 在组件…

视频压缩很简单,只需看这几个!【无损压缩】

在当今数字化的时代&#xff0c;视频成为了信息传递、娱乐和沟通的重要媒介。然而&#xff0c;随着高清和超高清视频的流行&#xff0c;视频文件的体积也相应增大&#xff0c;给存储、传输和分享带来了一系列挑战。为了克服这些问题&#xff0c;视频压缩技术应运而生。本文将深…

2023年12月CCF-GESP编程能力等级认证Python编程六级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 通讯卫星在通信网络系统中主要起到( )的作用。 A:信息过滤 B:信号中继 C:避免攻击 D:数据加密 答案:B 第2题 小杨想编写一个判断任意输入的整数N是否为素数的程序,下面哪个方法…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

2024 年适用于 Android 手机的 10 个最佳数据恢复软件

不小心丢失私人信息&#xff1f;别担心&#xff0c;我们整理了一份适用于Android的顶级数据恢复软件的完整列表&#xff01; 在日常生活中&#xff0c;我们可能会因为不小心删除或丢失私人信息而感到焦虑和恐慌。特别是当这些信息包含孩子的成长瞬间或重要的工作文件时&#x…

Python之数据分析

【案例】 某公司有2份数据文件&#xff0c;现在需要对其进行数据分析&#xff0c;计算每日的销售额并以柱状图表的形式进行展现。 数据如下&#xff1a; 一月份数据&#xff1a; 二月份数据&#xff1a; 需求分析 根据题目要求我们要得到每日销售额&#xff0c;分析文本数据可以…

二分(聪明的质检员)

[NOIP2011 提高组] 聪明的质监员 题目描述 小T 是一名质量监督员&#xff0c;最近负责检验一批矿产的质量。这批矿产共有 n n n 个矿石&#xff0c;从 1 1 1 到 n n n 逐一编号&#xff0c;每个矿石都有自己的重量 w i w_i wi​ 以及价值 v i v_i vi​ 。检验矿产的流程…