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

官网上描述:
这里写图片描述

$broadcast

$broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消。事件广播的顺序为广度优先搜索顺序。

$emit

$emit与$broadcast正好相反,事件发起组件的所有祖先组件会依次接收到$emit事件。

$invoke

$invoke是一个页面或组件对另一个组件中的方法的直接调用,通过传入组件路径找到相应的组件,然后再调用其方法。

$emit例子:

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

子组件代码:


            
                {{platformArray[platformIndex]}}
                
            
 

methods = {
    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
    }
}

当切换子组件中当平台时:
微信小程序wepy框架中父组件与子组件通信和交互_第1张图片
当切换子组件中的平台为全平台,在父组件中选择指标会提示:
微信小程序wepy框架中父组件与子组件通信和交互_第2张图片

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

子组件代码:


        {{category.name}}
      


data = {
      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,
}

当在父组件内触底刷新时:
微信小程序wepy框架中父组件与子组件通信和交互_第3张图片
当在父组件内调用子组件获取列的方法后,得到下一页数据:
微信小程序wepy框架中父组件与子组件通信和交互_第4张图片

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

父组件代码:


     
        
            全网大盘
        
        
            排行榜
        
    
    
    
    


methods = {
    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)
          }
      }
  }

你可能感兴趣的:(微信小程序)