Vue递归组件与跨级通信实现详解

作者:雾松时间:2026-10-25 08:20:05浏览:108

本文详解Vue中递归组件的自调用机制,通过命名组件并在模板中引用自身实现无限层级渲染。同时介绍父组件向孙子组件传递数据的方法,展示如何利用props在多层级结构中实现数据共享与通信。

在Vue开发中,实现组件的自调用是处理无限层级结构的关键技术。

在Vue开发中,实现组件的自调用是处理无限层级结构的关键技术。

父组件负责提供初始数据源,通常包含多层嵌套的结构信息。

<template>
  <div>
    <detail-list :list="categoryList"></detail-list>
  </div>
</template>
<script>
import DetailList from './detailList.vue'

export default {
  components: { DetailList },
  data () {
    return {
      categoryList: [
        {
          title: '1',
          children: [
            {
              title: '1-1'
            },
            {
              title: '1-2'
            },
          ]
        },
        {
          title: '2',
          children: [
            {
              title: '2-1'
            },
            {
              title: '2-2'
            },
          ]
        }
      ]
    }
  }
}
</script>

子组件通过接收父组件传递的列表数据,并在模板中判断是否存在子节点。若存在,则再次调用自身组件,从而形成递归调用链,实现动态渲染。

<template>
<template>
  <div>
    <!--递归组件的应用===》可以通过组件命名来自己使用自己的组件-->
    <div class="item" v-for="(item, index) in list" :key="index">
      <div class="item-title border-bottom">
        <span class="item-title-icon"></span>
        {{ item.title }}
      </div>
      <div v-if="item.children" class="item-children">
        <detail-list :list="item.children"></detail-list>
        <!-- //自己使用自己的组件detailList -->
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'DetailList', //组件命名
  props: {
    list: Array,
  },
  data() {
    return {}
  },
}
</script>

爷孙通信指的是跨越中间层级,直接实现祖父组件与孙子组件之间的数据交互。这通常通过父组件作为中介,将数据层层传递,或利用Vuex等状态管理工具来解决深层级组件间的数据共享问题。

在Vue开发中,实现组件的自调用是处理无限层级结构的关键技术。

grand.vue

<template>
  <div>
    <detail-list :list="categoryList"></detail-list>
  </div>
</template>
<script>
import DetailList from './detailList.vue'

export default {
  components: { DetailList },
  data () {
    return {
      categoryList: [
        {
          title: '1',
          children: [
            {
              title: '1-1'
            },
            {
              title: '1-2'
            },
          ]
        },
        {
          title: '2',
          children: [
            {
              title: '2-1'
            },
            {
              title: '2-2'
            },
          ]
        }
      ]
    }
  }
}
</script>

father.vue

<template>
<template>
  <div>
    <!--递归组件的应用===》可以通过组件命名来自己使用自己的组件-->
    <div class="item" v-for="(item, index) in list" :key="index">
      <div class="item-title border-bottom">
        <span class="item-title-icon"></span>
        {{ item.title }}
      </div>
      <div v-if="item.children" class="item-children">
        <detail-list :list="item.children"></detail-list>
        <!-- //自己使用自己的组件detailList -->
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'DetailList', //组件命名
  props: {
    list: Array,
  },
  data() {
    return {}
  },
}
</script>

chidren.vue

<template>
  <div>
    🎈爷爷
    <br>
    <div>GrandSon的回复:{{reply}}</div>
    <father :msg1="msg1" :msg2="msg2" @getReply="getReply"></father>
  </div>
</template>
<script>
import Father from './father.vue'

export default {
  components: { Father },
  data () {
    return {
      msg1: '1️⃣我是GrandFather,把第二条传给GrandSon',
      msg2: '2️⃣GrandSon你好,我是GrandFather',
      reply: '' // 接收来自GrandSon的消息
    }
  },
  methods: {
    /* 将获得的数据绑定到data中,便于视图层渲染 */
    getReply (param) {
      this.reply = param
    }
  }
}
</script>

通过合理设计组件命名与递归逻辑,可以高效解决复杂树形结构的渲染与通信需求。

以上就是本文的全部内容,希望能为读者提供有价值的参考,欢迎持续关注本站获取更多技术分享。

作者最新文章