【Vue笔记】Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用

news2025/1/18 3:23:29

这篇文章,主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。

目录

一、插槽slot介绍

1.1、默认插槽

1.2、具名插槽

(1)如何定义具名插槽???

(2)如何使用具名插槽???

(3)具名插槽缩写

1.3、插槽默认内容

1.4、作用域插槽

二、自定义组件v-model属性(Vue2.x版本)

2.1、单个v-model属性 

2.2、多个v-model属性


一、插槽slot介绍

上一篇文章介绍了Vue中组件的知识(Vue组件介绍),父子组件之间可以传递数据,那能不能传递HTML代码段呢???答案是:可以的。这里介绍的插槽slot就是用于向子组件中传递HTML代码段的,slot就相当于是一个占位符,它在子组件中使用【<slot>】标签定义,使用的时候,只需要在组件的开始标签和结束标签之间编写代码,这些代码都将被替换到子组件【slot标签】位置。

1.1、默认插槽

默认情况下,如果在子组件里面只有一个【slot】插槽标签,那么这个插槽可以不用名称,默认名称就是:【default】,就把它叫做:默认插槽。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slot插槽</title>
</head>
<body>

<div id="app">
    <h3>slot插槽</h3>
    <!-- 使用组件 -->
    <demo-comp>
        <!-- 组件之间的内容都将替换到子组件slot位置 -->
        <div>
            <ul>
                <li>111111</li>
                <li>222222</li>
                <li>333333</li>
            </ul>
        </div>
    </demo-comp>
</div>

<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        template: `<div>
            <h4>下面slot标签会被替换成对应的内容</h4>
            <slot></slot>
        </div>`
    };
    // 注册全局组件

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp }
    });
</script>
</body>
</html>

1.2、具名插槽

一个组件里面也可以包含多个【<slot>】插槽标签,由于具有多个插槽,那么在使用插槽的时候,就需要知道哪些代码段是替换到哪些slot插槽位置,所以这个时候,就需要给每一个slot插槽起一个名称,带有名称的slot插槽,叫做:具名插槽(具有名字的插槽)

注意:Vue的版本需要在2.6.x之后才支持v-slot命令和name属性,不然不生效。

(1)如何定义具名插槽???

  • 定义具名插槽,只需要在【<slot>】标签通过【name】属性指定名称即可。
// 创建全局组件
const demoComp = {
    template: `<div>
        <h4>这是插槽01</h4>
        <!-- 定义插槽位置 -->
        <slot name="first"></slot>
        <h4>这是插槽02</h4>
        <!-- 定义插槽位置 -->
        <slot name="second"></slot>
    </div>`
};

(2)如何使用具名插槽???

  • 在父组件中,使用【v-slot】命令将内容填充到指定的插槽位置即可。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slot具名插槽</title>
</head>
<body>

<div id="app">
    <h3>slot具名插槽</h3>
    <!-- 使用组件 -->
    <demo-comp>
        <template v-slot:first>
            <div>
                这是替换到第一个插槽
            </div>
        </template>
        <template v-slot:second>
            <div>
                这是替换到第二个插槽
            </div>
        </template>
    </demo-comp>
</div>

<script src="https://cdn.staticfile.org/vue/2.6.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        template: `<div>
            <h4>这是插槽01</h4>
            <!-- 定义插槽位置 -->
            <slot name="first"></slot>
            <h4>这是插槽02</h4>
            <!-- 定义插槽位置 -->
            <slot name="second"></slot>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp }
    });
</script>
</body>
</html>

(3)具名插槽缩写

具名插槽使用的时候,是通过【v-slot:插槽名称】来使用的,但是这个命令有点长了,所以可以缩写成【#插槽名称】的格式。

1.3、插槽默认内容

当父组件没有传递内容给子组件中的slot插槽时候,这个时候默认是不显示任何内容的,如果我们需要默认显示一些内容,可以在【<slot>】标签之间写上默认显示的内容,这样,当父组件没有传递内容时候,子组件将显示默认的内容。

<slot name="first">
    <div>
        <b>这是默认显示的slot内容</b>
    </div>
</slot>

完整案例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slot具名插槽--默认内容</title>
</head>
<body>

<div id="app">
    <h3>slot具名插槽--默认内容</h3>
    <!-- 使用组件 -->
    <demo-comp></demo-comp>
</div>

<script src="https://cdn.staticfile.org/vue/2.6.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        template: `<div>
            <h4>这是插槽01</h4>
            <!-- 定义插槽位置 -->
            <slot name="first">
                <div>
                    <b>这是默认显示的slot内容</b>
                </div>
            </slot>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp }
    });
</script>
</body>
</html>

1.4、作用域插槽

父组件中使用插槽的时候,要如何获取到子组件中的数据呢???为了解决这个问题,Vue提供了作用域插槽,作用域插槽渲染的时候,子组件会将渲染的数据传递给父组件中的插槽里面,父组件此时可以接收一个数据对象,获取到子组件的数据。

  • 第一步:子组件在【<slot>】标签中,通过属性传递数据。
  • 第二步:父组件中,通过【v-slot:插槽名称="接收的数据名称"】可以获取到子组件传递的数据对象(注意:返回的是一个对象)。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>slot作用域插槽</title>
</head>
<body>

<div id="app">
    <h3>slot作用域插槽</h3>
    <!-- 使用组件 -->
    <demo-comp>
        <template v-slot:first="obj">
            <div>
                这是替换到第一个插槽,接收的数据:{{ obj.text }}
            </div>
        </template>
        <template v-slot:second="data">
            <div>
                这是替换到第二个插槽,接收的数据:{{ data.data }}
            </div>
        </template>
    </demo-comp>
</div>

<script src="https://cdn.staticfile.org/vue/2.6.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        template: `<div>
            <h4>这是slot作用域插槽01</h4>
            <!-- 定义插槽位置 -->
            <slot name="first" :text="'插槽01传递的text数据'"></slot>
            <h4>这是slot作用域插槽02</h4>
            <!-- 定义插槽位置 -->
            <slot name="second" :data="'插槽02传递的data数据'"></slot>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp }
    });
</script>
</body>
</html>

二、自定义组件v-model属性(Vue2.x版本)

有时候,子组件中可能会有一些表单,并且父组件需要同时绑定到子组件的这些表单,也就是说,子组件中的这些表单内容改变时候,父组件需要同时发生相应的改变,即:v-model数据双向绑定。Vue也支持父子组件中的v-model数据双向绑定功能。

2.1、单个v-model属性 

如果父组件只有一个表单输入框需要绑定,那么直接使用v-model属性即可,同时子组件里面需要通过触发事件的方式,告诉父组件表单数据发生了变化。如下图所示:

  • 第一步:父组件使用子组件的时候,采用【v-model】指令绑定数据。
  • 第二步:子组件中,使用【v-bind:value】指令绑定数据,并且通过【@input】事件告诉父组件,子组件数据发生了变化。
  • 第三步:子组件在【@input】事件中,通过【$emits】向父组件发生事件通知(触发的事件名称有:input、change)。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义v-model属性</title>
</head>
<body>

<div id="app">
    <h3>自定义v-model属性</h3>
    <!-- 使用组件 -->
    <demo-comp v-model="msgData"></demo-comp>
    <div>
        当前表单数据:{{ msgData }}
    </div>
</div>

<script src="https://cdn.staticfile.org/vue/2.6.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        props: ['msgData'],
        template: `<div>
            <h4>子组件的表单:</h4>
            <div>
                <input type="text" :value="msgData" @input="$emit('input', $event.target.value)">
            </div>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp },
        data() {
            return {
                msgData: ''
            }
        }
    });
</script>
</body>
</html>

2.2、多个v-model属性

如果组件有多个input输入框,要如何实现v-model指令的效果呢???和单个v-model是类似的,只不过在使用的时候需要加上变量的名称。要实现多个v-model属性的效果,需要借助于【.sync】修饰符,并且触发的事件名称是【update:属性名称】

  • 第一步:父组件使用【:属性名称.sync="变量名称"】的格式,定义多个v-model属性。
  • 第二步:子组件定义多个表单输入框,并且通过【:属性名称="变量名称"】绑定数据,通过【@input】和【$emit】触发事件,事件名称是【update:属性名称】。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义多个v-model属性</title>
</head>
<body>

<div id="app">
    <h3>自定义多个v-model属性</h3>
    <!-- 使用组件 -->
    <demo-comp :msgdata.sync="msgdata" :customname.sync="customname"></demo-comp>
    <div>
        当前表单msgdata数据:{{ msgdata }}
    </div>
    <div>
        当前表单customname数据:{{ customname }}
    </div>
</div>

<script src="https://cdn.staticfile.org/vue/2.6.2/vue.min.js"></script>
<script>
    // 创建全局组件
    const demoComp = {
        props: ['msgdata', 'customname'],
        template: `<div>
            <h4>子组件的表单:</h4>
            <div>
                <input type="text" :value="msgdata" @input="$emit('update:msgdata', $event.target.value)"> <br>
                <input type="text" :value="customname" @input="$emit('update:customname', $event.target.value)"> <br>
            </div>
        </div>`
    };

    // 创建Vue实例对象
    const vm = new Vue({
        el: '#app',
        components: { demoComp },
        data() {
            return {
                msgdata: '',
                customname: ''
            }
        }
    });
</script>
</body>
</html>

到此,Vue2.x版本中插槽和自定义v-model属性就介绍完啦。

综上,这篇文章结束了,主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。

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

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

相关文章

3DMAX纹理插件BerconMaps使用教程

BerconMaps是3dMax的第三方纹理插件。它添加了五个新的3dMax纹理贴图&#xff1a;噪波&#xff08;Noise&#xff09;、木纹&#xff08;Wood&#xff09;、瓷砖&#xff08;Tile&#xff09;、失真&#xff08;Distortion&#xff09;和渐变&#xff08;Gradient&#xff09;。…

linux配置samba服务

文章目录samba服务第一步&#xff1a;下载samba服务第二步&#xff1a;开启服务&#xff0c;查看服务状态第三步&#xff1a;在文件夹系统查看第四步&#xff1a;设置samba的配置文件第五步&#xff1a;再次去尝试连接linux服务共享修改smab服务的配置设置samba服务的用户名和密…

verilog实现计算器设计

该实验为用verilog编写的一个运算系统,其功能是实现4位整数的加、减、乘、除运算。运算时通过矩阵键盘输入运算类型和运算所需要的数据,然后通过内部电路处理,将计算的结果送于数码管或LCD1602显示。 工程截图如下: 本设计分为两个子模块,按键输入和数码管输出。 还有LC…

python字符串

python字符串 文章目录python字符串一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.字符串创建2.转义字符3.运算符4.格式化5.三引号6.内建函数总结一、实验目的 掌握字符串的用法 二、实验原理 字符串 字符串是一种序列&#xff0c;用于表示和存储文本。py…

Ubuntu16.04安装Chrome出错

安装了Ubuntu16.04之后想要装个Chrome&#xff0c;本来觉得是很简单的事情&#xff0c;下载->安装就结束了&#xff0c;结果没想到搞了好久&#xff0c;最后发现是因为自己偷懒所造成的&#xff01;因此&#xff0c;写下这篇博文做警示&#xff0c;如果其他人也碰到这样的问…

20230124使AIO-3568J开发板在Android12下横屏

20230124使AIO-3568J开发板在Android12下横屏 2023/1/24 14:05 百度搜索&#xff1a;RK3568 强制横屏 http://www.360doc.com/content/12/0121/07/29321110_1049371522.shtml RK3568 Android-HDMI旋转屏幕显示 硬件开发板&#xff1a;OK3568-C开发板&#xff08;基于国产瑞芯微…

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;LeetCode每日一题–进击大厂 ✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标 &#x1f575;️‍♂️近期目标&#…

恶意代码分析实战 5 分析恶意Windows程序

1 Lab07-01 本次实验分析lab07-01.exe,lab07-02.exe,先来看lab07-01.exe的问题 问题 计算机重启后&#xff0c;这个程序如何确保它继续运行&#xff08;达到持久化驻留&#xff09; 首先&#xff0c;查看导入函数。 OpenSCManagerA和CreateServiceA函数暗示着这个恶意代码…

蓝队-HTTP协议的分析

文章目录应用层的协议→HTTP协议访问地址web网站的正确访问姿势请求协议https访问的密钥文件网站的部署通过https协议访问请求报文响应报文请求方法http头协议cookiesRefererUser-AgentX-Forwarded-ForHTTP 状态码HTTP content-type抓包分析HTTP抓包代理插件的下载代理第一种方…

电商项目之同一笔单多次收款成功

1 问题背景 有个收单系统&#xff08;简称S系统&#xff09;&#xff0c;作用是收单&#xff0c;相当于支付渠道&#xff0c;能够作为第三方服务对接其他支付平台。电商系统&#xff08;简称A系统&#xff09;与S系统是隔离的。A系统发起支付请求给S系统&#xff0c;S系统包装一…

Java高效率复习-坦克大战[Java基础合集]

目录 前言 该文章会从零开始制作一个坦克大战的游戏&#xff0c;该游戏使用Java的AWT和Swing作为窗体和容器&#xff0c;使用面向对象、线程等技术来丰富游戏&#xff0c;本文章相等于Java前期和中期技术的一个合集&#xff08;对于IO、网络、反射并没有涉及到&#xff09;。 …

高级Spring之Bean 生命周期

老样子&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; 准备容器&#xff1a; SpringBootApplication public class A03 {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03.class, args);context.close(…

【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端学习——CSS

文章目录1.CSS1.1什么是CSS1.2快速入门1.3.三种CSS导入方式2.选择器2.1基本选择器2.1.1标签选择器2.1.2类选择器2.1.3id选择器2.2层次选择器2.2.1后代选择器2.2.2子选择器2.2.3相邻兄弟选择器2.2.4通用选择器2.3结构伪类选择器2.4属性选择器3.美化网页元素3.1span标签3.2字体样…

swagger测试Restful API

swagger出现背景 我们构建Restful API的目的通常都是由于多终端的原因&#xff0c;这些终端会共用很多底层业务逻辑&#xff0c;因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端&#xff0c;不同端由不同的团队或者小组负责&#xff0c;为了减少与其他团队平时开发…

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标

LabVIEW将台式电脑转换为 Phar Lap ETS 实时目标注意&#xff1a;NI将在NI2020软件版本中删除对cRIO的Pharlap和NI2022软件版本中对PXI的支持。更多信息&#xff0c;请参阅PharLapRTOSEOL路线图。您可能已经拥有一台台式PC&#xff0c;可以作为下一个可靠的确定性测试或控制系统…

初识 Express(基于 NodeJS http 模块封装的 Web 框架)

初识 Express&#xff08;基于 NodeJS http 模块封装的 Web 框架&#xff09;参考描述Express获取nodemon获取使用使用创建一个基本的服务器基本路由对客户端的 GET 请求进行响应获取通过 GET 方式提交的 URL 参数静态 URL 参数动态 URL 参数静态资源托管服务器public前缀参考 …

steam搬砖,蓝海信息差副业项目

今天就给大家分享下这个steam搬砖项目的玩法&#xff0c;看完你收藏执行&#xff0c;学不会你可以随便骂我&#xff01;&#xff01; 首先我们讲一下项目原理&#xff1a; 我们需要利用国外steam平台来赚取差价&#xff0c;简单点就是在游戏里面搬砖购买一些道具&#xff0c;然…

零基础学Python(全彩版)

ISBN: 978-7-5692-2225-8 编著&#xff1a;明日科技 页数&#xff1a;448页 阅读时间&#xff1a;2022-08-14 推荐指数&#xff1a;★★★★★ 一本非常适合入门的Python 3编程教程书籍&#xff0c; 不仅有视频教程还有很多的代码示例&#xff0c; 让你在一步步学习中掌握Pytho…

力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——645. 错误的集合、657. 机器人能否返回…