美文网首页
组件递归slot插槽传值

组件递归slot插槽传值

作者: Frank_Fang | 来源:发表于2024-03-04 17:30 被阅读0次

最近写了一个类似el-tree的组件,需要在父组件中用slot插槽,看了下el-tree的写法,略微复杂,后来网上查了一下,参考了一个可行相对简单的方法(https://juejin.cn/post/7222931700438138937):

使用页面:

<template>
  <div>
    <MyTree :data="treeData">
      <template v-slot="{label, value}">
        <div>{{ label }}</div>
        <el-button type="text">{{ value }}</el-button>
      </template>
    </MyTree>
  </div>
</template>
<script>
import MyTree from './MyTree'

export default {
  components: {
    MyTree
  },
  data () {
    return {
      treeData: [
        {
          label: '父节点',
          value: 102,
          children: [
            {
              label: '子节点1',
              value: 20,
              children: [
                {
                  label: '孙节点1-1',
                  value: 30
                }
              ]
            },
            {
              label: '子节点2',
              value: 13,
              children: [
                {
                  label: '孙节点2-1',
                  value: 20
                },
                {
                  label: '孙节点2-2',
                  value: 10
                }
              ]
            }
          ]
        }
      ]
    }
  }
}
</script>

子组件:MyTree

<template>
  <div class="my-tree">
    <MyTreeNode v-for="(item, index) in data" :key="index" :data="item">
      <template v-slot="{ label, value }">
        <slot :label="label" :value="value"></slot>
      </template>
    </MyTreeNode>
  </div>
</template>
<script>
import MyTreeNode from './MyTreeNode'

export default {
  name: 'MyTree',
  components: {
    MyTreeNode
  },
  props: {
    data: {
      type: Array,
      default: () => []
    }
  }
}
</script>

孙组件:MyTreeNode

<template>
  <div class="tree">
    <slot :label="data.label" :value="data.value"></slot>
    <div v-for="(item, index) of data.children" :key="index">
      <!-- 显示title标题 -->
      <div class="title">
        <!-- 插槽,这里也是把title传出去, A插槽 -->
        <slot :label="item.label" :value="item.value"></slot>
      </div>
      <!-- 如果存在子项则调用本身组件 递归 -->
      <template v-if="item.children">
        <MyTreeNode v-for="(it, ind) in item.children" :data="it" :key="ind">
          <!-- B 插槽 -->
          <slot :label="it.label" :value="it.value"></slot>
        </MyTreeNode>
      </template>
    </div>
  </div>
</template>
<script>
export default {
  name: 'MyTreeNode',
  props: {
    data: {
      type: Object,
      default: () => ({})
    }
  }
}
</script>

相关文章

  • 插槽

    ### 认识插槽 插槽:如果局部组件中有使用slot标标签的在父组件内可改变其值 ### 插槽默认值 如果设置插槽...

  • vue 插槽slot向父组件传值

    子组件,里面有slot插槽,并在slot上绑定了text值 父组件通过slot-scope就可以拿到子组件slot...

  • vue slot插槽

    v-slot 插槽的用法: 单个slot内容时: 子组件: 父组件: 多个slot内容时(具名插槽): 子组件: ...

  • 2019-01-18 Vue学习

    父组件传数据给子组件(props),子组件传给父组件($emit("触发大的事件”,传的数据)) 插槽(slot)...

  • 插槽slot

    插槽,占位符slot具名插槽,指定占位符slot、name作用域插槽,子组件占位符向父组件占位符通信。slot、s...

  • vue slot匿名插槽 / 具名插槽 / 作用域插槽

    slot 匿名插槽 slot 具名插槽 应用场景 slot 作用域插槽: 在父组件中可以获得子组件的数据,并在父组...

  • 2-6 vue 匿名插槽-slot

    匿名插槽-slot Slot插槽 —— 实现内容分发 什么是slot?slot的意思是插槽,其目的在于让组件的可扩...

  • slot-scope到底是什么

    插槽slot 插槽,也就是slot 插槽是组件的一块HTML模板 插槽就是要将父组件中的内容渲染到子组件中。就好像...

  • vue单文件组件相关知识

    slot插槽 在组件template中的占位,在index.html中输入的值就会替换掉插槽内容 单文件组件 .v...

  • 封装vue组件,除了props,还有v-model

    封装组件一般都是props传值,emit发射时间,slot插槽标签,今天刚学了v-model.之前都好奇别人的ui...

网友评论

      本文标题:组件递归slot插槽传值

      本文链接:https://www.haomeiwen.com/subject/nqhrzdtx.html