懂个锤子Vue 自定义指定、插槽:

news2024/9/23 5:35:13

Vue自定义指定、插槽🛠️:

前言:当然既然学习框架的了,HTML+CSS+JS三件套必须的就不说了: JavaScript 快速入门

紧跟前文,目标学习Vue2.0——3.0: 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的技术栈…

学习前置链接: 懂个锤子Vue 项目工程化 懂个锤子Vue 项目工程化进阶⏫

自定义指令:

内置指令:Vue.JS提供的一组内置的功能指令,它们以v- 前缀开始:v-text\v-bind\v-if

这些指令使得开发者能够以声明式的方式实现数据与视图的绑定,从而简化了DOM操作;

自定义指令:是Vue.js框架中的一个核心特性,它允许开发者扩展Vue的模板语言:

实现对DOM元素的定制化操作,这种机制为开发者提供了直接操作控制DOM能力;

从而在不深入组件内部逻辑的情况下,增加或修改元素的行为;

自定义指令分为: 全局注册、局部注册;

全局自定义指令:

全局注册: 在Vue中让指令在整个应用程序中可用的方法,通过调用Vue.directive方法完成;

Vue的静态方法 Vue.directive(id, definition) 它接受两个参数:

指令名称:不需加v-前缀,Vue会自动添加,使用时需要加:v-指令名称

定义对象:该对象内包含指令执行的生命周期钩子函数;

  • bind: 指令第一次绑定到元素时触发
  • inserted: 元素被插入到父节点时触发
  • update: 组件内的数据变化导致VNode更新时触发
  • componentUpdated: 组件及子组件更新完成后触发
  • unbind: 指令从元素上解除绑定时触发

定义对象:内置生命钩子函数参数:

  • el: 指令所绑定的DOM元素,这使得你可以在指令的逻辑中直接操作DOM,比如:添加样式、修改属性或触发事件;

  • binding: 包含指令详细信息对象:name指令的名字、value绑定到指令的值、expressionargmodifiers等属性;

  • vnode 和 oldVnode: Vue编译后的虚拟节点,用于更复杂的操作;

    vnode: Vue使用虚拟DOM(VNode)来表示真实的DOM元素,

    oldVnode: 在更新过程中,oldVnode提供了更新前的虚拟节点状态

//main.JS 中定义全局指令:
Vue.directive('自定义指令名称', {
  bind(el, binding, vnode) { /** 初始化操作 */ },
  inserted(el, binding, vnode) { /** 元素插入DOM时的操作 */ },
  update(el, binding, vnode, oldVnode) { /** 数据更新时的操作 */  },
  componentUpdated(el, binding, vnode, oldVnode) { /** 组件及子组件更新后的操作 */ },
  unbind(el, binding, vnode) { /** 解绑前的操作 */ }
});

注意: 全局注册需要定义在main.JS 中,或: 单独定义在JS文件中,main.js 引入并调用:

import Directives from './JS/directives'			//自定义全局指令, JS文件目录;
import Vue from 'vue'
Vue.use(Directives);

全局注册自定义指令在Vue应用中可以简化和复用复杂的DOM操作逻辑,以下是一些应用场景: main.js

自动聚焦:创建一个v-focus指令,使元素在插入页面时自动获取焦点;

//全局注册指令
Vue.directive('focus', {
  //inserted 会在指令所在的元素,被插入到页面中时触发
  inserted (el) {
    // el 就是指令所绑定的元素
    // console.log(el);
    el.focus()
  }
})

在这里插入图片描述

局部自定义指令:

局部注册:Vue.js中一种:更加模块化和灵活的方式,为特定组件添加定制的DOM行为;

与全局注册不同: 局部指令仅在定义它的组件及其子组件中可用,这有助于减少全局命名空间的污染;

自定义指令语法,与全局类似: 在Vue2.x、3.x中,局部指令注册,通常在单文件组件script部分,常规的Vue组件中进行;

export default {
  name: 'App',
  //在Vue组件directives配置项中定义
  directives: {
    //自定义指令名:{ 指令的配置项 }
    myfocus: {
      inserted (el) {
        el.focus(); //对el标签: 扩展额外功能;
      }
    }
  }
}

在这里插入图片描述

自定义指令—传值:

需求: 实现一个 v-color指令 - 传入不同的颜色,给标签设置文字颜色;

<template>
  <div id="app">
    <input type="text" v-model="color" >
    <h1 v-color="color" >局部自定义指令</h1>    <!-- 设置v-color值来自: 输入框,同步 -->
  </div>
</template>

<script>
export default {
  name: 'App',
  //默认color 颜色: 红色;
  data(){ return { color:"red" } },
  //在Vue组件directives配置项中定义
  directives: {
    //指令名:指令的配置项
    //对el标签: 扩展额外功能;
    myfocus: { inserted (el) { el.focus(); } },
    color: {
      //inserted 提供的是元素被添加到页面中时的逻辑
      inserted (el, binding) { el.style.color = binding.value },
      //update 指令的值修改的时候触发,提供值变化后,dom更新的逻辑
      update (el, binding) { el.style.color = binding.value }
    }
  }
}
</script>
<style></style>

在这里插入图片描述

插槽:

Vue.js中的插槽Slot 是组件化开发中的一个核心特性:

它允许在 父组件 ——中向—— 子组件 传递和控制渲染的内容,从而实现更加灵活和复用的组件设计;

举例Demo: 我们经常遇到:引入组件模块样式、结构相同,但组件内容数据不同的情况,当然这也可以通过:父子传参解决

在这里插入图片描述

插槽Slot

插槽Slot 是一种内容分发机制:

使得父组件可以将特定的HTML内容插入到子组件的特定位置,

这使得子组件的结构更加灵活,能够适应不同的内容需求,而不需要修改子组件的内部实现;

为什么需要插槽,不能通过其他方式来解决吗,父子组件通信也可以解决啊🙂:

  • 内容的灵活性:

    没有插槽的情况下,如果想要在子组件中显示不同的内容,通常需要将这些内容硬编码到子组件模板中;

    或者,通过属性传递数据,但这限制了父组件对子组件内部结构的控制;

  • 数据与结构的解耦:

    直接通过属性传递数据并控制结构,可能会导致数据和展示逻辑紧密耦合,不便于维护和扩展

    作用域插槽不仅传递数据,还允许父组件控制如何展示这些数据,

    实现了数据和展示逻辑的分离,提高了代码的可维护性和可读性

  • 组件的封装性与复用性:

    如果每个个性化需求都要求修改子组件,这会破坏组件的封装性,使得维护变得困难;

    通过插槽,子组件可以保持其核心功能和结构不变,同时允许外部内容插入,这样既保持了组件的纯净,又实现了复用;

总结: 插槽本质实现的功能和父子组件通信类似,但对于组件需要大量的数据修改,且伴随结构改变判断,单纯组件实现就会

变得麻烦,插槽定义了明确的填充区域,使得组件的使用方式更加直观,提高了代码的可读性和可维护性;

定义插槽:

应用场景: 实现上述案例,组件警告弹框提示⚠️,插槽修改其内部数据;

插槽基本语法:

  • 组件内需要定制的结构部分,改用<slot></slot>占位;
  • 使用组件时, <组件>替换插槽内容</组件>标签内部, 传入结构替换slot

./components/MyDialog.vue: 自定义组件插槽,警告弹框提示:内容由<slot> 占位,父组件定制传入;

<template>
  <div class="dialog">
    <div class="dialog-header">
      <h3>警告:</h3>
      <span class="close">✖️</span>
    </div>
    <div class="dialog-content">
      <!-- 在需要定制的位置,使用slot占位 -->
      <slot>插值:默认显示内容;</slot>
    </div>
    <div class="dialog-footer">
      <button>取消</button>
      <button>确认</button>
    </div>
  </div>
</template>

<script>
  export default { data () { return {  } } }
</script>
<!-- 省略样式代码 -->
<style scoped></style>

App.vue: 主组件调用——>插槽组件并传值,运行查看效果;

<template>
  <div id="app">
    <!-- 外部使用组件时,不传东西,则slot会显示后备内容 -->
    <MyDialog></MyDialog>
    <!-- 外部使用组件时,传东西了,则slot整体会被换掉 -->
    <MyDialog>组件调用完成,传递数据替换插槽值;</MyDialog>
  </div>
</template>

<script>
import MyDialog from './components/MyDialog.vue'
export default {
  name: 'App',
  data(){ return { } },
  components:{ MyDialog }
}
</script> 
<style></style>

在这里插入图片描述

具名插槽:

具名插槽(Named SlotsVue.js中用于组件间内容分发的一种高级特性,它允许开发者在子组件中定义多个插槽,

父组件可以指定内容插入到子组件的特定插槽中,这种机制提高了组件复用性灵活性,特别是在构建复杂UI结构时

通常情况下,默认插槽:<组件> 替换插槽内容 </组件> 仅支持一个定义插槽,传值;

当子组件需要多个插槽 来接收不同部分的内容时,可以使用具名插槽:

具名插槽基本语法:

  • 在子组件的模板中,通过给<slot name="具名" >元素添加name属性来定义具名插槽;

  • 父组件在使用子组件时,通过v-slot指令指定内容应该插入到子组件的哪个具名插槽中,

    Vue 3中,可以直接在v-slot后跟插槽名称,或者使用冒号前缀来指定;

./components/MyDialog.vue:

<template>
  <div class="dialog">
    <!-- 一旦插槽起了名字,就是具名插槽,只支持定向分发 -->
    <div class="dialog-header">
      <slot name="head">插值头</slot>         <!-- 定义组件插值头 -->     
    </div>
    <div class="dialog-content">
      <slot name="content">插值内容</slot>    <!-- 定义组件插值内容 -->     
    </div>
    <div class="dialog-footer">
      <slot name="footer">插值内容</slot>     <!-- 定义组件插值底部 -->     
    </div>
  </div>
</template>

App.vue: 主组件调用——>插槽组件并传值,运行查看效果;

<template>
  <div id="app">
    <!-- 调用具名插槽需要通过template标签包裹需要分发的结构,包成一个整体 -->
    <MyDialog>
      <!-- 通过`v-slot`指令指定内容应该插入到子组件的哪个具名插槽中 -->
      <template v-slot:head>我是大标题</template>
      <template v-slot:content>我是内容</template>
      <template v-slot:footer> <button>取消</button> <button>确认</button></template>
    </MyDialog>
  </div>
</template>

<script>
import MyDialog from './components/MyDialog.vue'
export default {
  name: 'App',
  data(){ return { } },
  components:{ MyDialog }
}
</script> 
<style></style>

在这里插入图片描述

作用域插槽:

作用域插槽Scoped SlotsVue.js提供的一种高级插槽机制:

普通插槽: 某种意义上类似于,父组件——传递特定数据——渲染子组件,算是一种:父——子通信

作用域插槽: 它允许子组件向父组件传递数据,使得父组件在使用子组件的插槽时能够访问到子组件的内部数据;

这一特性在Vue 2.6中引入,并在Vue 3中通过更简洁的v-slot语法得到进一步的优化和推广;

作用域插槽的核心在于,它创建了一个局部作用域: 这个作用域内的数据由子组件提供;

父组件可以通过插槽来访问这些数据,这使得父组件可以根据子组件的状态\数据:

动态地渲染内容,而无需直接访问子组件的内部状态;

作用域插槽语法:

在这里插入图片描述

  • 子组件:给slot 标签以添加属性的方式传值:所有添加的属性,都会被收集到一个对象中传递;
  • 父组件:template中通过#插槽名= "变量名" 接收确认匹配的插槽,并将数据赋值变量名方便使用,默认插槽名为 #defaul

Demo案例:

封装表格组件: 数据由父组件提供,传递子组件渲染表格,但:数据修改\删除\查询操作还在父组件;

子组件仅是单纯的渲染数据,并支持根据需求自定义:修改\删除\查询操作按钮权限;

而:父组件操作表格信息,就要获取对应信息的ID: 子组件—通过插槽形式—传递父组件

./components/MyDialog.vue:

<template>
  <table class="my-table">
    <thead>
      <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年纪</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 列表数据还是原始的父子传递形式; -->
      <!-- 子组件循环渲染表格 -->
      <tr v-for="(item, index) in data" :key="item.id">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>{{ item.age }}</td>
        <!-- 插槽自定义操作项: -->
        <td>
          <!-- 给slot标签添加属性的方式传值 -->
          <!-- 所有添加的属性,都会被收集到一个JSON对象中发送至父组件 -->
          <slot :row="item" msg="测试文本" ></slot>
        </td>
      </tr>
    </tbody>
  </table>
</template>
<script>
  export default {
    props: { data: Array }  //接受父组件传递数据;
  }
</script>

App.vue: 主组件调用——>插槽组件并传值,运行查看效果;

<template>
  <div id="app">
    <!-- 引入表格组件: 并自定义其支持删除操作 -->
    <MyTable :data="list" >                             <!-- :data 父—传递—子数据 -->
      <template #default="obj">                         <!-- 父组件自定义组件按钮,并获取子组件传递数据信息; -->
        <button @click="del(obj.row.id)">删除</button>  <!-- 在template中,通过 #插槽名="自定义变量名" 接收,默认插槽名为 #default -->
      </template>
    </MyTable>             

    <!-- 引入表格组件: 并自定义其支持查询操作 -->
    <MyTable :data="list" >
      <template #default="obj">
        <button @click="del(obj.row.id)">删除</button>
        <button @click="show(obj.row)">查看</button>
        <button @click="showdata(obj)">数据</button>
      </template>
    </MyTable>
  </div>
</template>

<script>
import MyTable from './components/MyTable.vue'
export default {
  name: 'App',
  data(){
    return {    //定义表格组件渲染数据: 
      list: [
        { id: 1, name: '张小花', age: 18 },
        { id: 2, name: '孙大明', age: 19 },
        { id: 3, name: '刘德忠', age: 17 },
      ]
    } 
  },
  methods: {  //父组件对应操作函数;
    del (id) { this.list = this.list.filter(item => item.id !== id) },
    show (row) { alert(`姓名:${row.name}; 年纪:${row.age}`) },
    showdata(row) { console.log(row) },                               //将子组件solt中定义的值封装成一个JSON对象全传递过来;
  },
  components:{ MyTable }
}
</script> 

在这里插入图片描述

代码管理:

本代码已经使用Git进行管理: 公众号回复:Vue项目工程化

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm与webpack的学习笔记

npm 定义&#xff1a;npm是Node.js标准的软件包管理器。它起初是作为下载和管理Node.js包依赖的方式&#xff0c;但其现在也已成为前端JavaScript中使用的工具。 包 包&#xff1a;将模块、代码、其他资料聚合成一个文件夹 包的分类&#xff1a; 项目包&#xff1a;主要用…

upload-labs-靶场(1-19关详细解答 保姆级教程)

Pass-01 下载 upload-labs-mster靶场 创建一个upload目录 不然无法打开upload-labs 靶场 1.我们先上传一个 php后缀文件 显示我们该文件不允许上传 只能上传 jpg png gif的文件后缀 2.我们可以上传 自己写的php 后缀改成jpg上传 然后抓包 可以看到 数据上传了 我们可以在burps…

5.缓存雪崩问题及解决思路

缓存雪崩问题及解决思路 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; 给不同的Key的TTL添加随机值利用Redis集群提高服务的可用性给缓存业务添加降级限流策略给业务添…

用EasyV全景图低成本重现真实场景,360°感受数字孪生

全景图&#xff0c;即借助绘画、相片、视频、三维模型等形式&#xff0c;通过广角的表现手段&#xff0c;尽可能多表现出周围的环境。避免了一般平面效果图视角单一&#xff0c;不能带来全方位视角的缺陷&#xff0c;能够全方位的展示360度球型范围内的所有景致&#xff0c;最大…

maven插件1(timer-plugin)

[https://maven.apache.org/plugin-developers/index.html(https://maven.apache.org/plugin-developers/index.html) 概述 timer plugin, 提供4个goal: currentTimecurrentDatecurrentMonthcurrentYear 打包 命令 maven clean install 常见错误 goalPrefix MISSING 错…

记录一次环境的安装

目录 新添加的代码 代码解释 为啥ubuntu用debian软件源 为啥修改sources.list.d S权限意思 php缺少和数据库连接的模块 使用root登陆数据库1698错误 字段解释 auth_socket解释 使用root登陆数据库方法 详细解释 首先在安装的时候&#xff0c;有一个dockerfile文件&a…

SpringBoot 依赖之Java Mail Sender邮件发送

Java Mail Sender 依赖名称: Java Mail Sender功能描述: Send email using Java Mail and Spring Framework’s JavaMailSender.使用 Java Mail 和 Spring Framework 的 JavaMailSender 发送电子邮件。 <dependency><groupId>org.springframework.boot</group…

机器学习模型选择与优化: 打造智能IDS

引言 面对琳琅满目的机器学习模型&#xff0c;你是否也感到无从下手&#xff1f;别担心&#xff0c;这篇文章将为你详细讲解各种模型的优缺点&#xff0c;帮助你选择最适合的模型&#xff0c;并进行优化。是时候给你的入侵检测系统装上最强“大脑”了! 机器学习模型概述 监…

java2~~~

类变量 [修饰符] class 类{[其他修饰符] static 数据类型 变量名; } static 用来修饰的结构&#xff1a;属性、方法; 代码块、内部类&#xff1b;&#xff08;构造器不能够用static修饰&#xff09;当类被加载进内存时&#xff0c;静态成员变量随着类一起进入方法区&#xff…

VMware安装Win10系统(保姆级教程)

需要自己先下载并安装VMware 和Win10系统镜像&#xff1a; VMware官网&#xff1a;VMware - Delivering a Digital Foundation For Businesses Win10下载地址&#xff1a;MSDN,我告诉你 1.新建虚拟机设置 2.启动Win10虚拟机设置 注意&#xff1a; 当出现有字体的时候&#…

“论云原生架构及其应用”写作框架软考高级论文系统架构设计师论文

论文真题 近年来&#xff0c;随着数字化转型不断深入&#xff0c;科技创新与业务发展不断融合&#xff0c;各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下&#xff0c;以容器和微服务架构为代表的云原生技术作为云计算服务的新…

行为验证码——错误代码解释

错误代码 前端请求展示错误代码 前端验证错误代码 后端验签错误代码 内容素材的地址:https://www.kgcaptcha.com/docs?vid56&namecwdm

【.NET 8 实战--孢子记账--从单体到微服务】--编写服务端框架

框架是一个项目所必须的&#xff0c;是一组预先编写的代码库和工具&#xff0c;提供了一个可以复用的结构&#xff0c;以帮助开发者快速构建应用程。即使项目目前是一个单体应用&#xff0c;我们还是需要先设计框架的&#xff0c;但是我们不可能在项目的初期就编写出一个完美的…

C语言例题(图形打印,逆序输出,交换数组,平均值)

一.X形图形 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。针对每行输入&#xff0c;输出用“*”组成的X形图案。 代码展示 #include <stdio.h> int main() {int i0;int j…

鸿蒙对接极光推送时候报错1000900010,厂商token获取失败

在AppGallery Connect上配置项目的调试证书&#xff0c;然后手动导入&#xff0c;不要用IDE的自动构建证书&#xff1a; https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/

大模型简介以及该如何学习的路线

人人都看得懂的大模型简介 大模型就像一座庞大的图书馆&#xff0c;里面有非常多的书籍。但与普通图书馆不同的是&#xff0c;这座图书馆中的每本书都是关于不同事物的描述和知识。而这些书籍中的每一页都代表了这个事物的一些特征或细节。现在&#xff0c;想象一下&#xff0c…

KVM高级功能部署

kvm虚拟机迁移 静态迁移(拷贝) 关闭虚拟机 拷贝 磁盘镜像 .xml配置文件 操作方便 动态迁移 动态迁移分为基于共享存储的动态迁移和基于数据块的动态迁移 基于共享存储的动态迁移 利用共享存储,存磁盘镜像,存配置文件速度快不用关虚拟机 基于数据块…

OCCT使用指南:Foundation Classes

1、介绍 本手册解释了如何使用Open CASCADE Technology (OCCT) Foundation Classes。它提供了关于基础类的基础文档。有关基础类及其应用的高级信息&#xff0c;请参阅我们的电子学习和培训产品。 基础类提供各种通用服务&#xff0c;如自动动态内存管理&#xff08;通过句柄操…

抖店到家外卖重新布局,本地生活服务商创业机遇再现

自抖音平台去年推出团购、外卖、小时达等即时零售业务以来&#xff0c;这一举措不仅重塑了本地生活服务领域的竞争格局&#xff0c;也为众多拥有线下门店的商家开辟了全新的增长路径。众多商家敏锐捕捉到了这一市场机遇&#xff0c;纷纷入驻短视频平台&#xff0c;利用平台的强…

c基础 函数

函数 1.函数基本用法 1.1定义和三要素 函数是一个完成特定功能的代码模块&#xff0c;其程序代码独立&#xff0c;通常要求有返回值&#xff0c;也可以是空值。 三要素&#xff1a;功能 参数 返回值 参数&#xff1a;参数就是在函数声明时和函数调用时定义的变量。它用于传递…