记录一下遇到的问题
在vue项目当中父组件向子组件传递参数,而子组件获取不到,我在created钩子函数里使用和在mounted钩子里使用时无法使用,显示参数不存在,
父组件中data的原始数据,传递给子组件,子组件在生命周期中是可以获取使用的
而我遇到的问题是,父组件传递给子组件的参数是从接口当中获取的
如果在组件的created或mounted生命周期中定义要给方法,在子组件渲染时就获取父组件的传值,并进行新数据的获取并进行页面渲染,但此时父组件请求的数据可能还没有完全返回,子组件就开始使用此数据,该数据自然不存在,打印在控制台中的父组件穿给子组件的参数 undefined,因此就会出现父组件传参不及时,子组件使用数据较早,造成数据无法使用。
而我想到的两种解决方法,
1.setTimeout 定时器
在子组件的 created 或者 mounted 等较早执行的生命周期中使用 setTimeout 定时器,来延缓执行生命周期中的函数, 使父组件从接口中获取的参数,有充分的时间传输,在子组件使用时,等待父组件的参数到来再执行,就不会出现拿不到父组件的传参问题了。
//----------------------------子组件--------------------------------
export default {
props:['fatherData'],
data(){
return {
}
},
created(){
this.setTime() // 延时1.5秒调用方法,等待父组件的传参返回
},
methods:{
setTime(){ // 定时器,延时调用方法
let win = this
setTimeout(function(){
win.getData() // 获取数据
},1500)
},
getData(){
// 使用父组件传过来的数据,进行新的请求
this.$api.getData(this.fatherData).then(res=>{
console.log(res)
}
}
}
}
// 该方法虽然可以解决上述问题,但延时调用影响了页面的响应速度,
// 不是一个很好的解决办法(不推荐)
2. watch监听
使用vue的监听方法,监听父组件的传参,一旦侦听到数据返回,便立即调用子组件的方法进行数据获取,相对于第一种方法,更加灵活和快速。
watch: {
//监听参数中的 props.markerLists 变化
'props.markerLists':{
handler(newValue, oldValue){
//console.log(newValue);
this.init();
},
// 深度侦听需要遍历被侦听对象中的所有嵌套的属性,当用于大型数据结构时,开销很大。
// 因此请只在必要时才使用它,并且要留意性能。
deep: true,
}
}
我使用的是第二种方法,