Vue组件进阶(动态组件,组件缓存,组件插槽,具名插槽,作用域插槽)与自定义指令

news2024/11/15 18:50:56

Vue组件进阶与自定义指令

  • 一、Vue组件进阶
    • 1.1 动态组件
    • 1.2 组件缓存
    • 1.3 组件激活和非激活
    • 1.4 组件插槽
    • 1.5 具名插槽
    • 1.6 作用域插槽
    • 1.7 作用域插槽使用场景
  • 二、自定义指令
    • 2.1 自定义指令--注册
    • 2.2 自定义指令-传参

一、Vue组件进阶

1.1 动态组件

多个组件使用同一个挂载点,并动态切换

在这里插入图片描述

实现流程

在这里插入图片描述

代码

<template>
    <div>
        <button @click="comName = 'UserName'">账号密码填写</button>
        <button @click="comName = 'UserInfo'">个人信息填写</button>
        <p>下面显示注册组件的动态切换</p>
        <div style="border: 1px solid red;">
            <component :is="comName"></component>
        </div>
    </div>
</template>

<script>
// 目标:动态组件-切换组件显示
//1.创建要被切换的组件 - 标签+样式
//2.引入到要展示的vue文件内
//3.准备一个变量承载要显示的组件名
//4.设置挂载点<component :is="变量"></component>
import UserName from '../components/01/UserName.vue'
import UserInfo from '../components/01/UserInfo.vue'
export default {
    components: {
        UserInfo,
        UserName
    },
    data() {
        return {
            comName: 'UserName' ,//准备一个变量
        }
    }
}
</script>

1.2 组件缓存

原因:频繁的切换会导致组件频繁创建和销毁,性能不高

  • 语法: Vue内置的keep-alive组件 包起来要频繁切换的组件
<div style="border: 1px solid red;">
    <keep-alive>
        <!-- Vue内置组件  包起来进行缓存 -->
        <component :is="comName"></component>
    </keep-alive>
</div>
 //dom更改后
    created() {
        console.log('username组件创建了');
    },
    //实例销毁
    destroyed() {
        console.log('username组件销毁了');
    },

1.3 组件激活和非激活

扩展2个新的生命周期方法

  • activated -- 激活时触发
  • deactivated -- 失去激活状态触发
 //组件缓存后  多了两个钩子函数
    activated() {
        console.log('username组件激活了');
    },
    deactivated() {
        console.log('username组件失去激活状态');
    }

1.4 组件插槽

通过 slot 标签, 让组件内可以接收不同的标签结构显示

在这里插入图片描述

语法

  • 1.组件内使用<slot></slot>进行占位
  • 2.使用组件时<Pannel></Pannel>夹着的地方,传入标签替换slot
    在这里插入图片描述

插槽默认内容

  • <slot>内放置内容, 作为默认显示内容
  • 不给组件传标签. slot内容原地显示
  • 给组件内传标签, 则slot整体被换掉

父组件代码

<Pannel>
    <img src="../../src/assets/logo.png" alt="">
    <span>我是图片</span>
</Pannel>
<Pannel>
    <p>寒雨连江夜入吴,</p>
    <p>平明送客楚山孤。</p>
    <p>洛阳亲友如相问,</p>
    <p>一片冰心在玉壶。</p>
</Pannel>
<Pannel></Pannel>

子组件代码

<div>
    <!-- 按钮标题 -->
    <div class="title">
        <h4>芙蓉楼送辛渐</h4>
        <span class="btn" @click="isShow = !isShow">
            {{ isShow ? "收起" : "展开" }}
        </span>
    </div>
    <!-- 下拉内容 -->
    <div class="container" v-show="isShow">
        <slot>
            <!-- 没有传则显示默认内容 -->
            我是默认的显示内容
        </slot>
    </div>
</div>

1.5 具名插槽

一个组件内有2处以上需要外部传入标签的地方

  • 语法
    • 1.slot使用name属性区分名字
    • 2.template配合v-slot:名字来分发对应标签
  • v-slot; 可以简写为#
    在这里插入图片描述

父组件代码

<Pannel>
    <template v-slot:title>
        <h4>
            芙蓉楼送辛渐
        </h4>
    </template>
    <template v-slot:content>
        <img src="../../src/assets/logo.png" alt="">
        <span>我是图片111</span>
    </template>
</Pannel>

<Pannel>
    <template #title>
        <h4>
            v-slot:可简写成#号
        </h4>
    </template>
    <template #content>
        <img src="../../src/assets/logo.png" alt="">
        <span>我是图片222</span>
    </template>
</Pannel>

子组件代码

<div>
    <!-- 按钮标题 -->
    <div class="title">
        <slot name="title"></slot>
        <span class="btn" @click="isShow = !isShow">
            {{ isShow ? "收起" : "展开" }}
        </span>
    </div>
    <!-- 下拉内容 -->
    <div class="container" v-show="isShow">
        <slot name="content">
            我是默认的显示内容
        </slot>
    </div>
</div>

1.6 作用域插槽

在使用子组件时,父组件需要使用子组件里的变量

在这里插入图片描述

步骤

  • 1.子组件, 在slot上绑定属性和子组件内的值
  • 2. 父组件, 传入自定义标签, 用template和v-slot="自定义变量名"
  • 3. scope变量名自动绑定slot上所有属性和值
    • scope = {row: defaultObj}

在这里插入图片描述

父组件代码

<Pannel>
    <template v-slot="scope">
        <!-- scope变量{row:defaultObj} -->
        {{ scope.row.defaultTwo }}
    </template>
</Pannel>

子组件代码

<template>
    <div>
        <!-- 按钮标题 -->
        <div class="title">
            <h4>作用域插槽</h4>
            <span class="btn" @click="isShow = !isShow">
                {{ isShow ? "收起" : "展开" }}
            </span>
        </div>
        <!-- 下拉内容 -->
        <div class="container" v-show="isShow">
            <slot :row="defaultObj">
                {{ defaultObj.defaultOne }}
            </slot>
        </div>
    </div>
</template>
  
<script>
//目标:作用域 插槽
//场景:使用插槽 使用组件内的变量
//1.slot标签,自定义属性和内变量关联
//2.使用组件 template配合v-slot="变量名"
//变量名会收集slot身上的属性和值形成对象
export default {
    data() {
        return {
            isShow: false,
            defaultObj: {
                defaultOne: '无名氏',
                defaultTwo: '木子'
            }
        };
    },
};

1.7 作用域插槽使用场景

在这里插入图片描述
在这里插入图片描述

父组件代码

<template>
    <div>
        <Mytable :arr="list">
        </Mytable>
        <Mytable :arr="list">
            <!-- scope:{row:obj} -->
            <template v-slot="scope">
                <a :href="scope.row.headImgUrl">{{ scope.row.headImgUrl }}</a>
            </template>
        </Mytable>
        <Mytable :arr="list">
            <template v-slot="scope">
                <img :src="scope.row.headImgUrl" alt="">
            </template>
        </Mytable>
    </div>
</template>

<script>
import Mytable from '../components/06/MyTable.vue'
export default {
    components: {
        Mytable
    },
    data() {
        return {
            list: [
                {
                    name: "小传同学",
                    age: 18,
                    headImgUrl:
                        "http://yun.itheima.com/Upload/./Images/20210303/603f2d2153241.jpg",
                },
                {
                    name: "小黑同学",
                    age: 25,
                    headImgUrl:
                        "http://yun.itheima.com/Upload/./Images/20210304/6040b101a18ef.jpg",
                },
                {
                    name: "智慧同学",
                    age: 21,
                    headImgUrl:
                        "http://yun.itheima.com/Upload/./Images/20210302/603e0142e535f.jpg",
                },
            ],
        }
    }
}
</script>

子组件代码

<template>
    <div>
        <table border="1">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>头像</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(obj, index) in arr">
                    <td>{{ index + 1 }}</td>
                    <td>{{ obj.name }}</td>
                    <td>{{ obj.age }}</td>
                    <td>
                        <!-- 标签不确定 slot插槽占位 -->
                        <!-- 默认显示文字 -->
                        <slot :row="obj">{{ obj.headImgUrl }}</slot>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</template>
  
<script>
export default {
    props: {
        arr: Array
    }
}
</script>

二、自定义指令

2.1 自定义指令–注册

获取标签, 扩展额外的功能

  • 全局注册 main.js
//全局指令  到处直接使用
Vue.directive("gfocus", {
  inserted(el) {
    console.log('el', el);
    el.focus(); //触发标签的事件方法
  }
})
  • 局部注册
directives: {
        focus: {
            inserted(el) {
                el.focus()
            }
        }
    },

使用 v-指令名

<input v-focus type="text">

2.2 自定义指令-传参

语法

//注意:inserted方法 指令所在标签,被插入到网页上才会触发(一次)
//update方法 指令对应数据/标签更新时,此方法执行
//目标:自定义指令全局 传值
Vue.directive('color', {
  inserted(el, binding) {
    console.log('binding', binding);
    el.style.color = binding.value
  },
  update(el, binding) {
    el.style.color = binding.value

  }
})

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

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

相关文章

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…

Java分布式解决方案(一)

随着互联网的不断发展&#xff0c;互联网企业的业务在飞速变化&#xff0c;推动着系统架构也在不断地发生变化。 如今微服务技术越来越成熟&#xff0c;很多企业都采用微服务架构来支撑内部及对外的业务&#xff0c;尤其是在高 并发大流量的电商业务场景下&#xff0c;微服务…

Linux内核学习笔记——页表的那些事。

目录页表什么时候创建内核页表变化什么时候更新到用户页表源码分析常见问题解答问题一&#xff1a;页表到底是保存在内核空间中还是用户空间中&#xff1f;问题2&#xff1a;页表访问&#xff0c;软件是不是会频繁陷入内核&#xff1f;问题3&#xff1a;内存申请&#xff0c;软…

LaTeX表格自定义行高+自定义列宽+大表格自适应页面宽度

一、自定义行高 默认行高效果 自定义行高效果&#xff1a;看起来更美观、大方些 实现方式&#xff1a;在LaTeX表格中的\begin{table}和\begin{tabular}之间插入命令\renewcommand\arraystretch{1.5}&#xff0c;其中1.5这个数值是可以自定义的&#xff0c;数值越大&#xff0c;…

xmu 离散数学 卢杨班作业详解【8-12章】

文章目录第八章 树23456810第九章46811第十章24567第十一章14571116第十二章131317第八章 树 2 (2) 设有k片树叶 2∗m2∗43∗3k2*m2*43*3k2∗m2∗43∗3k n23kn23kn23k mn−1mn-1mn−1 联立解得k9 T中有9片树叶 3 有三颗非同构的生成树 4 (1) c --abc e–abed f–dgf…

2023.03.05 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.SAMPLING THE OUTPUT5.LOSS FUNCTION DESIGN5.1 ranking loss: Top1 & BPR5.2 VANISHING GRADIENTS5.3 ranking-max loss fuction5.4 BPR-max with score regularization6.实验7.结论深度学习1.相关性1.1 什么是相关性1.2 协方差1…

套接字实现TCP

套接字 套接字的意义就是客户端与服务器进行双向通信的端点&#xff0c;如果有不理解点上面套接字三字更近距离了解套接字。 网络套接字与客户连接的特定网络有关的服务端口号&#xff0c;这个端口号允许linux进入特定的端口号的连接转到正确的服务器进程。 套接字通信的建立过…

【数据结构与算法】数据结构有哪些?算法有哪些?

1. 算法与数据结构总览图 2.常用的数据结构 2.1.数组&#xff08;Array&#xff09; 数组是一种聚合数据类型&#xff0c;它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构&#xff0c;在各种编程语言中都有对应。一个数组可以分解为多个数…

k8s篇之Pod 干预与 PDB

文章目录自愿干预和非自愿干预PDBPDB 示例分离集群所有者和应用程序所有者角色如何在集群上执行中断操作自愿干预和非自愿干预 Pod 不会消失&#xff0c;除非有人&#xff08;用户或控制器&#xff09;将其销毁&#xff0c;或者出现了不可避免的硬件或软件系统错误。 我们把这…

Vue+ECharts实现可视化大屏

由于项目需要一个数据大屏页面&#xff0c;所以今天学习了vue结合echarts的图标绘制 首先需要安装ECharts npm install echarts --save因为只是在数据大屏页面绘制图表&#xff0c;所以我们无需把它设置为全局变量。 可以直接在该页面引入echarts&#xff0c;就可以在数据大…

『MyBatis技术内幕』源码调试前提

准备源代码包 下载源代码 3.4.6 版本 https://github.com/mybatis/mybatis-3/releases?page2 通过 idea 导入然后回自动下载所有依赖&#xff0c;根据 3.4.6 版本的 pom.xml 找到依赖的 mybatis-parent 版本 <parent><groupId>org.mybatis</groupId><ar…

《计算机网络:自顶向下方法》学习笔记——第一章:计算机网络和因特网

计网 第一章 计算机网络和因特网 1.1 什么是因特网 回答这个问题有两种方式 其一&#xff0c;我们能够描述因特网的具体构成&#xff0c;即构成因特网的基本硬件和软件组件&#xff1b;其二&#xff0c;我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.…

加油站ai视觉识别系统 yolov7

加油站ai视觉识别系统通过yolov7网络模型深度学习&#xff0c;加油站ai视觉识别算法对现场画面中人员打电话抽烟等违规行为&#xff0c;还有现场出现明火烟雾等危险状态。除此之外&#xff0c;模型算法还可以对卸油时灭火器未正确摆放、人员离岗不在现场、卸油过程静电释放时间…

20230304学习笔记

1、Mybatis #{}和${}的区别是什么 a、#{}是预编辑处理、是占位符&#xff0c;${}是字符串拼接符。 b、#{}替换为&#xff1f;号&#xff0c;用PreparedStatement来赋值&#xff0c;${}直接替换变量的值&#xff0c;用Statement赋值。 c、#{}在DBMS中、自动加入单引号&#…

XSS-labs靶场1-13关解法答案

目录 XSS-labs克隆/下载地址: 第一关 解法 第二关 解法 第三关 解法 第四关 解法 第五关 解法 第六关 解法 第七关 解法 第八关 解法 第九关 解法 第十关 解法 第十一关 解法 第十二关 解法 第十三关 解法 从XSS payload 中关于浏览器解码的一些总结 XSS-labs克隆/下载地…

javaDoc生成方式

javaDoc生成方式 命令行生成 在cmd控制台窗口上找到需要生成文件的路径&#xff0c;然后执行命令。 # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding UTF-8 -charset UTF-8 Doc.java这样就生成完成了。 测试Doc.java文件 package com.jiang.base;/***…

grid了解

结构 <div class"grid"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>&l…

css中重难点整理

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…

LeetCode分类刷题-----贪心算法

贪心算法贪心455.分发饼干376.摆动序列53.最大子序和122.买卖股票的最佳时机||55.跳跃游戏45.跳跃游戏||1005.K次取反后最大化的数组和134.加油站135.分发糖果860.柠檬水找零406.根据身高重建队列452.用最少数量的箭引爆气球![在这里插入图片描述](https://img-blog.csdnimg.cn…

[算法和数据结构]--回溯算法之DFS初识

回溯算法——DFSDFS介绍(Depth First Search)DFS经典题目1. 员工的重要性2. 图像渲染3.被围绕的区域4.岛屿数量5. 电话号码的字母组合6.数字组合7. 活字印刷8. N皇后DFS介绍(Depth First Search) 回溯法&#xff08;back tracking&#xff09;&#xff08;探索与回溯法&#x…