wepy —— 组件之间通信
一、props
1、静态传值 —— 父组件向子组件传递常量数据
// 父组件
<coma fruitName="橘子"></coma> // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: String
}
onLoad(){
console.log(this.fruitName); // 橘子
}
效果:

分析数据改变的情况:
此时没什么可说的,子组件改变了父组件传过来的值,也只会在子组件中表现出来。
比如在子组件内设置一个定时器,1.5秒后改变父组件传过来的值 fruitName,
// 父组件
// html
<coma :fruitName="myFruit"></coma> // js
data = {
myFruit:'梨子'
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: String
}
onLoad(){
console.log(this.fruitName); // 梨子
setTimeout(() => {
this.fruitName = "香蕉";
this.$apply();
}, 1500)
}
效果:

2、动态传值 —— 将父组件动态的数据传递给子组件
// 父组件
// html
<coma :fruitName="myFruit"></coma> // js
data = {
myFruit: '梨子'
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: String
}
onLoad(){
console.log(this.fruitName); // 梨子
}
效果:

分析数据改变的情况:
此时绑定的数据也是互不影响的,比如父组件传了动态的值 myFruit 给子组件,但同时父组件中自己也使用了 myFruit ,并且父组件中设置一个定时器,1.5秒后改变 myFruit ,这种操作,会影响到子组件已经接收到的 fruitName
吗。答案是不会的。只会影响到父组件自己。同理。3秒后,子组件中的一个定时器改变父组件中传递过来的 fruitName
,此时也是只会影响到子组件本身,不会影响到父组件中原有的 myFruit 。
// 父组件
// html
<view class="mb20">我是父组件中的值 —— {{myFruit}}</view>
<coma :fruitName="myFruit"></coma> // js
data = {
myFruit:'梨子'
}
onShow(){
setTimeout(() => {
this.myFruit = "西瓜";
this.$apply();
}, 1500)
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> //js
props = {
fruitName: String
}
onLoad(){
console.log(this.fruitName); // 梨子
setTimeout(() => {
this.fruitName = "香蕉";
this.$apply();
}, 3000)
}
效果:

3、动态传值 —— .sync(父组件中动态数据的更改将影响到子组件)
可以通过 .sync 修饰符来进行动态绑定,这种情况下,父组件中更改原始值将反应到子组件,但是子组件中改变数据不能影响到父组件。
还是上面的那个例子,只是在父组件中使用子组件时绑定动态数据时使用了修饰符 .sync。
// 父组件
// html
<view class="mb20">我是父组件中的值 —— {{myFruit}}</view>
<coma :fruitName.sync="myFruit"></coma> // js
data = {
myFruit:'梨子'
}
onShow(){
setTimeout(() => {
this.myFruit = "西瓜";
this.$apply();
}, 1500)
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: {
type: String,
default: null
}
}
onLoad(){
console.log(this.fruitName); // 梨子
setTimeout(() => {
this.fruitName = "香蕉";
this.$apply();
}, 3000)
}
效果:

4、动态传值 —— twoWay: true(子组件中把传递过来的数据改变将影响到父组件原始数据)
可以通过设置子组件props的 twoWay:true 来动态绑定,这种情况下,子组件中对 props 的更改将反应到父组件,但是父组件中改变数据不能影响到子组件。
还是 2 那个例子,只是在子组件的props里加了twoWay:true。
// 父组件
// html
<view class="mb20">我是父组件中的值 —— {{myFruit}}</view>
<coma :fruitName="myFruit"></coma> // js
data = {
myFruit:'梨子'
}
onShow(){
setTimeout(() => {
this.myFruit = "西瓜";
this.$apply();
}, 1500)
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: {
type: String,
default: null,
twoWay: true
}
}
onLoad(){
console.log(this.fruitName); // 梨子
setTimeout(() => {
this.fruitName = "香蕉";
this.$apply();
}, 3000)
}
效果:

5、动态传值 —— 同时使用 .sync 和 twoWay:true进行父子组件中数据双向绑定
这种情况,父组件把动态值传递给子组件,在父组件中改变了原始数据,子组件也会变,子组件中将props改变,父组件也会受到影响。
// 父组件
// html
<view class="mb20">我是父组件中的值 —— {{myFruit}}</view>
<coma :fruitName.sync="myFruit"></coma> // js
data = {
myFruit:'梨子'
}
onShow(){
setTimeout(() => {
this.myFruit = "西瓜";
this.$apply();
}, 1500)
} // 子组件
// html
<button type="primary" plain="true">{{fruitName}}</button> // js
props = {
fruitName: {
type: String,
default: null,
twoWay: true
}
}
onLoad(){
console.log(this.fruitName); // 梨子
setTimeout(() => {
this.fruitName = "香蕉";
this.$apply();
}, 3000)
}
效果:

二、$broadcast —— 父组件给子组件传递值
子组件中在events中定义好事件并接收值:
// html
<button type="primary" plain="true">{{fruitA}}</button>
<button type="warn" plain="true">{{fruitB}}</button> // js
data = {
fruitA: '',
fruitB: ''
}
events = {
'some-event': (a, b) => {
this.fruitA = a;
this.fruitB = b;
}
}
父组件触发事件并传递值:
onShow(){
this.$broadcast('some-event', '栗子', '柠檬');
}
效果:

三、$emit —— 子组件传值给父组件
父组件中在events中定义好事件并接收值:
events = {
'some-event': (a, b) => {
console.log(a); // 橘子
console.log(b); // 苹果
}
}
子组件触发事件并传递值:
onLoad(){
this.$emit('some-event', '橘子', '苹果');
}
四、$invoke —— 一个页面或组件对另一个组件中的方法的直接调用
子组件中定义好事件,并接收参数。
methods = {
sayHi(user){
console.log(`${user}好,我是组件A中的事件。`); // jack好,我是组件A中的事件。
}
}
某个页面或者组件触发事件并传递值
onShow(){
this.$invoke('coma', 'sayHi', 'jack');
}
五、组件自定义事件处理函数 (子组件传递数据给父组件)
使用方法如下
// 父组件
// html
<button type="warn" plain="true" wx:if="{{fruitA}}">{{fruitA}}</button>
<coma @childFn.user="parentFn"></coma> // js
data = {
fruitA: ""
}
methods = {
parentFn(fruit, evt){
console.log(`我是来自子组件的水果:${fruit}` ); // 我是来自子组件的水果:柠檬
this.fruitA = fruit;
}
} // 子组件
// html
<button type="primary" plain="true" @tap="tap">苹果</button> // js
onLoad(){
this.$emit('childFn', "柠檬");
}
效果:

注意:如果用了自定义事件,则 events 中对应的监听函数不会执行。
wepy —— 组件之间通信的更多相关文章
- 【Vue课堂】Vue.js 父子组件之间通信的十种方式
这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...
- vue组件之间通信传值
原文链接:https://blog.csdn.net/lander_xiong/article/details/79018737 我认为这位博主的这篇文章写的非常详细,通俗易懂, 我们这次的vue项目 ...
- Vue2.0组件之间通信(转载)
Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...
- React生命周期, 兄弟组件之间通信
1.一个demo(https://www.reactjscn.com/docs/state-and-lifecycle.html) class Clock extends React.Componen ...
- 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些
VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...
- React 组件之间通信 All in One
React 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 props 2. 兄弟组件之间通信 3. 跨多层级的组件之间通信 Context API https://react ...
- Vue 组件之间通信 All in One
Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...
- Vue2.0组件之间通信
Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...
- vue组件之间通信总结(超详细)
组件通信在我们平时开发过程中,特别是在vue和在react中,有着举足轻重的地位.本篇将总结在vue中,组件之间通信的几种方式: props.$emit $parent.$children $attr ...
随机推荐
- Effective Modern C++ 条款4:掌握查看型别推导结果的方法
采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某 ...
- linux上源码安装python
Linux安装Python2.7 以下例子基于python 2.7.9,其他版本同理.# 1.下载python# wget https://www.python.org/ftp/python/2.7. ...
- 专访阿里云资深技术专家黄省江:中国SaaS公司的成功之路
笔者采访中国SaaS厂商10多年,深感面对获客成本巨大.产品技术与功能成熟度不足.项目经营模式难以大规模复制.客户观念有待转变等诸多挑战,很多中国SaaS公司的经营状况都不容乐观. 7月26日,阿里云 ...
- 威胁快报|ProtonMiner挖矿蠕虫扩大攻击面,加速传播
背景 近日,阿里云安全监测到一种挖矿蠕虫,正在互联网上加速传播.阿里云安全根据它使用ProtonMail邮箱地址作为矿池用户名的行为,将其命名为ProtonMiner.据分析,这种蠕虫与TrendMi ...
- UVA10905 Children's Game
题意:给定n个正整数,把它们连接成一个最大的整数.比如,123,124,556,90有24种连接方法,最大的结果为9 056 124 123. 贪心.一开始就想用string水过.注意不能直接用str ...
- CI框架 - Xhprof性能监控,用钩子hooks实现
安装Xhprof参考:http://www.cnblogs.com/qq917937712/p/8889001.html 第一步:配置config.php $config['enable_hooks' ...
- 项目中的那些事---下载pdf文件
最近做了一个下载pdf文档的需求,本以为使用HTML5中<a>标签的属性download就能简单搞定,不料IE竟然不支持这一简单粗暴的H5新特性,而是直接在网页中打开, 于是各种搜索之后得 ...
- WAP网站的推广方式(自整合篇)
WAP网站推广随着无线互联时代的到来,已经日益受到大家的重视.虽然WAP网站的目前盈利模式还不是很清晰,但WAP网站推广的竞争强度将肯定会越来越激烈,下面和大家一起探讨下WAP网站的推广方法. 方法/ ...
- 引入样式表(css)的四种方式
一.使用style属性: 将style属性直接加在html标签里. <标签 style="属性1: 设定值1; 属性2: 设定值2; "> 例如: <td sty ...
- linux如何将分组权限置为空
两种方法 方法一:使用-符号 chmod g=- monkey.py#可以单独指定一个 方法二:简写方式,用0表示 chmod 740 monkey.py#必须同时指定三个的权限