微信小程序 组件通信相关知识整理
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- ...
随机推荐
- angular2 安装 打包成发布项目过程
安装之前要有typings和typescript全局已经安装好 安装命令新版为npm install -g @angular/cli 原来的angular-cli为老版的,我安装失败了 安装之后新建一 ...
- NGINX按天生成日志文件的简易配置
NGINX按天生成日志文件的简易配置 0x01 最近后端童鞋遇到一个小需求,拆分nginx生成的log文件,最好是按天生成,看着她还有很多bug待改的状态,我说这个简单啊,我来吧.曾经搞node后端的 ...
- 杨校老师课堂之JavaScript右下角广告弹框教程
案例制作思路: 1.先制作界面 添加一个盒子包含一个按钮,使盒子绝对定位在右上角 添加一个大盒子,同理,将盒子居于左下角:其中内部包含一个顶端盒子和底部盒子 顶端盒子因为是属于大盒子内部的存在,所以宽 ...
- 小隐隐于野:基于TCP反射DDoS攻击分析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯DDoS安全专家.腾讯云游戏安全专家 陈国 0x00 引言 近期,腾讯云防护了一次针对云上某游戏业务的混合DDoS攻击.攻击持续了 ...
- Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照
前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...
- String的trim()用于去掉字符串前后的空格
String的trim()可以去掉字符串的前导和后继字符串,即去掉字符串前面和后面的空格. eg:String userName = " good man "; System.ou ...
- Go笔记之一:工程项目结构的注意事项
Go笔记之一:工程项目结构的注意事项 对 Go 项目目录的理解 (Windows平台为例) 刚安装完的 Go 需要设定环境变量,最关键的环境变量有三个,GOROOT.GOPATH和GOBIN.GORO ...
- 关于TCP/IP,必知必会的十个经典问题[转]
关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...
- Linux kernel的中断子系统之(八):softirq
返回目录:<ARM-Linux中断系统>. 总结:中断分为上半部和下半部,上半部关中断:下半部开中断,处理可以延迟的事情.下半部有workqueue/softirq/tasklet三种方式 ...
- python3中使用builtwith的方法(很详细)
1. 首先通过pip install builtwith安装builtwith C:\Users\Administrator>pip install builtwith Collecting b ...