vue 进阶---动态组件 插槽 自定义指令

news/2024/5/10 9:39:28/文章来源:https://blog.csdn.net/ClearloveYt/article/details/131598869

目录

动态组件

如何实现动态组件渲染

使用 keep-alive 保持状态

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

keep-alive 的 include 属性和exclude属性 

插槽

插槽的基础用法

具名插槽

作用域插槽

自定义指令

自定义指令的分类

私有自定义指令

全局自定义指令

了解 eslint 插件的 配置

axios 挂载到veu的原型及全局配置


动态组件

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

如何实现动态组件渲染

vue 提供了一个内置的 <component> 组件, 专门用来实现动态组件的渲染, 示例代码如下
 <!-- 1. component 标签是 vue 内置的,作用:组件的占位符 --><!-- 2. is 属性的值,表示要渲染的组件的名字 --><!-- 3. is 属性的值,应该是组件在 components 节点下的注册名称 --><button @click="comName = 'Left'">展示 Left</button><button @click="comName = 'Right'">展示 Right</button><component :is="comName"></component>data() {return {// comName 表示要展示的组件的名字comName: 'Left'}},

当is 指向另外一个组件时原本的组件会被销毁

使用 keep-alive 保持状态

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

 keep-alive 会把内部的组件进行缓存,而不是销毁组件 

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

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

当组件 被缓存 时,会自动触发组件的 deactivated 生命周期函数。
当组件 被激活 时,会自动触发组件的 activated 生命周期函数。
export default {created() {console.log('Left 组件被创建了!')},// 当组件第一次被创建的时候,既会执行 created 生命周期,也会执行 activated 生命周期// 当时,当组件被激活的时候,只会触发 activated 生命周期,不再触发 created。因为组件没有被重新创建activated() {console.log('组件被激活了,activated')},deactivated() {console.log('组件被缓存了,deactivated')}
}

keep-alive 的 include 属性和exclude属性 

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

1、如果在“声明组件”的时候,没有为组件指定 name 名称,则组件的名称默认就是“注册时候的名称”
2. 如果组件声明时候的 “name” 名称  就用声明名称 


<keep-alive include="名称"> <component :is="comName"></component></keep-alive>

exclude属性用来排除 谁不会被缓存 

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

注意: 不要同时使用 include 和 exclude 这两个属性

对比:

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

  // 2. 组件声明时候的 “name” 名称的主要应用场景:结合 <keep-alive> 标签实现组件缓存功能;以及在调试工具中看到组件的 name 名称

插槽

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

插槽的基础用法

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

组件中
<!-- 声明一个插槽区域 --><!-- vue 官方规定:每一个 slot 插槽,都要有一个 name 名称 --><!-- 如果省略了 slot 的 name 属性,则有一个默认名称叫做 default --><slot  name="default"></slot>
<Left><!-- 默认情况下,在使用组件的时候,提供的内容都会被填充到名字为 default 的插槽之中 --><!-- 1. 如果要把内容填充到指定名称的插槽中,需要使用 v-slot: 这个指令 --><!-- 2. v-slot: 后面要跟上插槽的名字 --><!-- 3. v-slot: 指令不能直接用在元素身上,必须用在 template 标签上 --><!-- 4. template 这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是,不会被渲染为任何实质性的 html 元素 --><!-- 5. v-slot: 指令的简写形式是 # --><template #default><p>这是在 Left 组件的内容区域,声明的 p 标签</p></template>
</Left>
没有预留插槽的内容会被丢弃
如果在封装组件时 没有预留任何 <slot> 插槽 ,则用户提供的任何 自定义内容 会被丢弃
后备内容
封装组件时,可以为预留的 <slot> 插槽提供 后备内容 (默认内容)。如果组件的使用者没有为插槽提供任何内容,则后备内容会生效

具名插槽

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

为具名插槽提供内容
在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的 形式提供其名称。
 <template #title><h3>一首诗</h3></template>

作用域插槽

在封装组件的过程中,可以为预留的 <slot> 插槽绑定 props 数据,这种 带有 props 数据的 <slot> 叫做“ 作用 域插槽 ” 
<slot name="content" msg="hello vue.js"></slot>
使用 v-slot: 的形式,接收作用域插槽对外提供的数据
作用域插槽对外提供的数据对象,可以使用 解构赋值 简化数据的接收过程
 <template #content="{ msg, user }">

自定义指令

vue 官方提供了 v-text、v-for、v-model、v-if 等常用的指令。除此之外 vue 还允许开发者自定义指令。

自定义指令的分类

vue 中的自定义指令分为两类,分别是:
  •  私有自定义指令
  •  全局自定义指令

私有自定义指令

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

directives: {// 定义名为 color 的指令,指向一个配置对象color: {// 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数// 形参中的 el 表示当前指令所绑定到的那个 DOM 对象bind(el) {console.log('触发了 v-color 的 bind 函数')el.style.color = 'red'}
}
在使用自定义指令时,需要加上 v- 前缀
为自定义指令 动态绑定参数值
在 template 结构中 使用自定义指令 时,可以通过等号( = )的方式,为当前指令 动态绑定参数值
<h1 v-color="color">App 根组件</h1>data() {return {color: 'blue'}}

通过 binding 获取指令的参数值
directives: {color: {bind(el, binding) {console.log('触发了 v-color 的 bind 函数')el.style.color = binding.value},
update 函数
bind 函数 只调用 1 次 :当指令第一次绑定到元素时调用, 当 DOM 更新时 bind 函数不会被触发 update 函 数会在 每次 DOM 更新时 被调用。示例代码如下:
<button @click="color = 'green'">改变 color 的颜色值</button>bind(el, binding) {console.log('触发了 v-color 的 bind 函数')el.style.color = binding.value},// 在 DOM 更新的时候,会触发 update 函数update(el, binding) {console.log('触发了 v-color 的 update 函数')el.style.color = binding.value}
函数简写
如果 bind  update 函数中的 逻辑完全相同 ,则 对象格式 的自定义指令可以简写成 函数格式
 color(el, binding) {el.style.color = binding.value}

全局自定义指令

全局共享的自定义指令需要通过“Vue.directive()”进行声明,示例代码如下:

Vue.directive('color', function(el, binding) {el.style.color = binding.value
})

了解 eslint 插件的 配置

核心概念 - ESLint - 插件化的 JavaScript 代码检查工具

ESLint 是一个可配置的 JavaScript 检查器。它可以帮助你发现并修复 JavaScript 代码中的问题。问题可以指潜在的运行时漏洞、未使用最佳实践、风格问题等。

项目创建 

eslint插件的 配置

    // ESLint 插件的配置"editor.codeActionsOnSave":{"source.fixAll": true,},

安装Prettier - Code formatter 

配置

   "prettier.configPath": "C:\\Users\\自己的用户名\\.prettierrc","eslint.alwaysShowStatus": true,"prettier.trailingComma": "none","prettier.semi": false,// 每行文字个数超出此限制将会被迫换行"prettier.printWidth": 300,// 使用单引号替换双引号"prettier.singleQuote": true,"prettier.arrowParens": "avoid",// 设置 .vue 文件中,HTML代码的格式化插件"vetur.format.defaultFormatter.html": "js-beautify-html","vetur.ignoreProjectWarning": true,"vetur.format.defaultFormatterOptions": {"js-beautify-html": {"wrap_attributes": false},"prettier": {"printWidth": 300,"trailingComma": "none","semi": false,"singleQuote": true,"arrowParens": "avoid"}}, 

在C:\\Users\\自己的用户名\新建 .prettierrc 文件

{"semi": false, "singleQuote": true, "printWidth": 300, "trailingComma": "none"}

右键点击“使用...格式化文档”将Prettier - Code formatter配置为默认格式化程序

安装完插件后 新建组件遵循驼峰命名

axios 挂载到veu的原型及全局配置

安装完插件后  安装axios可能会报错,所以安装时的命令时 : nnpm i axios --force -S

把axios 挂载到veu的原型上 

在mian.js中 

import axios from 'axios'Vue.prototype.axios = axios
this.axios.get('请求url')

配置请求路径

//全局配置
axios.defaults.baseURL = '请求根路径'

不利于API接口的复用

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费开源 | 基于SpringBoot的博客系统

介绍 基于springboot后端架构&#xff0c;websocket实现私信&#xff0c;前端采用thymeleafbootstraplayuiRedis 注册使用邮箱验证注册&#xff0c;且验证码存在redis中&#xff0c;所以需要有redis环境 软件架构 springbootwebsocketthymeleafbootstraplayuiRedismysql 8.…

Vue 数据双向绑定

双向数据绑定 : 通过前面学习知道 Vue 是数据驱动的&#xff0c;数据驱动有一个精髓之处是数据双向绑定&#xff0c; 即当数据发生变化的时候&#xff0c;视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。&#xff08;就是mvvm数据发生变化…

C#,中国福利彩票《刮刮乐》的数学算法(01)——幸运123

彩票名称&#xff1a;幸运123面值&#xff1a;20元/张最高奖&#xff1a;100万&#xff08;人民币&#xff09;全套款式&#xff1a;2款玩法介绍&#xff1a; 一份好运&#xff0c;二倍快乐&#xff0c;三重惊喜。福彩刮刮乐新游戏“幸运123”&#xff0c;红色的票面上点缀着礼…

spring 详解二 IOC(Bean xml配置及DI)

配置列表 Xml配置 功能描述 <bean id"" class""></bean> Bean的id&#xff0c;配置id会转为Bean名称和不配就是全限定类名 <bean name"" ></bean> Bean的别名配置&#xff0c;存储在Factory的aliasMap中通过别名也…

Qt自定义控件之动画文本

文章目录 前言一、动画文本的效果二、具体实现定义动画对象设置动画时长的实现设置text函数实现绘制代码设置字体函数 三、高级部分操作代码总结 前言 在 Qt 中&#xff0c;自定义控件可以让我们实现丰富的用户界面效果和交互体验。其中&#xff0c;动画文本是一种常见的效果&…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…

Redis知识补充(1)

1)Redis本身就是在内存中进行存储数据的&#xff0c;那么为什么不直接定义一个变量来针对数据直接进行存储呢&#xff1f;因为Redis主要是应用于分布式系统&#xff0c;才能发挥它的最大威力&#xff0c;如果只是一个单机程序&#xff0c;通过变量存储数据的方式&#xff0c;是…

Kotlin~Composite组合模式

概念 能够帮助实现树状结构的模式。 主要特点 递归组合树状结构统一处理所有对象 角色介绍 Component: 组合接口Leaf: 叶子节点&#xff0c;无子节点Composite&#xff1a;枝节点&#xff0c;用来存储子部件 UML 代码实现 interface Organ {fun personCount():Int } cla…

[VUE学习】从头搭建权限管理系统前端-初始化

1.安装Node 2.安装Vue Cli vue的一个脚手架 npm install -g vue/cli 3.vue ui搭建vue项目 cmd 运行 vue ui 然后创建新项目 选择npm 选择配置 Babel 是编译的 Router 是路由 vuex 是状态保存的 Linter/fomatter 代码检测和格式化 创建完成 这个时候 代码在我们本地…

解决IDEA/WebStorm的Ctrl+Shift+F冲突失效

IDEA 的 CtrlShiftF 是全文或全项目搜索搜索快捷键&#xff0c;非常好用。 当这个快捷键偶而会失效时&#xff0c;基本可以确定是快捷键冲突了。 检查所有运行的软件的快捷键&#xff0c;若有设置为CtrlShiftF的则改掉。特别是输入法会占用较多的快捷键。 例如我这里的搜过输…

Skywalking高级使用

Skywalking高级使用 RPC调用监控Mysql调用监控Skywalking常用插件获取追踪ID过滤指定的端点告警功能Skywalking原理Open Tracing介绍 RPC调用监控 Skywalking(6.5.0)支持的RPC框架有以下几种&#xff1a; (1) Dubbo 2.5.4 -> 2.6.0 (2) Dubbox 2.8.4 (3) Apache Dubbo 2.7.…

Git gui教程---第四篇 Git gui的使用 添加文件,并提交

添加文件&#xff0c;并提交 新建一个txt文件点击扫描重新扫描&#xff0c;未缓存改动多了我们刚刚新建的文件。 点击缓存改动&#xff0c;文件位置变换。 如果缓存选错&#xff0c;想撤销&#xff0c;在菜单栏选择“提交”&#xff0c;“从本次提交撤销”&#xff0c;文件变更…

实例解释在lingo中使用集合模型

某部门有三个生产同一产品的工厂&#xff08;产地&#xff09;&#xff0c;生产的产品运往四个销售点&#xff08;销地&#xff09;出售&#xff0c;各个工厂的生产量、各销地的销量&#xff08;单位&#xff1a;吨&#xff09;、从各个工厂到各个销售点的单位运价&#xff08;…

动态规划之62 不同路径(第4道)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

debian to go

可以使用虚拟机操作&#xff0c;在运行镜像到安装步骤时选择 u盘 不需要手动分 /boot 分区之类的&#xff0c;“Automaction”自动分区就行&#xff0c;全安装到根目录。boot load 安装到 /dev/sdb&#xff0c;也就是硬盘本身 推荐使用gpt分区表&#xff0c;建议拿不用的盘练…

js实现图片压缩

创建一个type"file"的input标签&#xff0c;用于文件上传。 <input type"file" name"" id"upload" value"" />通过js实现图片压缩 window.onload function () {const upload document.getElementById("upload…

范德波尔方程可视化

Van der Pol方程如下所示 d x d t y d y d t − x ( 1 − x 2 ) y \begin{equation} \begin{aligned} \frac{dx}{dt} & y \\ \frac{dy}{dt} & -x(1-x^2)y \end{aligned} \end{equation} dtdx​dtdy​​y−x(1−x2)y​​​ 相应的程序如下 为了观看长期趋势&…

【LeetCode每日一题合集】2023.7.3-2023.7.9

文章目录 2023.7.3——445. 两数相加 II&#xff08;大数相加/高精度加法&#xff09;2023.7.4——2679. 矩阵中的和2023.7.5——2600. K 件物品的最大和&#xff08;贪心&#xff09;代码1——贪心模拟代码2——Java一行 2023.7.6——2178. 拆分成最多数目的正偶数之和&#x…

STM32的ADC模式及其应用例程介绍

STM32的ADC模式及其应用例程介绍 &#x1f4cd;ST官方相关应用笔记介绍资料&#xff1a;https://www.stmcu.com.cn/Designresource/detail/application_note/705947&#x1f4cc;相关例程资源包&#xff1a;STSW-STM32028&#xff1a;https://www.st.com/zh/embedded-software/…