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. Effective C++ 读书笔记(39-45)

    条款三十九:明智而审慎的使用private继承 1.C++裁定凡是独立(非附属)对象都必须有非零大小. class Empty{};//没有数据,所以其对象应该不使用任何内存 class HoldAn ...

  2. 用Python+qrcode库创建一个包含信息的二维码

    安装qrcode库和PIL库 在命令行中分别输入pip install qrcode 和pip install pillow 导入库格式如下: import PIL import qrcode 下面以 ...

  3. 创建servlet的三种方式

    第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...

  4. Spring Boot实战笔记(六)-- Spring高级话题(多线程)

    一.多线程 Springt通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中 ...

  5. String的lastIndexOf()用于获取字符串中某个子字符串最后一次出现的位置

    String还定义有lastIndexOf(String str,int from) 意思为str在字符串多次出现时将返回最后一次出现的位置. eg: String str = "I can ...

  6. linux常用的时间获取函数(time,gettimeofday,clock_gettime,_ftime,localtime,strftime )

    time()提供了秒级的精确度 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒 ...

  7. Oracle-01:基础命令小结

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 记录一下我的Oracle学习之路,详细的安装教程忙完这俩天会认真总结一版 本次记录这次学习cmd基础命令 一, ...

  8. Python题库

    Date:2018-05-08 1.Given: an array containing hashes of names Return: a string formatted as a list of ...

  9. Oauth2.0 用Spring-security-oauth2

    客户端通过appId,redirectUrl,在open platform打开的页面上填写正确的用户名和密码后,open platform验证通过后,会跳转到redirectUrl,此时的redire ...

  10. dva/docs/GettingStarted.md

    进入目录安装依赖: npm i 或者 yarn install开发: npm run dev npm install 太慢,试试yarn吧.建议用npm install yarn -g进行安装. Co ...