wepy父组件onload中请求数据,更新.sync动态传值绑定的数据,子组件onload中获取不到值。

  wepy的props传值分为静态传值和动态传值,静态传值比较简单,只能传递String字符串类型,不需要修饰符;动态传值需要使用.sync修饰符,如果想子组件向父组件传值,可以通过设置子组件props的twoWay: true来达到子组件数据绑定至父组件的效果。如果既使用.sync修饰符,同时子组件props中添加的twoWay: true时,就可以实现数据的双向绑定了,具体详细介绍看wepyjs prop传值

  wepy在项目开发中发现在父组件onload中请求数据,更新.sync动态传值绑定的数据,子组件onload中获取不到值。

父组件代码:

<template>
  <view>
   <PersonalInfo :id.sync="id" :personalDetail.sync="personalDetail"></PersonalInfo> 
  </view>
</template>
<script>
  import wepy from 'wepy';
  import PersonalInfo from './components/personalInfo'
  import {ApiHome} from '../../api';
  export default class baseInfo extends wepy.page {
    config = {
      navigationBarTitleText: ''
    }
    components = {
      PersonalInfo
    }
    data = {
      id: '',
      personalDetail:{}
    }
    mixins = []
    methods = {
    }
    async getUserDetailInfo () {
      try {
        wx.showLoading({ title: '请稍后...', icon: 'loading', mask: true });
        let res = await ApiHome.getUserDetailInfo({
          id: this.id
        })
        if (res && res.result) {
          this.personalDetail = res.result
          this.$apply()
          wx.hideLoading();
          return
        }
        wx.hideLoading();
      } catch (e) {
        console.log(e)
        wx.hideLoading();
        wx.showToast({ title: '信息获取失败', icon: 'none' });
      } 
    }
    async onLoad({id}) {
      this.id = id
      this.$apply()
      await this.getUserDetailInfo()
    }
  }
</script>

子组件代码:

<template>
 <view></view>
</template>

<script>
  import wepy from 'wepy';
  export default class Index extends wepy.component {
    props = {
      id: {
        type: String,
        default: ''
      },
      personalDetail: {
        type: Object,
        default: function () {
          return {}
        }
      }
    };
    mixins = []
    data = {}
    computed = {}
    methods = {}
    events = {}
    onLoad(option) {
      console.log('id', this.id)
      console.log('personalDetail', this.personalDetail)
    }
  }
</script>

子组件可以获取到id的值,但是获取不到接口请求传递过来的personalDetail值。
在这里插入图片描述
  通过控制台输出可以看到子组件onload时,并没有获取到personalDetail值,但是通过查看控制台AppData可以看到数据personalDetail已经传入子组件,对于子组件需要根据父组件传递的personalDetail进行返现,并不能实现,Component只有onload生命周期函数。
在这里插入图片描述
解决办法:使用$broadcast事件广播,父组件向各个子组件发送广播事件,子组件接受广播事件进行返现。

父组件发送广播事件:

async getUserDetailInfo () {
      try {
        wx.showLoading({ title: '请稍后...', icon: 'loading', mask: true });
        let res = await ApiHome.getUserDetailInfo({
          id: this.id
        })
        if (res && res.result) {
          // 发送广播事件
          this.$broadcast('getPersonalDetail', res.result)
          wx.hideLoading();
          return
        }
        wx.hideLoading();
      } catch (e) {
        console.log(e)
        wx.hideLoading();
        wx.showToast({ title: '信息获取失败', icon: 'none' });
      } 
    }

子组件接收广播事件:

events = {
  getPersonalDetail(value) {
    console.log(value)
    // TODO 更新页面值
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值