• vue组件间传值之插槽


    什么是插槽

    插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制。

    vue中插槽也是父子组件通讯的一种方式。

    组件最大的特性就是复用性,插槽能大大提高组件的复用性。

    1. 通过插槽 ,父组件可以把一段(模板的)结构传递给子组件 。
    2. 用于实现组件的内容分发, 通过 slot 标签, 可以接收到写在组件标签内的内容
    3. vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽

    组件插槽的基本使用

    1. <div id="app">
    2. <my-com>Hello my-com>
    3. <my-com>
    4. <a href="">点击a>
    5. my-com>
    6. <my-button>点击my-button>
    7. <my-button>提交my-button>
    8. <my-button @click="num++">
    9. <div>总共点击了{{num}}次div>
    10. my-button>
    11. div>
    12. <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.37/vue.global.js">script>
    13. <script>
    14. var app=Vue.createApp({
    15. data:function(){
    16. return{
    17. num:0
    18. }
    19. },
    20. methods: {
    21. },
    22. });
    23. app.component("MyCom",{
    24. template:`<div class="my-com">
    25. 子组件
    26. <div>
    27. <slot>slot>
    28. div>
    29. div>`,
    30. });
    31. app.component("MyButton",{
    32. template:`<button>
    33. <slot>slot>
    34. button>`,
    35. });
    36. app.mount("#app");
    37. script>

    具名插槽

    • 具有名字的插槽
    • 使用 中的 “name” 属性绑定元素
    • 通过slot属性来指定, 这个slot的值必须和下面slot组件得name值对应上 如果没有匹配到 则放到匿名的插槽中
    1. <div id="app">
    2. <my-com>
    3. <template v-slot:header>头部template>
    4. <template v-slot:default> 默认插槽template>
    5. <template #footer>底部template>
    6. my-com>
    7. div>
    8. <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.37/vue.global.js">script>
    9. <script>
    10. var app=Vue.createApp({
    11. data:function(){
    12. return{
    13. num:0
    14. }
    15. },
    16. methods: {
    17. },
    18. });
    19. app.component("MyCom",{
    20. template:`<div class="my-com">
    21. <div class="header">
    22. <slot name="header">slot>
    23. div>
    24. <div class="body">
    25. <slot>slot>
    26. div>
    27. <div class="footer">
    28. <slot name="footer">slot>
    29. div>
    30. div>`,
    31. });
    32. app.mount("#app");
    33. script>

    总之,slot存在于子组件,v-slot在父组件,最终页面展示结果是父组件!!!

    作用域插槽:父组件对子组件的内容进行加工处理。

    作用域插槽也可以理解为带数据的插槽,即带参数的插槽,简单的来说就是子组件提供给父组件的参数,该参数仅限于插槽中使用,父组件可根据子组件传过来的插槽数据来进行不同的方式展现和填充插槽内容。

    1. <div id="app">
    2. <my-com>
    3. <template v-slot:header="data">
    4. 头部
    5. {{data}}
    6. <br>
    7. {{data.msg}}
    8. template>
    9. <template v-slot:default="{msg:text,age}">
    10. 默认插槽
    11. {{text}}
    12. {{age}}
    13. template>
    14. <template #footer>底部template>
    15. my-com>
    16. div>
    17. <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.37/vue.global.js">script>
    18. <script>
    19. var app=Vue.createApp({
    20. data:function(){
    21. return{
    22. num:0
    23. }
    24. },
    25. methods: {
    26. },
    27. });
    28. app.component("MyCom",{
    29. template:`<div class="my-com">
    30. <div class="header">
    31. <slot name="header" :msg="msg" :age="age">slot>
    32. div>
    33. <div class="body">
    34. <slot :msg="msg" :age="age">slot>
    35. div>
    36. <div class="footer">
    37. <slot name="footer">slot>
    38. div>
    39. div>`,
    40. data(){
    41. return{
    42. msg:"Jack",
    43. age:10,
    44. }
    45. }
    46. });
    47. app.mount("#app");
    48. script>

    结果:

    父组件给子组件数据,在父组件可以通过:data的形式实现:

    1. <div id="app">
    2. <my-com>
    3. <template v-slot:header :data="datas">
    4. 头部
    5. {{datas}}
    6. <br>
    7. {{datas.msg}}
    8. template>
    9. my-com>
    10. div>

    补充:作用域插槽与element-plus的联合使用

    1. <div id="app">
    2. <el-table :data="tableData" style="width: 100%">
    3. <el-table-column label="日期" prop="date" width="180">
    4. el-table-column>
    5. <el-table-column label="名字" prop="name" width="180">
    6. <template #default="{row}"><span>{{row.name}}span>template>
    7. el-table-column>
    8. <el-table-column label="地址" prop="address" width="180">
    9. el-table-column>
    10. <el-table-column label="Operations">
    11. <template #default="{row}">
    12. <el-button @click="onClick(row)" type="success">详情el-button>
    13. template>
    14. el-table-column>
    15. el-table>
    16. div>
    17. <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.37/vue.global.js">script>
    18. <script src="https://cdn.bootcdn.net/ajax/libs/element-plus/2.2.10/index.full.min.js">script>
    19. <script>
    20. var app=Vue.createApp({
    21. data:function(){
    22. return{
    23. num:0,
    24. tableData:[
    25. {
    26. date: '2016-05-03',
    27. name: 'Tom',
    28. address: 'No. 189, Grove St, Los Angeles',
    29. },
    30. {
    31. date: '2018-05-20',
    32. name: 'Jack',
    33. address: 'No. 189, Grove St, Los Angeles',
    34. },
    35. {
    36. date: '2020-05-04',
    37. name: 'Rose',
    38. address: 'No. 189, Grove St, Los Angeles',
    39. },
    40. {
    41. date: '2022-11-29',
    42. name: 'Lucy',
    43. address: 'No. 189, Grove St, Los Angeles',
    44. },
    45. ]
    46. }
    47. },
    48. methods: {
    49. onClick(row){
    50. console.log(row);
    51. }
    52. },
    53. });
    54. app.use(ElementPlus);//注册组件
    55. app.mount("#app");
    56. script>

     

  • 相关阅读:
    Liunx文件目录操作命令(cd、pwd、ls、mkdir、rmdir)
    机器学习(八):决策树
    Win7下设置“定时关机”的方法
    2023.9.23 关于 HTTP 详解
    Vue与relation-graph:高效打造关系图的秘诀
    独立服务器应该怎么选择?
    【Oracle】Oracle系列之十--Oracle正则表达式
    un9.2:JavaScript基础用法。
    【高危安全通告】微软8月多个漏洞修复
    Lua脚本之库存
  • 原文地址:https://blog.csdn.net/Doulvme/article/details/126284415