微信小程序 组件通信相关知识整理
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 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数 ...
- 微信小程序组件通信
父子通信 在子组件的对应js中 properties:{ prop名字:数据类型, prop名字:{ type:数据类型, value:默认值 } } 在父组件的wxml模板中找到子组件标签 < ...
- 微信小程序组件通信入门及组件生命周期函数
组件生命周期函数链接地址:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.h ...
- 微信小程序页面通信
目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...
- 微信小程序组件设计规范
微信小程序组件设计规范 组件化开发的思想贯穿着我开发设计过程的始终.在过去很长一段时间里,我都受益于这种思想. 组件可复用 - 减少了重复代码量 组件做为抽离的功能单元 - 方便维护 组件作为temp ...
- 微信小程序组件学习 -- 注册页面
微信小程序组件使用手册地址: 1. 百度搜索"微信公众平台",扫码登录之后,点击帮助文档里面的普通小程序. 2. 接着选择"开发"-->"组件& ...
- 微信小程序入口场景的问题整理与相关解决方案
前言 最近一段时间都在做小程序. 虽然是第二次开发小程序,但是上次做小程序已经是一年前的事了,所以最终还是被坑得死去活来. 这次是从零开始开发一个小程序,其实除了一些莫名其妙的兼容性问题,大多数坑点都 ...
- 【腾讯Bugly干货分享】打造“微信小程序”组件化开发框架
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2nQzsuqq7Avgs8wsRizUhw 作者:Gc ...
- 微信小程序(应用号)资源汇总整理
微信小应用资源汇总整理 开源项目 WeApp - 微信小程序版的微信 wechat-weapp-redux-todos - 微信小程序集成Redux实现的Todo list wechat-weapp- ...
随机推荐
- Dynamic 中修改实体中主字段的长度
select EntityId,* from MetadataSchema.Entity where Name='dji_incidentaddress' SELECT TOP 100 [Attrib ...
- Surface pro 4 使用心得
今天谈谈这几个月Surface pro 4的使用心得.这篇后面有点跑题,行文也比较随意,就当闲笔了. 设备简述 使用体验 优点 不足 优雅使用 系统界面 应用 系统应用 工具应用 生产工具 其他应用 ...
- ruby klb.rb irb
1.字符串格式化 Python "%s=%s" % (k, v) 在阅读 Python 字符串格式化的时候,视线先看到字符串的 %s 字样,但是不知道这指的是什么,然后看后面的变量 ...
- tomcat第一次使用正常启动后访问8080端口报404错误
问题:tomcat第一次使用正常启动后访问8080端口报404错误 解决办法:双击tomcat调出tomcat的xml文件页面,Server Locations 默认是选第一行即Use Workspa ...
- 【转】MySQL datetime数据类型设置当前时间为默认值
转自http://blog.csdn.net/u014694759/article/details/30295285 方法一: MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认 ...
- 搭建Hadoop完全分布式
Centos7搭建hadoop完全分布式 虽然说是完全分布式,但三个节点也都是在一台机器上.拿来练手也只能这样咯,将就下.效果是一样滴.这个我自己都忘了步骤,一起来回顾下吧. 必备知识: Linux基 ...
- How to set spring boot active profiles with maven profiles
In the previous post you could read about separate Spring Boot builds for a local development machin ...
- java之集合Collection 3个例子
package cn.itcast_01; import java.util.ArrayList; import java.util.Collection; /* * 集合的由来: * 我们学习的是面 ...
- ZooKeeper入门搭建教程
http://www.wxdl.cn/cloud/zookeeper-build.html 本文是ZooKeeper的快速搭建,旨在帮助大家以最快的速度完成一个ZK集群的搭建,以便开展其它工作.本方不 ...
- 2. 引入springmvc
springboot提供了spring-web-starter-web为web开发提供了支持,并且内嵌了tomcat及spring mvc的依赖,而且通过spring-boot-autoconfigu ...