1、自定义组件间通信与事件

https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html

(1)、WXML 数据绑定:用于父组件向子组件的指定属性设置数据

<!-- 父组件 index.wxml-->
<view class="container">
// 子组件
<v-child propA="{{dataA}}" propB="{{dataB}}" propC="{{dataC}}"></v-child>
</view> <!-- index.json-->
{
"usingComponents": {
"v-child": "/components/child/index"
}
} <!-- index.js--> const app = getApp() Page({
data: {
dataA: "来自父组件index的数据",
dataB: true,
dataC: 2300
}
})
<!-- 子组件 child  index.html -->
<view class="content">
<view>String: {{propA}}</view>
<view>Boolean: {{propB}}</view>
<view>Number: {{propC}}</view>
</view> <!-- 子组件 index.js -->
Component({
/**
* 组件的属性列表
*/
properties: {
propA: String,
propB: Boolean,
propC: Number
}, /**
* 组件的初始数据
*/
data: { }, /**
* 组件的方法列表
*/
methods: { }
})

页面渲染结果:

(2)、事件:用于子组件向父组件传递数据,可以传递任意数据

<!-- 子组件 event -->

<!-- index.wxml -->

<view class="content">
<view class="title">自定义事件</view>
<button bindtap="tapclick">点击</button>
</view> <!-- index.js --> Component({ /**
* 组件的方法列表
*/
methods: {
tapclick: function(event) {
let behavior = {
id: 123456,
name: 'Natasha',
gender: 'female'
}
this.triggerEvent('customevent', {
behavior: behavior
}, {})
}
}
})
<!-- 父组件 index -->

<!-- index.wxml -->

<view class="container"> 
<v-event bind:customevent="onCustomEvent"></v-event>
<view wx:if="{{id}}">id: {{id}}</view>
<view wx:if="{{name}}">name: {{name}}</view>
<view wx:if="{{gender}}">gender: {{gender}}</view>
</view> <!-- index.js --> const app = getApp() Page({
onCustomEvent: function(event) {
console.log(event)
let id = event.detail.behavior.id,
name = event.detail.behavior.name,
gender = event.detail.behavior.gender this.setData({
id: id,
name: name,
gender: gender
})
},
})

通过 triggerEvent 触发自定义事件,并把数据通过第二个参数(detail对象)传递给父组件

2、组件间代码共享 Behavior

假如多个子组件共享相同的 properties,data,methods,在每一个组件中都去重复粘贴相同的代码是完全没有必要的,这个时候可以用到 behavior

新建一个 my-behavior.js 文件

module.exports = Behavior({
behaviors: [],
properties: {
carModel: String,
price: Number,
sale: Boolean
},
data: {
myBehaviorData1: "eyes on me"
},
attached: function() { },
methods: {
myBehaviorMethod: function() {
console.log("I don't have an idea to buy or not")
}
}
})

在组件中 引用 behavior.js

<!-- js -->

let myBehavior = require ("../my-behavior.js")
Component({
behaviors: [myBehavior],
/**
* 组件的属性列表
*/
properties: { }, /**
* 组件的初始数据
*/
data: { }, /**
* 组件的方法列表
*/
methods: { }
}) <!-- wxml --> <view class="content">
<view>v-like component</view>
<view class="title">共有data属性:</view>
<view>{{myBehaviorData1}}</view>
<view class="title">共有property属性:</view>
<view>型号: {{carModel}}</view>
<view>价格: {{price}}元</view>
<view>是否折扣:{{sale}}</view>
<view class="title">共有方法:</view>
<button bindtap="myBehaviorMethod">button</button>
</view>

例如,父组件 index.wxml 中有 v-like 和 v-movie 共用相同的代码

<!-- 父组件 index.wxml -->

<view class="container">
<v-like carModel="SYLPHY" price="135000" sale="true"></v-like>
<v-movie carModel="XTS" price="250000" sale="false"></v-movie>
</view>

页面渲染效果

3、自定义组件的显示与隐藏

显示与隐藏可以使用 wx:if 和 hidden 来控制,二者都接受一个 Boolean 类型的值,所以传值的时候就要注意了

  <!-- "false" 是一个非空字符串,所以会显示 -->
<view wx:if="false">1、wx:if="false"</view>
<!-- {{false == ""}}是true,空字符串被解析为false,而hidden为false时,是不会隐藏的,所以会显示 -->
<view hidden="">2、hidden=""</view>
<!-- 同上,wx:if 为true时才会插入到DOM节点中,此时为false,所以不会显示 -->
<view wx:if="">3、wx:if=""</view>
<!-- 与 1 相同,无论是字符串 "true" 还是 "false",都被解析成true,所以下面两个都会被隐藏 -->
<view hidden="true">4-1、hidden="true"</view>
<view hidden="false">4-2、hidden="true"</view>
<!-- 以下两个都是布尔值,所以一个不被渲染到DOM中,一个被隐藏 -->
<view wx:if="{{false}}">5、wx:if="{{false}}"</view>
<view hidden="{{true}}">6、hidden="{{true}}"</view>

渲染结果:

按照上面的写法,避开雷区,尝试用 wx:if 和 hidden 分别来隐藏自定义组件 v-like 和 v-movie

<view class="container">
<v-like hidden="{{true}}" carModel="SYLPHY" price="135000" sale="true"></v-like>
<v-movie wx:if="{{false}}" carModel="XTS" price="250000" sale="false"></v-movie>
</view>

理论上,这两个自定义组件应该都不会显示,但实际上,只有 wx:if 达到了预期的效果

那为什么自定义组件 v-like 上的hidden没有起作用呢?无论 hidden="{{true}}" 还是 hidden="{{false}}" 都没办法让它隐藏,这里有一种可能就是 hidden 被当做成和 carModel,price 一样的自定义属性了

现在尝试将 hidden 当做自定义属性由父组件向子组件v-like传值,v-movie 不做修改。将 hidden 值设为 true。如果成功的话,v-like 组件将被隐藏,v-movie 组件将会显示

<!-- index.wxml -->

<view class="container">
<v-like hidden="{{hidden}}" carModel="SYLPHY" price="135000" sale="true"></v-like>
<v-movie wx:if="{{hidden}}" carModel="XTS" price="250000" sale="false"></v-movie>
</view> <!-- index.js --> Page({
data: {
dataA: "来自父组件index的数据",
dataB: true,
dataC: 2300,
hidden: true
}
})

v-like 组件加上 hidden 属性

<!-- like.wxml  -->

<view class="content" hidden='{{hidden}}'>
<view>v-like component</view>
<view class="title">共有data属性:</view>
<view>{{myBehaviorData1}}</view>
<view class="title">共有property属性:</view>
<view>型号: {{carModel}}</view>
<view>价格: {{price}}元</view>
<view>是否折扣:{{sale}}</view>
<view class="title">共有方法:</view>
<button bindtap="myBehaviorMethod">button</button>
</view> <!-- like.js --> properties: {
hidden: Boolean
},

v-movie 不加 hidden属性

<view class="content">
<view>v-movie component</view>
<view class="title">共有data属性:</view>
<view>{{myBehaviorData1}}</view>
<view class="title">共有property属性:</view>
<view>型号: {{carModel}}</view>
<view>价格: {{price}}元</view>
<view>是否折扣:{{sale}}</view>
<view class="title">共有方法:</view>
<button bindtap="myBehaviorMethod">button</button>
</view>

渲染结果:

结果和预期的一样,所以,要控制自定义组件的显示与隐藏,如果不考虑性能消耗的情况下,可以直接使用 wx:if;如果 hidden 更符合实际需求,可按如上方法来使用

示例代码:https://github.com/frwupeng517/wetchat-applet-behavior-

微信小程序 组件通信相关知识整理的更多相关文章

  1. 微信小程序必知相关知识

    微信小程序必知相关知识 1 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数 ...

  2. 微信小程序组件通信

    父子通信 在子组件的对应js中 properties:{ prop名字:数据类型, prop名字:{ type:数据类型, value:默认值 } } 在父组件的wxml模板中找到子组件标签 < ...

  3. 微信小程序组件通信入门及组件生命周期函数

    组件生命周期函数链接地址:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.h ...

  4. 微信小程序页面通信

    目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...

  5. 微信小程序组件设计规范

    微信小程序组件设计规范 组件化开发的思想贯穿着我开发设计过程的始终.在过去很长一段时间里,我都受益于这种思想. 组件可复用 - 减少了重复代码量 组件做为抽离的功能单元 - 方便维护 组件作为temp ...

  6. 微信小程序组件学习 -- 注册页面

    微信小程序组件使用手册地址: 1. 百度搜索"微信公众平台",扫码登录之后,点击帮助文档里面的普通小程序. 2. 接着选择"开发"-->"组件& ...

  7. 微信小程序入口场景的问题整理与相关解决方案

    前言 最近一段时间都在做小程序. 虽然是第二次开发小程序,但是上次做小程序已经是一年前的事了,所以最终还是被坑得死去活来. 这次是从零开始开发一个小程序,其实除了一些莫名其妙的兼容性问题,大多数坑点都 ...

  8. 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gc ...

  9. 微信小程序(应用号)资源汇总整理

    微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...

随机推荐

  1. js判断是否下拉刷新

    if(document.body.scrollTop + window.innerHeight>=document.body.clientHeight-10){ this.loadPointsL ...

  2. java原子操作的实现原理--转载

    原文地址:http://www.infoq.com/cn/articles/atomic-operation 1. 引言 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic ...

  3. 学习AD、DA的体会

    AD转换器的转换是指模拟信号输入转化为数字信号输出,而DA转换器是把数字信号转换为模拟信号,在ADC0832.TLC549和TLC5615程序设计中,通过使用中断服务函数每0.5s对ADC0832进行 ...

  4. XShell上传文件到Linux服务器上

    在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2:输入rz命令,看是否已经安装了lrzsz,如 ...

  5. vue-awesome-swiper 的使用

    第一步 :  cnpm i vue-awesome-swiper --save (已经安装淘宝镜像 / 否则用 npm) 第二部:  在main.js 中 导入: import VueAwesomeS ...

  6. 杨老师课堂_VBA学习教程之根据部门列创建工作表

    课件下载 : 方式1:本节课件下载地址:链接: https://pan.baidu.com/s/1rf5pRmZ95fjVbz70KYi6Aw 密码: q9yk 方式2:或点击此处下载 效果预览图: ...

  7. Git分支合并冲突解决(续)

    接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...

  8. JS中清空字符串前后空格

    在JS 操作的时候 长期会有对字符串的操作, 但是在JS 中不像在C#中 有字符串的方法 Trim() 来对字符串进行处理 .  所以自己写一个对字符串前后清楚空格的方法还是有必要的 以免以后忘记了 ...

  9. 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)

    !已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...

  10. 一个bug分析 ----------换个角度,有另外一个天地

    有个接口是按修改时间(updated_time)排序的 优化后,有人反馈接口的返回值有问题 查了一下,反馈的数据是推荐过的(推荐操作是会更新updated_time的). 然后就认为是有人进行了推荐操 ...