Vue相关问题

21 阅读1分钟

1.子组件生命周期钩子里接收不到props数据问题

场景回忆: 父组件中

<template>
    <Child :data="data"/>
</template>
<script>
import Child from "@/components/Child"
import {getData} from "@/api/xxx"
export default {
    components:{Child}
    data(){
        return {
            data:'',
        }
    },
    async created(){
        const res = await getData()
        if (res && res.success) {
            this.data = res.data
        }
    }
}
</script>

子组件中

<template>
    <div>{{log}}</div>
</template>
<script>

export default {
    props:["data"]
    data(){
        return {
            log:'',
        }
    },
    created(){
        this.log = data;
    }
}
</script>

有的时候突然发现log中数据为空,天哪,出bug了!冷静分析一下原因,研究一下父子组件渲染时生命周期钩子函数执行顺序: 父-beforeCreate → 父-created→ 父-beforeMount → 子-beforeCreate → 子-created → 子-beforeMount → 子-mounted → 父-mounted,那按理说子组件的created是慢于父组件的created的,为什么拿不到数据呢?

解决方法: 参考博客blog.csdn.net/zmkyf1993/a…

出现这种情况的原因, 因为父组件中的要就要传递的props属性 是通过接口请求回来的, 请求的这个过程是需要时间的,但是子组件的渲染要快于接口请求过程,所以此时created、mounted这样的只会执行一次的生命周期钩子,已经执行了,但是props还没有流进来(子组件),所以只能拿到默认值。 正解 子组件中

<template>
    <div>{{log}}</div>
</template>
<script>

export default {
    props:["data"]
    data(){
        return {
            log:'',
        }
    },
    watch:{
        data(newVal, oldVal){
            // 正确的赋值
            this.log = newVal
        }
    },
    created(){
        // 错误的赋值
        // this.log = data;
    }
}
</script>

另一种解决方案是使用计算属性 代码:

<template>
    <div>{{log}}</div>
</template>

<script>
export default {
    props:["data"]
    data(){
        return {
        }
    },
    computed:{
        log(){
            // 正确的赋值
            return this.data
        }
    },
    created(){
        // 错误的赋值
        // this.log = data;
    }
}
</script>