vue插槽slot

简介: 前言当父组件在使用一个子组件的时候,可以使用单标签的形式,也可以使用双标签的形式,比如 或者。当时使用双标签的形式时,如果我们在两个标签中放入一些内容,比如hello world,子组件是可以通过插槽slot来获取标签中的内容,下面是官网的几个dem...

前言

当父组件在使用一个子组件的时候,可以使用单标签的形式,也可以使用双标签的形式,比如<Child /> 或者<Child></Child>。当时使用双标签的形式时,如果我们在两个标签中放入一些内容,比如<Child>hello world</Child>,子组件是可以通过插槽slot来获取标签中的内容,下面是官网的几个demo

demo1

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <div id="app">
            <!-- 使用子组件 -->
            <navigation-link>这是父组件上的一些内容</navigation-link>
        </div>
    </body>
</html>

<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    // 注册子组件navigation-link
    Vue.component('navigation-link', {
        data() {},
        // 如果 <navigation-link> 没有包含一个 <slot> 元素,则任何传入它的内容都会被抛弃。
        template: `
            <a v-bind:href="url" class="nav-link" >
              <slot></slot>
            </a>`
     })
    
    new Vue({
        el: '#app',
        data: {
            
        }
    })
</script>

demo2-具名插槽

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <base-layout>
                <!-- template 也可以是个普通元素,请看footer的slot -->
              <template slot="header">
                <h1>页面标题</h1>
              </template>
            
              <p>A paragraph for the main content.</p>
              <p>And another one.</p>
            
              <div slot="footer">
                <mark>页面底部信息</mark>
              </div>
            </base-layout>
        </div>
    </body>
</html>

<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    // slot具名以后就可以插到对应的位置,否则规则跟非具名插槽一样
    Vue.component('base-layout', {
        template: `
            <div class="container">
              <header>
                <slot name="header"></slot>
              </header>
              <main>
                <slot></slot>
              </main>
              <footer>
                <slot name="footer"></slot>
              </footer>
            </div>`
    })
    
    new Vue({
        el: '#app'
    })
</script>

demo3-默认值

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <Child>提交</Child>
            <!--当Child中间不传入内容时使用默认值-->
            <Child></Child>
        </div>
    </body>
</html>

<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    Vue.component('Child',{
        template: `
            <button type="submit">
              <slot>Submit</slot>
            </button>`
    });
    
    new Vue({
        el: '#app'
    })
    
</script>

demo4-作用域插槽

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <todo-list :todos="todos">
                <!-- 用slot-scope接收子组件回传的信息 -->
                <template slot-scope="slotProps">
                    <span v-if="slotProps.todo.isComplete"></span> {{ slotProps.todo.text }}
                </template>
            </todo-list>
        </div>
    </body>
</html>

<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    Vue.component('todo-list', {
        props: ['todos'],
        template: `
            <ul>
              <li
                v-for="todo in todos"
                v-bind:key="todo.id">
                <!-- 回传信息 -->
                <slot v-bind:todo="todo">
                  {{ todo.text }}
                </slot>
              </li>
            </ul>`
    })

    new Vue({
        el: '#app',
        data: {
            todos: [
            {
                text: '买机械键盘',
                isComplete: true
            }, {
                text: '打羽毛球',
                isComplete: true
            },
            {
                text: '去教会做礼拜',
                isComplete: false
            }]
        }
    })
</script>

目录
相关文章
|
6天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
6天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
6天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
11天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
11天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1053 0
|
12天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
12天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
12天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
12天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
下一篇
无影云桌面