iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue插槽能解决的问题是什么
  • 310
分享到

vue插槽能解决的问题是什么

2023-07-05 00:07:36 310人浏览 薄情痞子
摘要

今天小编给大家分享一下Vue插槽能解决的问题是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue插槽解决的问题:引入的

今天小编给大家分享一下Vue插槽能解决的问题是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

vue插槽解决的问题:引入的子组件标签中间不允许写内容的。插槽(Slot)是vue为组件的封装者提供的能力;允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽;可以把插槽认为是组件封装期间,为用户预留的内容的占位符。

什么是插槽?

我们知道,在vue中,引入的子组件标签中间是不允许写内容的。为了解决这个问题,官方引入了插槽(slot)的概念。

插槽,其实就相当于占位符。它在组件中给你的html模板占了一个位置,让你来传入一些东西。插槽又分为匿名插槽具名插槽以及作用域插槽

你可能不太明白,为什么我要给子组件中传入HTML,而不直接写在子组件中呢?答案是这样的。你可以想象一个场景,你有五个页面,这五个页面中只有一个区域的内容不一样,你会怎么去写这五个页面呢?复制粘贴是一种办法,但在vue中,插槽(slot)是更好的做法。

vue插槽能解决的问题是什么

匿名插槽

匿名插槽,我们又可以叫它单个插槽或者默认插槽。与具名插槽相对,它不需要设置name属性。(它隐藏的name属性为default。)

例子:

文件目录如下,Home组件是HelloWorld的父组件。

vue插槽能解决的问题是什么

  • 在HelloWorld中写一个匿名插槽

<template>  <div class="hello">     Helloworld组件     <div class = 'slotTxt'>       <slot></slot>     </div>  </div></template><script>export default {}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.hello{  width:100%;  height:300px;  background:#ccc;  margin-top:50px;  .slotTxt{    width:500px;    height:200px;    margin:30px auto;    background:red;  }}</style>

  • 在Home组件中引入子组件,并在子组件标签中写入内容

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <!-- 没有插槽,这里的内容不显示 -->      <h2>我是helloworld中的插槽啊</h2>      </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script>

效果

vue插槽能解决的问题是什么

不难看出,HelloWorld标签中的内容(红色部分)已经显示出来了。

具名插槽

上面已经说过,插槽有一个name属性。与匿名插槽相对,加了name属性的匿名插槽就是具名插槽。

  • HelloWorld组件中写入name属性分别为left和right的插槽

<template>  <div class="hello">     Helloworld组件     <div class = 'slotLeft'>       <slot name='left'></slot>     </div>     <div class = 'slotRight'>       <slot name='right'></slot>     </div>  </div></template><script>export default {}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.hello{  width:700px;  height:300px;  background:#ccc;  margin: 0 auto;  margin-top:50px;  .slotLeft{    width:300px;    height:200px;    float:left;    background:red;  }  .slotRight{    width:300px;    height:200px;    float:right;    background:pink;  }}</style>

  • Home组件通过在template上写v-slot:name来使用具名插槽

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template v-slot:left>         <h2>name属性为left</h2>       </template>      <template v-slot:right>         <h2>name属性为right</h2>       </template>         </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

注意 v-slot 只能添加在template标签上 (只有一种例外情况)。

  • 效果

vue插槽能解决的问题是什么

  • 例外情况(被废弃的slot=‘name’)
    带slot属性的具名插槽自 2.6.0 起被废弃,vue3.x被完全废弃。只有vue3之前的cli可以使用。

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <h2 slot='left'>name属性为left</h2>        <h2 slot='right'>name属性为right</h2>      </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

效果同上。

  • 具名插槽的小知识点
    跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header。

作用域插槽

作用域插槽其实就是可以传递数据的插槽。子组件中的一些数据想在父组件中使用,必须通过规定的方法来传递。在官方文档中提出了一条规则,**父级模板里的所有内容都是在父级作用域中编译的。子模板里的所有内容都是在子作用域中编译的。**如果你在父组件直接使用子组件中的值,是会报错的。

匿名插槽的作用域插槽

为了让 子组件中的数据 在父级的插槽内容中可用,我们可以将 数据 作为 元素的一个特性绑定上去:

语法:v-bind:users="user"

  • 子组件HelloWorld代码

<template>  <div class="hello">     Helloworld组件       <div class='slotLeft'>       <slot v-bind:users="user"></slot>     </div>        </div></template><script>export default {  data(){    return{      user:{        name:'oralinge',        age:18      }    }    }}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.hello{  width:700px;  height:300px;  background:#ccc;  margin: 0 auto;  margin-top:50px;  .slotLeft{    width:300px;    height:200px;    // float:left;    background:red;    margin:20px auto  }  .slotRight{    width:300px;    height:200px;    float:right;    background:pink;  }}</style>

绑定在 元素上的特性(v-bind:users=“user”)被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字。

语法:v-slot:default="随意取的名字"  // default可省略,简写为v-slot="随意取的名字"

  • 父组件Home代码

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template  v-slot:default="slotProps">         <h2>{{slotProps.users.name}}</h2>       </template>    </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

注意:
     父组件中的slotProps可以是随意取的。
     子组件中users是随意取的,与之对应的是父组件中的users。
     子组件中的user为数据。

效果

vue插槽能解决的问题是什么

具名插槽的作用域插槽

与匿名插槽同理,只需要把default替换成插槽的name值即可。

  • 子组件HelloWorld代码

<template>  <div class="hello">     Helloworld组件       <div class='slotLeft'>       <slot name='helloWorld' v-bind:users="user"></slot>     </div>        </div></template><script>export default {  data(){    return{      user:{        name:'hello world',        age:18      }    }    }}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.hello{  width:700px;  height:300px;  background:#ccc;  margin: 0 auto;  margin-top:50px;  .slotLeft{    width:300px;    height:200px;    // float:left;    background:red;    margin:20px auto  }  .slotRight{    width:300px;    height:200px;    float:right;    background:pink;  }}</style>

  • 父组件Home代码

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template  v-slot:helloWorld="slotProps">         <h2>{{slotProps.users.name}}</h2>       </template>    </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

效果

vue插槽能解决的问题是什么

注意:
     默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确。

vue插槽能解决的问题是什么

另,slot-scope写法在2.6之后已废弃,作用与上面相同,在此不做解释。

上面的写法是不是觉得有些麻烦?别着急,我们来看一看解构插槽 Prop

解构插槽 Prop

作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里:

function (slotProps) {  // 插槽内容}

这意味着 v-slot 的值实际上可以是任何能够作为函数定义中的参数的 javascript 表达式。所以在支持的环境下 (单文件组件或现代浏览器),你也可以使用 ES2015 解构来传入具体的插槽 prop。

语法:v-slot="{ users }"

  • HelloWold组件

<template>  <div class="hello">     Helloworld组件       <div class='slotLeft'>       <slot v-bind:users="user"></slot>     </div>        </div></template><script>export default {  data(){    return{      user:{        name:'hello world',        age:18      }    }    }}</script><!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="less">.hello{  width:700px;  height:300px;  background:#ccc;  margin: 0 auto;  margin-top:50px;  .slotLeft{    width:300px;    height:200px;    // float:left;    background:red;    margin:20px auto  }  .slotRight{    width:300px;    height:200px;    float:right;    background:pink;  }}</style>

  • Home组件

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template  v-slot="{ users }">         <h2>{{users.name}}</h2>       </template>    </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

  • 效果

vue插槽能解决的问题是什么

  • 重命名----更改users这个名字

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template  v-slot="{ users:person }">         <h2>{{person.name}}</h2>       </template>    </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

效果如上图。

  • 定义后备内容,用于插槽 prop 是 undefined 的情形
    此处按照官方文档的写法会出现语法报错,后期应该会修复(有知道的麻烦通知一声)。

<template>  <div class="home">    我是Home父组件    <HelloWorld>      <template >         <h2 v-slot="{ users = { name: '1111' } }">{{users.name}}</h2>       </template>    </HelloWorld>  </div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {  name: 'home',  components: {    HelloWorld  }}</script><style lang="less" scoped>.home{  width:900px;  margin:0 auto;  background:yellow;  padding-bottom:100px;}</style>

使用场景

复用公共组件
代码示例如下:

<template>  <div>    <div class="title-box">      <span class="title">{{title}}</span>      <div class="right">        <slot name="right"></slot>      </div>    </div>    <div class="content-box">      <slot></slot>    </div>  </div></template><script>export default {  data () {    return {    }  },  props: {    title: {      type: String,      required: true    }  }}</script><style lang="scss" scoped>.title-box {  padding: 16px 0;  border-bottom: 1px solid #eff1f5;  .title {    font-family: MicrosoftYaHei;    font-size: 24px;    color: #283039;    letter-spacing: 0;    line-height: 24px;    &::before {      width: 4px;      margin-right: 20px;      content: "";      background-color: #5da1ff;      display: inline-block;      height: 20px;      vertical-align: middle;    }  }  .right {    float: right;    margin-right: 20px;  }}</style>

使用的ui框架为ivew。

以上就是“vue插槽能解决的问题是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: vue插槽能解决的问题是什么

本文链接: https://www.lsjlt.com/news/348494.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue插槽能解决的问题是什么
    今天小编给大家分享一下vue插槽能解决的问题是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue插槽解决的问题:引入的...
    99+
    2023-07-05
  • vue插槽解决什么问题
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。什么是插槽?我们知道,在vue中,引入的子组件标签中间是不允许写内容的。为了解决这个问题,官方引入了插槽(slot)的概念。插槽,其实就相当于占位符。它在组件中给你的HT...
    99+
    2023-05-14
    Vue 插槽
  • VUE 插槽难题大揭秘:问题解决指南
    什么是 VUE 插槽? VUE 插槽是一种组件化开发技术,允许您在组件中定义插槽,以便在使用该组件时可以向其中插入其他组件或 HTML 元素。这使得您可以创建更灵活和可重用的组件,从而提高开发效率和代码可维护性。 VUE 插槽难题 在使...
    99+
    2024-02-22
    VUE 插槽 插槽问题 插槽解决方案
  • Vue中的匿名插槽与具名插槽是什么
    这篇文章将为大家详细讲解有关Vue中的匿名插槽与具名插槽是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。slot又名插槽,是Vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出...
    99+
    2023-06-21
  • vue中的插槽是什么意思
    这篇文章主要为大家展示了“vue中的插槽是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中的插槽是什么意思”这篇文章吧。一、认识插槽Slot前面我们会通过props传递给组件一些数...
    99+
    2023-06-29
  • Vue插槽的实现原理是什么
    这篇文章主要介绍“Vue插槽的实现原理是什么”,在日常操作中,相信很多人在Vue插槽的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue插槽的实现原理是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Vue中的插槽是什么及怎么用
    这篇文章主要介绍了Vue中的插槽是什么及怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的插槽是什么及怎么用文章都会有所收获,下面我们一起来看看吧。在 Vue 中,插槽是个很强大的功能,它可以使封装...
    99+
    2023-06-30
  • Vue插槽是什么及怎么使用
    今天小编给大家分享一下Vue插槽是什么及怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是插槽插槽就是子组件中的提...
    99+
    2023-07-05
  • Vue插槽slot使用的方法是什么
    这篇文章主要介绍“Vue插槽slot使用的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue插槽slot使用的方法是什么”文章能帮助大家解决问题。何为插槽我们都知道在父子组件间可以通过v...
    99+
    2023-07-05
  • Vue中插槽发出数据的方法是什么
    今天小编给大家分享一下Vue中插槽发出数据的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在工作中BUG的出现是在...
    99+
    2023-06-27
  • Vue插槽Slot的作用是什么及怎么使用
    本篇内容介绍了“Vue插槽Slot的作用是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!插槽Slot插槽Slot的作用初识插槽...
    99+
    2023-07-04
  • 使用vue的作用域插槽的原因是什么?
    这篇文章主要介绍了使用vue的作用域插槽的原因是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Vue插槽是一种将内容从父组件注入子组件的绝佳方法。下面是一个基本的示例,如果我们不提供父级的任何slot位的内容,刚父级...
    99+
    2023-06-14
  • vant框架van-cell插槽无法换行问题及解决
    目录vant框架van-cell插槽无法换行解决方法小程序 van-cell 换行能左对齐问题总结vant框架van-cell插槽无法换行 解决方法 在插槽中定义div的属性disp...
    99+
    2023-01-18
    vant van-cell插槽 van-cell插槽无法换行 vant van-cell
  • 解决父子组件通信的三种Vue插槽
    目录前言环境准备Category组件App组件一、默认插槽二、具名插槽三、作用域插槽总结 前言 插槽可以说是 Vue 中非常重要的一部分吧,在我学习和练习的过程中,当组件搭配着插槽一...
    99+
    2024-04-02
  • CSS能解决什么问题
    这篇文章主要讲解了“CSS能解决什么问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS能解决什么问题”吧!一、CSS定义与解释  ...
    99+
    2024-04-02
  • 解决父子组件通信的Vue插槽有哪些
    小编给大家分享一下解决父子组件通信的Vue插槽有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!环境准备先搭个初始环境给大家看看哈。一步一步讲完这个插槽。就是写...
    99+
    2023-06-21
  • 关于VUE的编译作用域及slot作用域插槽问题
    什么是插槽?插槽的指令为v-slot,它目前取代了slot和slot-scope,插槽内容,vue实例一套内容分发的api,将slot元素作为承载分发内容的出口。 插槽分为单个插槽,...
    99+
    2024-04-02
  • 解决vue中使用swiper 插件出错的问题
    由于我自己在写一个demo时候用到了该插件,出现了一些问题,所以就简单查了一下该插件的用法以及一些常见的错误 1.出现Get .../maps/swiper.min.js.map 5...
    99+
    2024-04-02
  • Vue3插槽Slot的实现原理是什么
    这篇文章主要介绍了Vue3插槽Slot的实现原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3插槽Slot的实现原理是什么文章都会有所收获,下面我们一起来看看吧。Vue官方对插槽的定义Vue 实现...
    99+
    2023-07-02
  • vue默认插槽的理解及实例代码是怎样的
    vue默认插槽的理解及实例代码是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是插槽插槽就是子组件中的提供给父组件使用的一个占位符,用<slot...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作