问答

vue中$refs获取子组件时产生的异常

作者:admin 2021-06-27 我要评论

C 是一个通用弹窗组件,里面有初始化方法 init() 。 其中 A B 是两个不同组件,各自引用了 C 作为子组件。 在 A 组件中 ......button @click='openComponent'按...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

C 是一个通用弹窗组件,里面有初始化方法 init()
其中 A B 是两个不同组件,各自引用了 C 作为子组件。
A 组件中

......

<button @click='openComponent'>按钮</button>
<c v-if='showFlag' ref='c'></c>

......


methods: {
    openComponent(data) {
        this.showFlag = true;
        this.$nextTick(() => {
            this.$refs.c.init(data);
        })
    },
}

在这种情况下,点击按钮可以顺利打开组件 C ,并调用 C 中的初始化方法。

但是在 B 组件中

......

<button @click='openComponent'>按钮</button>
<c v-if='showFlag' ref='c'></c>

......


methods: {
    openComponent(data) {
        // B组件中在满足某种条件下才会打开组件C
        if (xxx) {
            this.showFlag = true;
            this.$nextTick(() => {
                this.$refs.c.init(data);
            })
        } else {
            ......
        }
    },
}

同样的方式在组件 B 中点击按钮,第一次点击时 this 中并不存在 C , C 弹窗组件没有按预想中出现, init() 方法自然也没法顺利调用。在第二次点击按钮时, this.$refs 中可以找到 C ,弹窗也顺利出现,并且成功将数据初始化。
之后在组件 B 中,我将

<c v-if='showFlag' ref='c'></c>

替换成了

<c v-show='showFlag' ref='c'></c>

在组件 B 中表现与组件 A 一致。
虽然问题得以解决,但是整个过程简直让人迷惑……
为什么在组件 B 中只是多了一个 if 判断,组件 C 就无法按预期找到。而修改成 v-show 后为什么表现又与预期一致……
乍一眼让我觉得 B 组件中是 this.$nextTick 没有生效,又是什么原因导致了这种情况的出现呢?

###

子组件也有个渲染过程,不在this.$nextTick返回之内,用了v-if如果要监听子组件的mounted需要hook子组件:<C @hook:mounted="childMounted"></C>

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • vue中$refs获取子组件时产生的异常

    vue中$refs获取子组件时产生的异常

  • 支付宝小程序真机调试 'sessionId' 一

    支付宝小程序真机调试 'sessionId' 一

  • 点击获取当前event.currentTarget 的坐

    点击获取当前event.currentTarget 的坐

  • Goland 文件夹一直loading

    Goland 文件夹一直loading

腾讯云代理商
海外云服务器