微信小程序自定义组件封装及父子间组件传值的方法


Posted in Javascript onAugust 28, 2018

首先在我们可以直接写到需要的 page 中,然后再进行抽取组件,自定义组件建议 wxzx-xxx 命名

官网地址:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/

例如,我们封装的组件名为 **wxzx-loadmore

微信小程序自定义组件封装及父子间组件传值的方法

wxzx-loadmore.wxml

<view hidden="{{response.length < 1}}">
  <view class="weui-loadmore" hidden="{{is_loadmore}}">
    <view class="weui-loading"></view>
    <view class="weui-loadmore__tips">正在加载</view>
  </view>
  <view class="weui-loadmore weui-loadmore_line" hidden="{{!is_loadmore}}">
    <text class="weui-loadmore__tips">{{tip}}</text>
  </view>
</view>

这里就是把index.wxml中的需要封装成组件的代码原样copy过来

wxzx-loadmore.js

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    response: {
      type: String,
      value: ''
    },
    is_loadmore: {
      type: Boolean,
      value: false
    },
    tip: {
      type: String,
      value: '我是有底线的'
    }
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
     emit: function(data) {
      // 自定义组件向父组件传值 
      let val = data,
        my_event_detail = {
          val: val
        }
      // myevent自定义名称事件,父组件中使用
      this.triggerEvent('myevent', my_event_detail)
       /*
        在父组件中写上bind:myevent="get_emit",在父组件中就需要调用get_emit事件
       */
    },
  }
})

index.wxml 父组件

<wxzx-loadmore 
    response="{{comment_list}}"
    is_loadmore="{{is_loadmore}}"
    bind:myevent="get_emit"
    ></wxzx-loadmore>
<!-- 这就是在父组件中调用子组件,然后基于子组件传值来在父组件中赋值 -->

index.js 中

// 接受子组件的传值
  get_emit: function (e) {
    this.setData({
      is_show: e.detail.val
    })
  },

index.json 这里需要引入组件,在哪个父页面中引用子组件,就在哪个json文件中引入

{
  "usingComponents": {
    "wxzx-loadmore": "/component/wxzx-loadmore/wxzx-loadmore"
  }
}

父组件向子组件传参

声明:A组件为父组件,B组件为子组件,以下是A组件向B组件传参:

在A组件中引入B组件

在A组件的json中写入:

{
"component": true,
"usingComponents": {
"componentB": "../child2/child2"
}
}

在A组件的wxml中写入:

<view>我是组件A</view>
<view>
<view>子组件内容:</view>
<componentB paramAtoB='我是A向B中传入的参数'/>
</view>

在B组件的js中写入:

Component({

behaviors: [],

properties: {
paramAtoB:String
},
data: {

}, // 私有数据,可用于模版渲染

// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { },
moved: function () { },
detached: function () { },

methods: {

}

})

即在properties中定义A组件要传过来的参数类型

在B组件的wxml中写入:

<view style='border:2px solid gray;'>
<view style='text-align:center;'>我是组件B</view>
<view>A中传入的参数:{{paramAtoB}}</view>
</view>

总结: A组件向B组件传参,实际上就是在A组件中引入B组件的时候,带上一个属性paramAtoB,并且给其赋值,然后B组件通过这个属性名称paramAtoB,获取其值

子组件向父组件传参

声明:A组件为父组件,B组件为子组件,以下是B组件向A组件传参:

要让子组件给父组件传参,首先得在父组件引入子组件的时候,加个触发事件,如下:

在父组件A中wxml:

<view style='padding:20px;border:2px solid red;'>
<view style='text-align:center;'>我是组件A</view>
<view>
<view>A组件内容:</view>
<view>B组件传入参数:{{paramBtoA}}</view>
<componentB paramAtoB='我是A向B中传入的参数' bind:myevent="onMyEvent"/>
</view>

</view>

myevent就是绑定的触发事件

在父组件A中js:

Component({

behaviors: [],

properties: {

},
data: {

}, // 私有数据,可用于模版渲染

// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { },
moved: function () { },
detached: function () { },

methods: {
onMyEvent:function(e){
this.setData({
paramBtoA: e.detail.paramBtoA
})
}
}

})

onMyEvent就是当被子组件触发时的函数

在子组件B中wxml:

<view style='border:2px solid gray;'>
<view style='text-align:center;'>我是组件B</view>
<view>A中传入的参数:{{paramAtoB}}</view>
<button bindtap='change'>向A中传入参数</button>
</view>

button按钮点击事件一触发,就可以传入参数进入父组件A中,在子组件B中js:

Component({

behaviors: [],

properties: {
paramAtoB:String
},
data: {

}, // 私有数据,可用于模版渲染

// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () { },
moved: function () { },
detached: function () { },

methods: {
change:function(){
this.triggerEvent('myevent', { paramBtoA:123});
}
}

})

this.triggerEvent就是按钮点击之后执行的事件,触发myevent事件,传入参数paramBtoA进入父组件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery优缺点分析说明
Apr 10 Javascript
使用JavaScript动态设置样式实现代码及演示动画
Jan 25 Javascript
jQuery制作拼图小游戏
Jan 12 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
Oct 10 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
js实现动态改变radio状态的方法
Feb 28 Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
vue删除html内容的标签样式实例
Sep 13 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 Javascript
layui实现文件或图片上传记录
Aug 28 #Javascript
利用vue.js把静态json绑定bootstrap的table方法
Aug 28 #Javascript
react native 获取地理位置的方法示例
Aug 28 #Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 #Javascript
JavaScript模拟实现自由落体效果
Aug 28 #Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 #Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 #Javascript
You might like
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
Python自定义线程类简单示例
2018/03/23 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
python找出完数的方法
2018/11/12 Python
python实现大文件分割与合并
2019/07/22 Python
Python pandas用法最全整理
2019/08/04 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
tensorflow常用函数API介绍
2020/04/19 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
社区敬老月活动实施方案
2014/02/17 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
应聘教师求职信范文
2015/03/20 职场文书
红楼梦读书笔记
2015/06/25 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
Golang bufio详细讲解
2022/04/21 Golang