Vue中插槽的简单使用

这篇具有很好参考价值的文章主要介绍了Vue中插槽的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插槽

  • 分类:默认插槽、具名插槽、作用域插槽

  • 默认插槽:让父组件可以向子组件指定位置插入html结构,也是一种组件通信的方式,适用于父组件(App)===>子组件(MyFooter)

  • 默认插槽的App组件

  • <template>
      <div class="container">
        <!-- 普通写法 -->
        <!-- title、listDate的位置为标签属性。 -->
        <MyFooter title="游戏" :listDate="games"/>
    ​
        <!-- 下面都是默认插槽的书写形式-->
        <!-- Vue会将img标签的内容解析后在传给MyFooter组件中的slot插槽中。故将普通写法:listDate="foods"删除掉 -->
        <!-- 标签体的位置为:<MyFooter>标签体</MyFooter>   -->
        <MyFooter title="美食" >
          <img src="图片地址" alt="">
        </MyFooter>
    ​
        <MyFooter title="游戏" >
           <ul>
                <li v-for="(item,index) in games" :key="index" >{{ item }}</li>
            </ul>
        </MyFooter>
    ​
        <MyFooter title="电影" >
          <!-- controls让视频可以通过点击控制播放 -->
             <video controls src="视频地址"></video>
        </MyFooter>
          
        <router-view />
      </div>
    </template>
    <script>
    import MyFooter from './components/MyFooter.vue';
    export default {
      name: 'App',
      components: { MyFooter },
      data() {
        return {
          foods: ['火锅', '薯条', '汉堡'],
          games: ['只狼', '大表哥', '黑神话悟空'],
          files: ['《深海》', '《战狼》', '《流浪地球》']
        }
      }
    }
    </script>
    <style lang="less" scoped>
    .container {
      display: flex;
      justify-content: space-around
    }
    img {
      width: 100%;
    }
    video {
      width: 100%;
    }
    </style>
    ​
  • 默认插槽的MyFooter组件

  • <template>
        <div class="category">
            <h3>{{ title }}分类</h3>
            <!-- 普通写法 -->
            <!-- 普通写法通过props将listDate传过来进行展示 -->
            <ul>
                 <li  v-for="(item,index) in listDate" :key="index" >{{ item }}</li>   
            </ul>
            <!-- 插槽写法 -->
            <!-- <slot></slot>为默认插槽,挖个坑等使用的组件填充坑的内容 -->
            <slot>如果图片或视频未展示,展示此处的文字</slot>
           
        </div>
    </template>
    ​
    <script>
    export default {
        name: 'MyFooter',
        //这里保留应该只保留title,listDate仅是普通写法需求
        props: ['title','listDate'],
    }
    </script>
    <style scoped lang="css">
        .category {
            background-color: skyblue;
            width: 200px;
            height: 300px;
        }
        h3 {
            text-align: center;
        }
    </style>
    ​
  • 具名插槽的App

  • 具名插槽的给MyFooter的slot标上名字name="xxx",在App组件中使用那个插槽则slot="xxx"。进行相互匹配

  • <template>
      <div class="container">
    ​
        <!-- 有名插槽 -->
        <!-- title的位置为标签属性。-->
        <MyFooter title="美食" >
          <!-- 给img、a匹配相应的插槽名字,对应相应组件中的插槽 -->
          <img slot="center" src="图片地址" alt="">
          <a slot="footer" href="网址地址">美食地址</a>
          <a slot="footer" href="网址地址">电影地址</a>
        </MyFooter>
    ​
        <MyFooter title="游戏" >
           <ul slot="center">
                <li  v-for="(item,index) in games" :key="index" >{{ item }}</li>
           </ul>
           <div slot="footer">
              <a slot="footer" href="网址地址">热门推荐</a>
              <a slot="footer" href="网址地址">网络共享</a>
           </div>
           
        </MyFooter>
    ​
        <MyFooter title="电影" >
          <!-- controls让视频可以通过点击控制播放 -->
             <video slot="center" controls src="视频地址"></video>\
             <!-- template让下列的代码少了一层div 同时可以将slot="footer"去掉,改成在template标签属性的位置使用 v-slot:footer -->
             <template>
                <div slot="footer">
                    <a slot="footer" href="网址地址">动漫</a>
                    <a slot="footer" href="网址地址">生活</a>
                </div>
                <a slot="footer" href="网址地址">动画片</a>
             </template>
        </MyFooter>
        <router-view />
      </div>
    </template>
    <script>
    import MyFooter from './components/MyFooter.vue';
    export default {
      name: 'App',
      components: { MyFooter },
      data() {
        return {
          foods: ['火锅', '薯条', '汉堡'],
          games: ['只狼', '大表哥', '黑神话悟空'],
          files: ['《深海》', '《战狼》', '《流浪地球》']
        }
      }
    }
    </script>
    <style lang="less" scoped>
    .container {
      display: flex;
      justify-content: space-around
    }
    img {
      width: 100%;
    }
    video {
      width: 100%;
    }
    </style>
     
  • 具名插槽的MyFooter

  • <template>
        <div class="category">
            <h3>{{ title }}分类</h3>
        
            <!-- <slot name=""></slot>为具名插槽,挖个坑等使用的组件填充坑的内容 -->
            <slot name="center">如果图片或视频未展示,展示此处的文字</slot>
            <slot name="footer">如果图片或视频未展示,展示此处的文字</slot>
           
        </div>
    </template>
    ​
    <script>
    export default {
        name: 'MyFooter',
        props: ['title'],
    }
    </script>
    ​
    <style scoped lang="css">
        .category {
            background-color: skyblue;
            width: 200px;
            height: 300px;
        }
        h3 {
            text-align: center;
        }
    </style>
     
  • 作用域插槽理解:

    1、和上面两种插槽不同,作用域插槽数据(games) 在组件(MyFooter)但数据的结构需要组件的使用者(App)来决定

    2、在MyFooter通过slot传给App,App组件通过scope进行接收。

  • App组件(vm)的管家。App不仅是组件,也管理所有的组件

  • <template>
      <div class="container">
    ​
        <MyFooter title="游戏" >
          <!-- 要想接收MyFooter传过来的games需要写成template形式通过scope来接收传过来的值,注意这里不是scoped而是scope。 -->
          <template scope="boy">
              <ul >
                <!-- 通过{{ games }}可以知道,只有boy.games才可以拿到数组,games是MyFooter传过来的数组是不可以修改的。 -->
                  <li  v-for="(item, index) in boy.games" :key="index" >{{ item }}</li>
             </ul>
          </template>
        </MyFooter>
    ​
        <MyFooter title="游戏" >
          <!-- 可以将scope="xxx"改成slot-scope="xxx"。slot-scope="xxx"是新的书写方式 -->
          <template scope="boy">
              <ol >
                  <li  v-for="(item, index) in boy.games" :key="index" >{{ item }}</li>
             </ol>
          </template>
        </MyFooter>
    ​
        <MyFooter title="游戏" >
          <!-- 用ES6的形式写成{games},遍历的时候可以直接写games -->
          <template scope="{games}">
                  <h4  v-for="(item, index) in games" :key="index" >{{ item }}</h4>
          </template>
          
        </MyFooter>
    ​
        <router-view />
      </div>
    </template>
    <script>
    import MyFooter from './components/MyFooter.vue';
    export default {
      name: 'App',
      components: { MyFooter }
    }
    </script>
    <style lang="less" scoped>
    .container {
      display: flex;
      justify-content: space-around
    }
    img {
      width: 100%;
    }
    video {
      width: 100%;
    }
    </style>
    ​
  • 作用域插槽的MyFooter组件文章来源地址https://www.toymoban.com/news/detail-806593.html

  • <template>
        <div class="category">
            <h3>{{ title }}分类</h3>
            <!-- :games="games"的意思是谁往插槽放数据games就传给谁 -->
           <slot :games="games"></slot>
        </div>
    </template>
    ​
    <script>
    export default {
        name: 'MyFooter',
        props: ['title','listDate'],
        data(){
            return {
                games: ['只狼', '大表哥', '黑神话悟空'],
            }
        },   
    }
    </script>
    ​
    <style scoped lang="css">
        .category {
            background-color: skyblue;
            width: 200px;
            height: 300px;
        }
        h3 {
            text-align: center;
        }
    </style>

到了这里,关于Vue中插槽的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 前端Vue入门-day05-自定义指令、插槽、路由入门

    前端Vue入门-day05-自定义指令、插槽、路由入门

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 自定义指令  基本语法 (全局局部注册) 全局注册  局部注册 指令的值  v-loading 指令封装 插槽 默认插槽 后备内容(默认值)  具名插槽  作用域插槽  路由入门 单页应

    2024年02月13日
    浏览(27)
  • vue3插槽的使用

    vue3插槽的使用

    插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。 子组件SlotComponent.vue 父组件 输出结果: 输出结果: 子组件SlotComponent.vue 上段代码中我们添加了 3 个 slot 插槽,

    2023年04月20日
    浏览(10)
  • Vue slot 插槽使用详解

    Vue slot 插槽使用详解

    在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使我们能够更轻松地构建出优雅而高效的Web应用程序。

    2024年01月16日
    浏览(13)
  • Vue3中简单使用Mock.js

    Vue3中简单使用Mock.js

    mock.js简介   官方链接:Mock.js (mockjs.com)         前端开发人员用来模拟虚拟数据,拦截ajax请求,方便模拟后端接口 安装 使用         本文主要介绍在Vue项目中使用mock.js,包括axios发送请求与请求简单封装 创建mock文件夹,新建index.js文件         模拟数据可自己手动

    2024年02月02日
    浏览(11)
  • 如何使用Vue的插槽(slot)语法?

    Vue.js 是一个流行的 JavaScript 框架,用于构建动态和交互式的用户界面。它的模板语法提供了许多功能,其中之一就是插槽(slot)语法。 插槽(slot)是 Vue.js 模板中一种非常有用的机制,它允许你在一个组件中插入内容,然后在另一个组件中使用这些内容。这个机制非常灵活

    2024年02月08日
    浏览(9)
  • 在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js

    如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的网站和 Web 应用程序。 何时应该使

    2024年02月02日
    浏览(10)
  • Vue.js 3.x Composition APIs 及简单使用

    Vue.js 3.x Composition APIs 及简单使用

    源码组织方式的变化 Composition API 性能提升 Vite 源码全部采用 TS 重写,组织方式也发生变化,使用 Monorepo 的方式来组织项目的结构,把独立的功能模块都提取到不同的包中。 虽然重写,但是 90% 都兼容 2.x 的API,根据社区反馈,增加了 Composition API,组合式API,旨在解决开发超

    2024年02月08日
    浏览(10)
  • 【Vue】使用print.js插件实现打印预览功能,超简单

    【Vue】使用print.js插件实现打印预览功能,超简单

    目录 一、实现效果  二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div,给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码   print.js插件,可以打印html、pdf、json数

    2024年02月14日
    浏览(10)
  • 如何使用前端框架(React、Angular、Vue.js等)?该如何选择?

    如何使用前端框架(React、Angular、Vue.js等)?该如何选择?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月07日
    浏览(12)
  • 使用JavaScript和Vue.js框架开发的电子商务网站,实现商品展示和购物车功能

    引言: 随着互联网的快速发展和智能手机的普及,电子商务行业正迎来一个全新的时代。越来越多的消费者选择网上购物,而不再局限于传统的实体店。这种趋势不仅仅是改变了消费者的习惯购物,也给企业带来了巨大的商机。为了不断满足消费者的需求,电子商务网站需要

    2024年02月15日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包