微信小程序> 微信小程序wepy框架中父组件与子组件通信和交互

微信小程序wepy框架中父组件与子组件通信和交互

浏览量:3194 时间: 来源:要和代码过一辈子

官网上描述:
小程序

$broadcast$broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消。事件广播的顺序为广度优先搜索顺序。$emit$emit与$broadcast正好相反,事件发起组件的所有祖先组件会依次接收到$emit事件。$invoke$invoke是一个页面或组件对另一个组件中的方法的直接调用,通过传入组件路径找到相应的组件,然后再调用其方法。

$emit例子:

子组件中选择平台(‘全平台’, ‘爱奇艺’, ‘腾讯’, ‘优酷’),通知父组件此时选中的平台是谁,用来通知父组件控制指标是否可以被选中(当为全平台时,不可选中资源等级)

子组件代码:

picker @change="bindPickerChange" value="{{platformIndex}}" range="{{platformArray}}"            view style="display: flex;align-items: center"                 view{{platformArray[platformIndex]}}/view                view class="iconfont icon-xiajiantou" style="margin-left:10rpx;font-size: 30rpx;color: gray" /view            /view /pickermethods = {    bindPickerChange (e) {        console.log('切换平台')        this.platformIndex = e.detail.value        this.$emit('platformChoose',this.platformArray[this.platformIndex]);    }  }data = {    platformArray: ['全平台', '爱奇艺', '腾讯', '优酷'],    platformIndex: 0,  };

父组件代码:

events = {    platformChoose(platform,event){        console.log('此时子组件选择的平台是',platform)        this.platform = platform    }}

当切换子组件中当平台时:
小程序
当切换子组件中的平台为全平台,在父组件中选择指标会提示:
小程序

$invoke例子:
子组件中调用接口获取列表数据,负责控制页面正在加载的进度是否显示,用户在父组件内滑到底部触发加载下一页数据,在子组件页面显示

子组件代码:

block wx:for="{{filmData}}" wx:for-item="category" wx:key="*this"        view style="height:100px"{{category.name}}/view/block      view class="weui-loadmore" hidden="{{isHideLoadMore || filmData.length===0}}"        view class="weui-loading"/view        view class="weui-loadmore__tips"正在加载/view/viewdata = {      page: 1,      isHideLoadMore: true,      totalPage: 1,      filmData: []}onReachBottomCom() {    this.isHideLoadMore = false;    ++this.page;    if (this.page  (this.totalPage / 10 + 1)) {        this.isHideLoadMore = true;        this.$apply();        wx.stopPullDownRefresh();    } else {        this.getlistData(); //获取下一页数据    }};async getlistData () {    try {      let apiParams = JSON.stringify({        'url': '/listData',        'method': 'POST',        'params': {           // *** 其他参数          'page': this.page,          'pageLineCount': 10,        }      })      let res = await api.api_post(apiParams)      console.log('listData 列表',res)      if (!res.data.hasOwnProperty('status')) {          let data = this.filmData.concat(res.data.listData)          this.filmData = data          this.totalPage = res.data.totalPage          this.$apply()      }    } catch (e) {      console.log(e)    }  };

父组件代码:

onReachBottom() {    this.$invoke('子组件名称', 'onReachBottomCom', '');};

app.wepy:

 'window': {    'onReachBottomDistance': 400,}

当在父组件内触底刷新时:
小程序
当在父组件内调用子组件获取列的方法后,得到下一页数据:
小程序

$broadcast例子:
父组件某个变量发生改变,通知所有子组件执行某个方法,例当组件切换tabs时,当切换为全网大盘时,所有图表重新刷新显示:

父组件代码:

view class="home page"     view class="tabs-change"        view class="tabs_item {{chooseShowPage==='全网大盘'?'':'click-color1'}}" bindtap="typeChange('全网大盘')"             全网大盘        /view        view class="tabs_item {{chooseShowPage==='排行榜'?'':'click-color1'}}" bindtap="typeChange('排行榜')"            排行榜        /view    /view    i-toast id="toast" /    grail :chooseShowPage.sync="chooseShowPage" :tvType="tvType" wx:if="{{chooseShowPage==='全网大盘'}}"/    rankingList :tvType="tvType" wx:if="{{chooseShowPage==='排行榜'}}"//viewmethods = {    typeChange (type) {      this.chooseShowPage = type      this.updateShowPage()    }  };async updateShowPage () {    try {      await new Promise(resolve = {        setTimeout(() = {          resolve('async await test...')            }, 1000)      })      this.$broadcast('chooseShowPage', this.chooseShowPage)   //必须是异步执行广播事件,原理和小程序页面刷新和canvas重绘的先后机制有关,否则图表不显示      this.$apply()    } catch (e) {      console.log(e)    }  }

子组件代码:

events = {chooseShowPage (newValue) {          if (newValue==='全网大盘') {              chart.setOption(this.option)          }      }  }

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎