【vue】vue实现递归组件


递归组件 组件是可以在它们自己的模板中调用自身的。不过它们只能通过 name 选项来做这件事:

name: 'unique-name-of-my-component' 当你使用 Vue.component 全局注册一个组件时,这个全局的
ID 会自动设置为该组件的 name 选项。

Vue.component('unique-name-of-my-component', { // ... })
稍有不慎,递归组件就可能导致无限循环:

name: 'stack-overflow', template:
'<div><stack-overflow></stack-overflow></div>' 类似上述的组件将会导致“max stack
size exceeded”错误,所以请确保递归调用是条件性的 (例如使用一个最终会得到 false 的 v-if)。


demo.vue

    <template>
      <div>
        <div v-for="(v,i) in data" :key="i" :index="i" style="padding-left: 1em;">
          -{{ v.text }}
          <template v-if="v.sub">
            <Demo :data="v.sub"/>
          </template>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      name: "Demo",
      props: {
        data: {
          type: Array,
          required: true,
          default: () => []
        }
      },
      created() {
        console.log(this.data.sub)
      }
    }
    </script>
    
    <style scoped>
    
    </style>

index.vue

<template>
<div>
      <Demo :data="demo"/>
</div>
</template>
<script>
export default{
  data() {
    return {
      demo: [{
        text: '1-1',
        sub: [
          {
            text: '2-1',
            sub: [
              {
                text: '3-1',
                sub: []
              },
              {
                text: '3-2',
                sub: []
              }
            ]
          },
          {
            text: '2-2',
            sub: []
          }
        ]
      }]
    }
  }
}
</script>

效果图
Snipaste_2021-04-23_10-29-19.png

声明:麋鹿与鲸鱼|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 【vue】vue实现递归组件


Carpe Diem and Do what I like