微信小程序 组件通信相关知识整理
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- ...
随机推荐
- Ubuntu命令操作
1../ 当前路径2.ls 列举当前路径下的所有文件及文件夹 默认情况不显示隐藏文件 ls -a 显示隐藏文件 ls -lah h是文件大小 l是显示文件3.cd 跳转路径4.pwd 查看当前所在路径 ...
- JSON Patch
1.前言 可以这么说的是,任何一种非强制性约束同时也没有"标杆"工具支持的开发风格或协议(仅靠文档是远远不够的),最终的实现上都会被程序员冠上"务实"的名头,而 ...
- mint-ui之picker爬坑记
picker的数据来源为动态获取时,数据无法正常渲染!因为方法不对,所以坑大了!深刻地体会到'业不精,我之过',谨以此文,深刻地记录一下踩坑及爬坑的整个过程,以便日后不再入坑,也给后来者提供一下参考 ...
- laravel5.5 延时队列的使用
队列这个知识相对比较冷门,因为平时的CURD基本用不到这个知识,今天用到了,所以就写个博客记录一下吧. 首先你得清楚要用什么驱动,除了database队列驱动(选择database驱动要php art ...
- sqlilabs 1-4
near '1' --+ ' LIMIT 0,1 ?id=999' union select 1,database(),5 --+ 当前数据库?id=999' union select 1,user( ...
- nginx常用配置系列-静态资源处理
接上篇,nginx处理静态资源的能力很强,后端服务器其实也可以处理静态资源,比如tomcat,但把非业务类的单一数据交给后端处理显然效率比较低,还有一种场景是多个站点公用一套资源集时,通过nginx可 ...
- PAT1132: Cut Integer
1132. Cut Integer (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Cutting a ...
- 【Python 】selenium 简介
从源码中可以找到selenium 2.48.0支持的浏览器如下: [python] view plain copy Firefox Chrome ChromeOptions Ie Edge Opera ...
- (二)Linux下的crontab定时执行任务命令详解
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为&qu ...
- Linux下解压后缀名为".tar.xz"的文件
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=576 1 解压".xz" xz -d your_file_name.tar.xz 注:运行上述命令后 ...