slot的使用

Vue中slot的介绍与用法
本文主要介绍了Vue里的内容分发slot。首先解释了slot的概念,它写在子组件中,作用域在父组件。接着通过代码演示了slot的三种用法,包括单个slot、带name属性的具名slot以及作用域插槽slot,并对每种用法的效果和规则进行了说明。
1.首先,什么是slot?

slot在vue里叫内容分发(也叫插槽),它写在子组件中,它作用域在父组件上的(作用域在父组件上很重要).

2.slot的用法(代码演示)
1.单个slot
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <child-component>这是分发的内容</child-component>
      <child-component>这是更多分发的内容</child-component>
    </div>

    <script src="https://lib.baomitu.com/vue/2.6.10/vue.js"></script>
    <script>
      Vue.component('child-component', {
        template: `
     <div>
        <slot>
            <p>如果父组件没有内容,我将会出现;如果父组件有内容,我则消失</p>
        </slot>
    </div>
            `
      })

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

默认效果:
在这里插入图片描述

但如果父组件的内容删掉,则显示子组件的内容,效果如下:
在这里插入图片描述
上述总结:在子组件内使用特殊的slot元素就可以为这个子组件开启一个slot(也叫插槽),在父组件模板里,插入在子组件标签内的所有内容(即上述第一种情况里的p和分发内容+更多分发内容这些内容)将替代子组件的slot标签以及它的内容.下面是实战图示总结.
在这里插入图片描述

2.带name属性的slot(也叫具名slot)

写法规则:父组件里用slot属性关联子组件里的name属性;父组件里写内容,子组件里搭标签.
在这里插入图片描述
上述解释:子组件内声明了三个slot,其中只有main类里的slot(一个就好,多个会重复显示)没有使用name属性,它将作为默认slot出现,父组件没有使用slot属性的元素内容都将在这里显示.

3.作用域插槽slot(这是一个特殊的slot)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <my-list :books="books">
            <!-- 作用域插槽可以是具名的插槽下面就是用了具名的slot;下面的props相当于v-for里的item一样,下面的template可以改成div,但必须配合slot-scope(vue2.5开始已经更新) -->
            <template slot="book" slot-scope='props'>
                <li>{{props.bookName}}</li>
            </template>
        </my-list>
    </div>
    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
    <script>
        Vue.component('my-list',{
            template:
            `
            <ul>
                <slot 
                name='book'
                v-for='book in books'
                :book-name=book.name
                >
                </slot>
            </ul>
            `
            ,
            props:{
                books:{
                    type:Array,
                    default(){
                        return []
                    }
                }
            }
        })


    let app=new Vue({
        el:"#app",
        data() {
            return {
                books:[
                    {
                        name:'vue实战'
                    },
                    {
                        name:'js语言精髓'
                    },
                    {
                        name:'js高级程序设计'
                    }
                ]
            }
        },
    })
    </script>
</body>
</html>

上面的效果:
在这里插入图片描述
说明:子组件my-list接收来自父组件的数组books,并且将它在name为book的slot上使用v-for循环,同时暴露一个变量bookName.
问题:为什么不直接在父组件中使用v-for循环直接生成数据,而要这么麻烦呢?
未完待续

### 正确使用 Slot 的方法 Slot 是一种用于实现组件间通信的机制,在不同的框架和技术栈中有其特定的应用场景和方式。 #### Vue.js 中的 Slot 使用 Vue 提供了 `v-slot` 来替代旧版的 `slot` 和 `slot-scope` 语法。通过 `v-slot`,开发者可以在父组件中定义子组件的内容结构并传递数据[^1]。以下是具体用法: ```vue <template> <child-component> <!-- 默认插槽 --> <p>这是默认插槽内容</p> <!-- 命名插槽 --> <template v-slot:header> <h1>这里是头部内容</h1> </template> <!-- 作用域插槽 --> <template v-slot:item="props"> <div>{{ props.item.name }}</div> </template> </child-component> </template> ``` - **默认插槽**:无需指定名称,默认插入到子组件未命名的位置。 - **命名插槽**:通过 `v-slot:name` 定义多个具有不同功能的区域。 - **作用域插槽**:允许父组件访问子组件的数据并通过属性绑定的方式展示自定义逻辑。 --- #### C++ Nano-Signal-Slot使用 Nano-Signal-Slot 是一个轻量级的纯 C++ 实现 Signal 和 Slot 的库。它提供了类似于 Qt 的信号与槽机制的功能[^2]。下面是一个简单的例子来说明如何使用这个库: ```cpp #include "nano_signal_slot.hpp" using namespace nss; class MyClass { public: void mySlot(const std::string& message) { std::cout << "Received signal with message: " << message << std::endl; } }; int main() { Signal<std::string> sig; MyClass obj; // 连接信号到槽 auto connection = sig.connect(&obj, &MyClass::mySlot); // 发射信号 sig("Hello from the signal!"); return 0; } ``` 在这个示例中,创建了一个名为 `sig` 的信号对象,并将其连接到了 `MyClass` 类的一个成员函数作为槽。当调用 `sig()` 方法时,会触发已注册的所有槽函数执行。 --- #### Qt 中 QComboBox 的 Slot 使用 Qt 框架下的控件通常依赖于信号 (Signal) 和槽 (Slot) 的交互模式完成事件处理。对于 `QComboBox` 控件来说,可以通过监听用户的选项变化行为来进行动态响应[^5]。如下所示: ```cpp connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxChanged(int))); // 对应的槽函数声明 private slots: void onComboBoxChanged(int index); ``` 在实际开发过程中,还需要注意断开不再使用的连接以防内存泄漏等问题发生。 --- #### XLNet 中的 Slot 使用 虽然严格意义上讲这不是传统意义上的 “Slot”,但在自然语言处理领域,“Slot Filling” 被用来描述识别输入序列中标记实体的过程。例如,在 ATIS 数据集中训练模型以提取航班查询请求中的出发地、目的地等信息[^3]。运行命令如下: ```bash run/atis_with_pure_xlnet.sh --task_slot_filling slot_tagger --task_intent_detection CLS ``` 此脚本将同时进行槽位填充(Slot-Filling)以及意图分类两项任务的学习过程。 --- #### RenderDoc 工具中的注意事项 如果涉及到图形渲染调试工具 RenderDoc,则需要注意某些 OpenGL 扩展可能不受支持而导致错误的情况。建议按照官方文档指导选用稳定版本号如 v1.13 避免兼容性问题引发异常中断程序流程[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值