vue插槽之slots

news/2024/7/10 1:51:23 标签: vue, slot

插槽slot:本质就是向组件传递一个DOM。

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .panel{
            border: 1px solid #ececec;
        }
        .panel>*{
            padding:10px;
        }
        .title{
            border-bottom: 1px solid #ececec;
        }
        .content{
            border-bottom: 1px solid #ececec;
        }
        .footer{

        }
    </style>
</head>
<body>
<div id="app">
    <panel>
        <div slot="title">YO</div>
        <div slot="content">
            YO
            yo
        </div>
        <div slot="footer">更多信息</div>
    </panel>
</div>

<template id="panel-tpl">
    <div class="panel">
        <div class="title">
            <slot name="title"></slot>
        </div>
        <div class="content">
            <slot name="content"></slot>
        </div>
        <div class="footer">
            <slot name="footer"></slot>
        </div>
    </div>
</template>
<script src="../lib/vue.js"></script>
<script src="./js/main.js"></script>
</body>
</html>

main.js:

Vue.component('panel', {
    template: '#panel-tpl'
})
new Vue({
    el: '#app'
})

作用域插槽:

父组件通过props向子组件传值,作用域插槽差不多是父子组件传值的反用,是父组件接收来自子组件的slot标签上通过v-bind绑定进而传递过来的数据。

应用场景:父组件对子组件的内容进行加工处理。

写作用域插槽之前,先介绍一下Vue中的slot内容分发:

<div id="app">
    <child-component>
        <template slot-scope="props">
            <p>分发的内容</p>
            <p>更多分发的内容</p>
        </template>
    </child-component>
</div>
<script>
Vue.component("child-component", {
    template: `<div class="container">
                    <slot><p>父组件如果没有插入内容,我将被显示</p></slot>
               </div>`
})

let vm = new Vue({
    el: '#app'
})
</script>

如果<child-component></child-component>标签之间没有插入那两个p标签的话,页面会显示子组件模板中定义的“<p>父组件如果没有插入内容,我将被显示</p>”这一则内容,但如果<child-component></child-component>标签之间有插入内容的话,则子组件模板中的<slot></slot>标签以及之间的内容都会被替换成<child-component></child-component>标签之间插入的内容。

这里子组件<slot>内的备用内容,作用域是子组件本身。

作用域插槽:

<div id="app">
    <child-component>
        <template slot-scope="props">
            <p>父组件的数据</p>
            <p>{{props.msg}}</p>
        </template>
    </child-component>
</div>
<script>
Vue.component("child-component", {
    template: `<div class="container">
                    <slot msg="子组件的数据"></slot>
               </div>`
})

let vm = new Vue({
    el: '#app'
})
</script>

显示结果:

template内可以通过临时变量props来访问来自子组件插槽的数据msg 。

作用域插槽更具代表性的用例是列表组件:

<div id="app">
    <child-component :books="books">
        <template slot="book" slot-scope="props">
            <li>{{props.boonName}}</li>
        </template>
    </child-component>
</div>
<script>
Vue.component("child-component", {
    props: {
        books: {
            type: Array,
            default: function(){
                return []
            }
        }
    },
    template: `<ul class="container">
                    <slot name="book" v-for="book in books" :boonName="book.name"></slot>
               </ul>`
})

let vm = new Vue({
    el: '#app',
    data: {
        books: [
            {name: '《vue.js实战》'},
            {name: '《JavaScript》高级程序设计'},
            {name: '深入浅出Webpack'}
        ]
    }
})
</script>

子组件<child-component></child-component>接受一个父组件传过来的books数组。并且将它在name为book的slot上使用v-for循环,同时暴露变量bookName,父组件的child-component标签内就可以通过props.bookName访问到绑定的数据;

作用域插槽的使用场景:既可以复用子组件的slot,又可以使slot内容不一致;


http://www.niftyadmin.cn/n/887248.html

相关文章

DOM知识结构

一、编程接口&#xff1a; 可通过 JavaScript &#xff08;以及其他编程语言&#xff09;对 HTML DOM 进行访问。 所有 HTML 元素被定义为对象&#xff0c;而编程接口则是对象方法和对象属性。 方法是您能够执行的动作&#xff08;比如添加或修改元素&#xff09;。 属性是您…

机器人二弟_“可佳二代”机器人好性感

将本文分享到微博:小观众认真观看机器人表演“晨报读者这边走……”5月14日上午&#xff0c;在科大科技周各科普点&#xff0c;300余人的晨报“科技周”探秘团&#xff0c;在各分队志愿者导游带领下&#xff0c;玩转科技周&#xff0c;过足科技瘾。看3D、观天象、看机器人&…

专题4:全方位解读javascript中this

首先必须要说的是&#xff0c;this的指向在函数定义的时候是确定不了的&#xff0c;只有函数执行的时候才能确定this到底指向谁&#xff0c;实际上this的最终指向的是那个调用它的对象&#xff0c;即&#xff1a;如果是以函数形式调用则是指向window&#xff0c;如果是以方法形…

lua excel to mysql_在Lua程序中使用MySQL的教程 -电脑资料

这篇文章主要介绍了在Lua程序中使用MySQL的教程,是Lua入门学习中的基础知识,需要的朋友可以参考下导入MySQL我们可以用一个简单语句导入SQLite库&#xff0c;假设Lua中正确实现并已完成&#xff0c;代码如下:mysql require "luasql.mysql"可变的MySQL将提供通过参照…

专题1:javascript执行上下文

我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题。比如先来一个简单一点的。 console.log(a); // 这里会打印出什么&#xff1f;var a 20; 暂时先不管这个例子&#xff0c;我们先引入一个JavaScript中最基础&#xff0c;但同时也是最重要的一个概念执行上下…

专题2:javascript变量对象详解

这篇文章要给大家介绍的是变量对象。 在JavaScript中&#xff0c;我们肯定不可避免的需要声明变量和函数&#xff0c;可是JS解析器是如何找到这些变量的呢&#xff1f;我们还得对执行上下文有一个进一步的了解。 在上一篇文章中&#xff0c;我们已经知道&#xff0c;当调用一…

python3正则表达式匹配但不包括最后一个字符_python正则表达式匹配不包含某几个字符的字符串方法...

python正则表达式匹配不包含某几个字符的字符串方法发布时间&#xff1a;2020-10-15 15:10:56来源&#xff1a;脚本之家阅读&#xff1a;97作者&#xff1a;沙河边の搬砖工一、匹配目标文件中所有以https?://开头&#xff0c;以.jpg|.png|.jpeg结尾的字符串二、尝试过程1)自然…

python图像物体的自动标注_[图像数据标注工具labelme使用教程]

环境&#xff1a;Ubuntu16.04 Python Qt1、安装Ubuntu 14.04 / Ubuntu 16.04Python2:sudo apt-get install python-qt4 # PyQt4sudo apt-get install python-pyqt5 # PyQt5sudo pip install labelme2、打开终端键入&#xff1a;labelme打开的主界面&#xff1a;在这里插入图片…