vue-循环引用感想

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

vue-循环引用感想

开场-什么是循环引用

刚开始看着这个官方文档上的循环引用十分的不解意思是什么呢看着官网的意思大概举了个文件管理器类似的实现
在这里插入图片描述
我们可以将A组件看成可以展开的B组件的话通过判断数据下是否还有children有的话就又是A组件否则就是B组件了以此类推。

本来循环引用就是这种的不过工作中可能自己没写出来过的也。简单概括为A组件导入了B组件B组件导入了C组件C组件又导入了B组件。、C组件互为对方的子组件和父组件互相依赖不知道如何不经过其中一个组件而完全解析出另一个组件。

探讨-怎么用

直接调用循环嵌套会有问题的。

<!-- 主组件吧 -->
<template>
  <div class='app-container'>
    <comA></comA>
  </div>
</template>

<script>
import comA from './comA.vue'
export default {
  components: {comA},
}

</script>

<!-- A组件 -->
<template>
  <div>
    111
    <comB></comB>
  </div>
</template>

<script>
import comB from './comB.vue';
export default {
  components: {
    comB
  }
</script>

<!-- B组件 -->
<template>
  <div>
    <comA></comA>
  </div>
</template>

<script>
import comA from './comA.vue';
export default {
  components: {
    comA
  },
}
</script>

理论上应该也是可以的
在这里插入图片描述
报错了结果看报错貌似是name的问题于是把AB组件都加上了name
在这里插入图片描述
你也可能遇到这种错误原因待定哈哈。先把他解决了再说查查资料
给每个A,B组件都加上了代码代码如下:

<!-- A组件 -->
  beforeCreate: function () {
    this.$options.components.comB = require('./comB.vue').default
  }
  <!--  B组件-->
  beforeCreate: function () {
    this.$options.components.comA = require('./comA.vue').default
  }

在这里插入图片描述
直接报错连111都没有了。发现这里原来是直接无限循环了导致超出最大调用堆栈大小。

在这里插入图片描述
箭头指的还有很多很多没打开的。所以官网也建议添加个v-if来进行控制
在这里插入图片描述
再改一下A组件的代码

<!--  -->
<template>
  <div>
    111
    <comB v-if="flag"></comB>
  </div>

</template>

<script>
import comB from './comB.vue';
export default {
  name: 'comA',
  data() {
    return {
      flag: false
    };
  },
  components: {
    comB
  },
  mounted() {

    setTimeout(() => {
      this.flag = true
    }, 2500)
  },
  beforeCreate: function () {
    this.$options.components.comB = require('./comB.vue').default
  }
}

</script>

在这里插入图片描述
没有报错完美

后话

如果我们要在主组件中传方法到子组件呢

普通的porps传参

我们这就传到A组件就行如果是按照普通的props传参的话

<!-- 主组件 -->
<template>
  <div class='app-container'>
    <comA :funA="funA"></comA>
  </div>
</template>

<script>
import comA from './comA.vue'
export default {
  components: {comA},
  methods: {
    funA() {
      console.log(111)
    }
  }
}
</script>

<!--A组件  -->
<template>
  <div>
    111
    <comB v-if="flag"></comB>
  </div>
</template>

<script>
import comB from './comB.vue';
export default {
  name: 'comA',
  data() {
    return {
      flag: false
    };
  },
  props: {
    funA:Function
  },
  components: {
    comB
  },
  mounted() {
    setTimeout(() => {
      this.flag = true
      this.funA()
    }, 2500)
  },
  beforeCreate: function () {
    this.$options.components.comB = require('./comB.vue').default
  }
}

</script>

在这里插入图片描述
这样会报错的

依赖注入

<!-- 主组件-->
  provide(){
   return {
    funA:this.funA
   }
  },

  methods: {
    funA() {
      console.log(111)
    }
  }
<!-- A组件-->
  inject: ['funA'],
  mounted() {
    setTimeout(() => {
      this.flag = true
      this.funA()
    }, 2500)
  },

结果:
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: vue