vue-循环引用感想

58 篇文章 0 订阅
10 篇文章 0 订阅

开场-什么是循环引用

刚开始看着这个官方文档上的循环引用十分的不解,意思是什么呢?看着官网的意思,大概举了个文件管理器类似的实现
在这里插入图片描述
我们可以将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的问题,于是把A,B组件都加上了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)
  },

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值