vue 父组件传参给子组件,而子组件获取不到

记录一下遇到的问题

在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,
       }
  }

我使用的是第二种方法, 

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue中,当组件无法获取到子组件的数据时,可以考虑以下两种方法来解决这个问题。 第一种方法是使用事件机制。在子组件中使用 `$emit` 方法触发一个自定义事件,然后在组件中通过在子组件上监听该事件,并在事件处理函数中获取组件传递的数据。这样可以确保在组件获取组件数据时的时机是正确的。 第二种方法是使用`$nextTick`方法。在组件中,可以通过`$nextTick`方法来确保子组件已经加载完毕并渲染完成后再获取数据。`$nextTick`方法会在DOM更新完成之后执行回调函数,这样可以保证在回调函数中获取组件的数据时不会出现获取不到的情况。 综合以上两种方法,我们可以在组件中判断是否已经获取到了数据,如果获取到了数据再渲染子组件,这样可以确保子组件一定是等组件准备好数据后再加载,从而解决组件无法获取组件数据的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue 组件调用子组件,子组件调用组件,动态切换组件不到组件的解决办法](https://blog.csdn.net/wafangdianwangning/article/details/95861658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue爬坑之 组件向子组件异步传参组件中拿不到值的解决方法](https://blog.csdn.net/dyw3390199/article/details/114649431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值