美食 健康 常识 生活 日常 合同 家居 养生 国学 心理学 中医 植物 营销 动物 汽车 管理 旅游 投资 人工智能 数字化 消费 元宇宙 金融 饮食 史学 经济
  • 会员

  • 什么是插槽(slot)?聊聊Vue3中插槽的使用方法

    什么是插槽

    简单来说就是子组件中的提供给父组件使用的一个坑位,用<slot></slot> 表示,父组件可以在这个坑位中填充任何模板代码然后子组件中<slot></slot>就会被替换成这些内容。比如一个最简单插槽例子

    //父组件
    
    <template>
    
      <div>
    
        <Child>Hello Juejin</Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>
    
     
    
    //子组件Child
    
    <template>
    
        <div>
    
            <p>1</p>
    
            <slot />
    
            <p>2</p>
    
        </div>
    
    </template>

    子组件中的<slot /> 便是父组件放在子组件标签<Child>之间的内容。当然这之间你可以传入任何代码片段,都会被放到<slot />这个位置。

    同样的你也可以在标签<Child>之间放入变量,比如:

    //父组件
    
    <template>
    
      <div>
    
        <Child>{{ msg }}</Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import { ref } from 'vue'
    
    import Child from './Child.vue'
    
    const msg = ref('Hello Juejin')
    
    </script>

    同样的 插槽表示的就是这个msg变量。所以子组件 插槽是可以访问到父组件的数据作用域,而插槽内容是无法访问子组件的数据(即父组件中两个<Child>之间是不能使用子组件中的数据的),这就是所谓的渲染作用域。后面会介绍插槽插槽内容传参的方式。

    默认内容

    在父组件没有提供任何插槽内容的时候,我们是可以为子组件的插槽指定默认内容的,比如:

    //子组件
    
    <template>
    
        <div>
    
            <slot>我是默认内容</slot>
    
        </div>
    
    </template>
    
     
    
    //父组件1
    
    <template>
    
      <div>
    
        <Child></Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>
    
     
    
    //父组件2
    
    <template>
    
      <div>
    
        <Child>Hello Juejin</Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>

    具名插槽

    很多时候一个 插槽满足不了我们的需求,我们需要多个 插槽。于是就有了具名插槽,就是具有名字的 插槽。简单来说这个具名插槽的目的就是让一个萝卜一个坑,让它们呆在该呆的位置去。比如带 name 的插槽 <slot name="xx">被称为具名插槽。没有提供 name 的 <slot> 会隐式地命名为“default”。在父组件中可以使用v-slot:xxx(可简写为#xxx) 指令的 <template> 元素将目标插槽的名字传下去匹配对应 插槽。比如:

    //子组件
    
     
    
    <template>
    
        <div>
    
            <!-- 大萝卜 -->
    
            <div>
    
                <slot name="bigTurnip"></slot>
    
            </div>
    
            <!-- 小萝卜 -->
    
            <div>
    
                <slot name="smallTurnip"></slot>
    
            </div>
    
            <!-- 中萝卜 -->
    
            <div>
    
                <slot name="midTurnip"></slot>
    
            </div>
    
        </div>
    
    </template>
    
     
    
    //父组件
    
     
    
    <template>
    
      <div>
    
        <Child>
    
          <!-- #smallTurnip 为v-slot:smallTurnip缩写 -->
    
          <template #smallTurnip>
    
            小萝卜
    
          </template>
    
          <template #midTurnip>
    
            中萝卜
    
          </template>
    
          <template #bigTurnip>
    
            大萝卜
    
          </template>
    
        </Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>

    所以父组件中无需在意顺序,只需要写好模板命好名,它就会自动去到它所对应的位置。

    动态插槽名

    动态插槽名就是插槽名变成了变量的形式,我们可以随时修改这个变量从而展示不同的效果。它的写法是v-slot:[变量名]或者缩写为#[变量名]

    //父组件
    
    <template>
    
      <div>
    
        <Child>
    
          <!-- 等同于#smallTurnip -->
    
          <template #[slotName]>
    
            小萝卜
    
          </template>
    
          <template #midTurnip>
    
            中萝卜
    
          </template>
    
          <template #bigTurnip>
    
            大萝卜
    
          </template>
    
        </Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import { ref } from 'vue'
    
    import Child from './Child.vue'
    
    const slotName = ref('smallTurnip')
    
    </script>

    作用域插槽

    上面说过插槽内容是无法访问子组件的数据的,但是如果我们想在插槽内容访问子组件的状态该怎么办呢?

    其实插槽可以像对组件传递 props 那样,在slot标签绑定属性从而传递给父组件中的插槽内容。首先来看下默认插槽的传值方式

    //子组件
    
    <template>
    
        <div>
    
            <slot personName="xiaoyue" age="18"></slot>
    
        </div>
    
    </template>
    
     
    
    //父组件
    
     
    
    <template>
    
      <div>
    
        <Child v-slot="slotProps">
    
          My name is {{ slotProps.personName }} and I am {{ slotProps.age }} years old this year
    
        </Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>

    你还可以以结构的形式获取slot提供的数据。

    <template>
    
      <div>
    
        <Child v-slot="{ personName, age }">
    
          My name is {{ personName }} and I am {{ age }} years old this year
    
        </Child>
    
      </div>
    
    </template>

    注意不能绑定name属性,因为你绑定了name它就成了具名插槽了。同样具名插槽中的name属性也不会传递给插槽内容。因为传递的参数只能在插槽内容中使用,所以这类能够接受参数的插槽就被称为了作用域插槽

    具名作用域插槽

    下面再看下具名作用域插槽它的传参方式。它接收参数的方式是通过template标签的指令v-slot的值获取的,所以可以缩写成这样:

    //父组件
    
    <template>
    
      <div>
    
        <Child>
    
          <template #bigTurnip="bigTurnipProps">
    
            {{ bigTurnipProps.message }}
    
          </template>
    
        </Child>
    
      </div>
    
    </template>
    
    <script setup>
    
    import Child from './Child.vue'
    
    </script>
    
     
    
    //子组件Child.vue
    
     
    
    <template>
    
        <div>
    
            <!-- 大萝卜 -->
    
            <div>
    
                <slot name="bigTurnip" message="我是萝北"></slot>
    
            </div>
    
        </div>
    
    </template>

    这类插槽便是具名作用域插槽啦。

    什么是插槽(slot)?聊聊Vue3中插槽的使用方法
    微信扫码分享

    0

    0

    分享
  • 会员

  • 上一篇: 超市里的冷冻鸡腿都是从哪来的?为啥从不断货?

    下一篇: 一个看似浪漫的杀手——前方大“雾”

    还没有评论,赶紧来抢沙发吧!

    2月2日龙抬头的故事

    2月2日龙抬头的故事 传说,古时候,有一个皇帝因为耽误了祭天的时辰,这让天上的玉帝很生气,于是给龙王下令,三年内不得给人 …

    白色羊绒衫怎么洗可以恢复白

    白色羊绒衫可以用淘米水、双氧水或者是脱脂牛奶浸泡的方法清洗恢复白色。可以将淘米水中加入橘皮,煮热后浸泡衣物洗白,也可以用 …

    中秋节的食谱推荐

    中秋节,又称祭月节、月光诞、月夕、秋节、仲秋节、拜月节、月娘节、月亮节、团圆节等,是中国民间的传统节日。中秋节的食谱推荐 …

    干燕窝放保鲜还是冷冻

    一般建议放保鲜保存。如果放在冷冻中,干燕窝本身就含有一部分水分,硬度比较大,放在冰冻中水分会发生凝固,从而导致干燕窝的硬 …

    想念一个人,不用主动联系,做好两件事情,就够了

    在爱情的世界里,有时阳光明媚,有时阴云密布。 我们付出情感,期待着美好的结局,但并非所有的付出都能换来圆满的回报。 正如 …

    这7种性格的人最爱生病

    有句话说「性格决定命运」,其实性格能影响的不止是命运,还有自身的健康,也大有关系。性格不好,不但会让人觉得难相处,更重要 …

    皇帝柑绿色皮能吃吗

    最近这段时间正是吃皇帝柑的时候,但皇帝柑刚上市的时候,皮还是绿色的,不知道这种绿皮的皇帝柑能不能吃呢? 皇帝柑绿色皮能吃 …

    衣服退颜色怎么处理

    衣服退颜色,可以使用食盐、白醋进行处理,在第一次清洗退色衣服时,将其放入食盐水或者白醋溶液中浸泡半小时的时间,然后使用洗 …

    元宵节的民俗文化

    元宵节的民俗文化有:吃元宵、看花灯、猜灯谜、放烟花、吃饺子、游龙灯、舞狮子、踩高跷、划旱船、扭秧歌、打太平鼓、迎紫姑、走 …

    香肠要晒多少天可以吃 香肠要晒多少天可以吃亚硝酸盐

    买了些五花肉,打算自己做一些香肠来吃,但不知道这自己灌制的香肠大概要晒多少天才能吃呢? 香肠要晒多少天可以吃 晾晒时间要 …

    甲骨文起源于河南哪个地方

    甲骨文最早被发现于河南省安阳市西北方向小屯村一带,起源于商朝。它是当时全世界最完整的记录语言的工具,是一套独立自成系统的 …

    鱼虾小茄饼的做法(茄子鲜虾饼)

    1、虾仁用料酒腌制一会洗净,鱼肉剁鱼茸。 2、虾仁和姜片一起剁碎,然后和鱼茸充分混合,加入盐、白胡椒朝一个方向搅拌上劲备 …

    与不熟悉的人喝酒,请记住这五点,基本行云流水

    我们在日常交际中都会遇到这样的情况:在酒桌上和不熟悉的人喝酒时,他们总会找各种理由让你喝酒。或者是为了一些业务方面的事情 …

    柳蒿芽的作用是什么(柳蒿柳芽的功效与作用)

    柳蒿芽是一种野菜,可能见过的人比较少,因为它是我国北方特有的野菜,可以食用,那么柳蒿芽的作用是什么? 开胃消食 柳蒿芽是 …

    怎么泡柠檬水才好喝

    泡柠檬水需要将鲜柠檬切片,去籽可以减少其苦涩感,放在杯子中,加入少许凉白开和蜂蜜,中和酸味,充分搅拌均匀便可以饮用。也可 …

    液化气打不着火怎样处理

    液化气打不着火,需要清洁灶台、疏通管道、更换电池、高压线、减压阀,从而使液化气正常使用,如果液化气的点火针有火花、液化气 …

    一个人频繁的和你联系,一定是对你有好感的,现在突然断联,不代表他以前没喜欢过你,可能他现在还喜欢你,但是有了更喜欢的人

    在爱情的漩涡中,总会遇到一些令人困惑的情况。 其中之一就是当一个人频繁地与你联系,让你感到心生欢喜,以为他对你有着同样的 …

    不低敏是什么意思(过敏值低是什么意思)

    超敏TSH称为超敏促甲状腺激素,当降低时意思是提示下丘脑-垂体-甲状腺轴出现问题。 超敏促甲状腺激素的作用主要是促进甲状 …

    洋芋粉蛋皮怎么做 薯粉蛋皮的做法

    1、土豆洗净去皮。 2、土豆切小块、葱切葱花。 3、锅中放适量油。 4、放土豆入锅煎,直到煎熟,表面微微焦黄。 5、放米 …

    布福娜是什么东西(布福娜果产自哪里)

    福娜大家听说过吗?知道它是什么吗?布福娜是一种水果,也是一种中药材,营养价值很高,药用功效出色,对人类身体有多种好处。 …