2021-10-28 vue笔记-组件化开发(六) 插槽(slot):匿名插槽,具名插槽和作用域插槽

0.定义
1.特性

提高组件的重用能力

2.理解

插槽就是在子组件中挖个坑,坑内内容由父组件决定,用<slot></slot>来表示

3.分类

匿名插槽:没给插槽slot起名字
具名插槽:给slot起名字(定义具名插槽:使用到name特性)
作用域插槽:本质是携带信息的匿名插槽

1.匿名插槽
例子
  <div id="app">
      <header1>官网</header1>
      <p>我是正文</p>
  </div>
  <script>
      Vue.component('header1', {
          template: `<div>我是<slot></slot>的header</div>`
      });
      var vm = new Vue({
          el: "#app"
      });
  </script>
结果
我是官网的header
我是正文
2.具名插槽

子组件把多个插槽放置在不同地方,父组件根据插槽名字填充对应内容

例子:
    <div id="app">
        <view1>
            <div>商品参数</div>
            <div><img src="https://ftp.bmp.ovh/imgs/2021/05/b86a125cadd68fb3.png" alt=""></div>
            <div slot="header">我是头部</div>
            <div slot="footer">我是底部</div>
        </view1>
    </div>
</body>
<script>
    Vue.component('view1', {
        // 具名插槽:对slot起名字
        template: `
          <div>
              <header>
               <slot name="header"></slot>
             </header>
              <main>
                  <slot></slot>
              </main>
              <footer>
                  <slot name="footer"></slot>
              </footer>
            </div>
        `
    });
    var vm = new Vue({
        el: "#app"
    });
</script>
结果

在这里插入图片描述

3.作用域插槽

可以携带数据:子组件提供数据,父组件提供样式

例子
<div id="app">
    <header1>
        <div slot-scope="df">
            <h1>查询书籍:{{df.info}}</h1>
        </div>
    </header1>
</div>
<script>
    Vue.component('header1', {
        // 作用域插槽:本质是一个携带信息的匿名插槽
        data() {
            return {
                book: 'javascript从入门到精通'
            }
        },
        template: `
    <div><slot :info="book"></slot>,剩余馆藏:2</div>
    `
    });
    var vm = new Vue({
        el: "#app"
    });
</script>
结果:

在这里插入图片描述

4.vue2.6.0之后的重大更新

4.1.匿名插槽==>没有改变
4.2.具名插槽

  • v-slot取代slot属性,且可以简写为"#"
更新前:
父组件:<template slot="slotName">content</template>
子组件:<slot name="slotName"></slot>

更新后:
父组件:<template v-slot=:slotName">content</template>,可以简写为<template #slotName></template>
子组件:<slot name="slotName">

4.3.作用域插槽

  • v-slot:slotName="obj"取代slot-scope=“obj”
更新前:
父组件:<template slot="slotName" slot-scope="obj"></template>
子组件:<slot name="slotName" :anyName="data"></slot>

更新后:
父组件:<template v-slot:slotName="obj"></template>
子组件:<slot name="slotName" anyName="data"></slot>

4.4.总结
vue 在 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。
它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍有用的特性。
但是将会在vue 3 中,被废弃的这两个,不会被支持即无效。

### VxeTable 插槽用法详解 #### 动态列与插槽结合使用 为了实现更灵活的数据展示,在 `vxe-grid` 中可以通过配置项来设置动态列并应用插槽。这允许开发者针对不同场景定制化表格内容,而无需修改核心逻辑。 ```javascript // 安装依赖库 npm install vxe-table --save ``` 引入必要的模块: ```javascript import Vue from 'vue' import VXETable from 'vxe-table' import 'vxe-table/lib/style.css' Vue.use(VXETable) ``` 创建包含插槽的模板结构[^1]: ```html <template> <vxe-grid :columns="dynamicColumns" :data="tableData"> <!-- 自定义表头 --> <template slot="headerCell" scope="{ column }"> {{column.title}} </template> <!-- 行内操作按钮 --> <template slot="actionSlot" scope="{ row, rowIndex }"> <button @click="handleEdit(row)">编辑</button> <button @click="handleDelete(rowIndex)">删除</button> </template> </vxe-grid> </template> ``` 在 JavaScript 部分定义数据源以及处理函数[^2]: ```javascript export default { data() { return { dynamicColumns: [ { field: 'name', title: '姓名' }, { field: 'age', title: '年龄' }, { slots: { default: 'actionSlot' }, width: 200 } ], tableData: [ { id: 1, name: '张三', age: 28 }, { id: 2, name: '李四', age: 34 } ] }; }, methods: { handleEdit(row) { console.log('正在编辑:', row); }, handleDelete(index) { this.tableData.splice(index, 1); } } } ``` 上述代码片段展示了如何通过 `slots` 属性指定特定位置使用的插槽名称,并且可以在 `<template>` 标签内部进一步细化这些插槽的具体表现形式[^3]。 对于复杂的交互需求,比如编辑模式下的输入框或选择器,同样可以借助于插槽机制完成。当涉及到复杂控件如 `select` 下拉列表时,则需注意确保最终呈现的是用户友好的标签而非原始值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值