uniapp - props、 ref、$emit、$parent、$child

举个例子来解释一下何为父组件,何为子组件?

index.vue导入sunui-cell组件的时候,我们就称index.vue为父组件依次类推,在vue中只要能获取到组件的实例,那么就可以调用组件的属性或是方法进行操作

一、props(一般用来单向传值)

1. 何为单向传值?

即父组件传值给子组件(首次)但不能动态(再次)改变子组件现有的值,但我非要改呢? 通过watch监听或者通过$ref标识获取实例后修改。

2.props静态传值

子组件通过props选项来声明一个自定义的属性,然后父组件就可以在嵌套标签的时候,通过这个属性往子组件传递数据 - 引用脚本之家

3. props动态传值

通过v-bind绑定props的自定义的属性,传递去过的就不是静态的字符串了,它可以是一个表达式、布尔值、对象等等任何类型的值 - 引用脚本之家

4. props最适合传递数据,它并不能调用子组件里的属性和方法

二、$ref

1.不大适合传递数据

主要用来调用子组件里的属性和方法

2. 通常是初始化页面(也就是视图层渲染完以后)才能调用

如果是初始化的话建议在mounted生命周期或者使用this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行(但我们首先得标识ref,相同组件ref的值如果重复会被后面的组件覆盖),如果不是初始化的话必须要等待它加载完以后才能够调用(this.nextTick)

三、$emit

1. $emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数

四、$on(非父组件之间传值)

1.父组件需要导入A和B组件

<template>
	<view class="content">
		<view style="padding: 12px 15px;">
			点击hover效果
		</view>
		<onA></onA>
		<onB></onB>
	</view>
</template>

<script>
	import onA from ‘@/components/onA.vue‘;
	import onB from ‘@/components/onB.vue‘;
	export default {
		data() {
			return {
				title: ‘Hello‘
			}
		},
		components: {
			onA,
			onB
		},
		onLoad() {
		},
		mounted() {
		},
		methods: {

		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

2. onA组件

<template>
	<view>
		<button type="primary" @click="onSend">传值给onB组件</button>
	</view>
</template>

<script>
	import bridge from ‘@/utils/bridge.js‘;
	export default {
		data() {
			return {
				msg: ‘hello,onB‘
			};
		},
		methods: {
			onSend() {
				bridge.$emit(‘receiveA‘, this.msg);
			}
		},
		mounted() {
			bridge.$on(‘receiveB‘, (val) => {
				console.log(‘我是onA组件,接收来自onB的值:‘, val);
			});
		}
	}
</script>

<style>

</style>

 

3.onB组件

<template>
	<view>
		<button type="primary" @click="onSend">传值给onA组件</button>
	</view>
</template>

<script>
	import bridge from ‘@/utils/bridge.js‘;
	export default {
		data() {
			return {
				msg: ‘hello,onA‘
			};
		},
		methods: {
			onSend() {
				bridge.$emit(‘receiveB‘, this.msg);
			}
		},
		mounted() {
			bridge.$on(‘receiveA‘, (val) => {
				console.log(‘我是onB组件,接收来自onA的值:‘, val);
			});
		}
	}
</script>

<style>

</style>

4.bridge.js

import Vue from ‘vue‘
export default new Vue()

五、$parent(用于子组件获取父组件实例) - 当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己

六、$child - 当前实例的直接子组件。需要注意 $children 并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源

<template>
	<view class="content">
		<view style="padding: 12px 15px;">
			点击hover效果
		</view>
		<onA></onA>
		<onB></onB>
	</view>
</template>

<script>
	import onA from ‘@/components/onA.vue‘;
	import onB from ‘@/components/onB.vue‘;
	export default {
		data() {
			return {
				title: ‘Hello‘
			}
		},
		components: {
			onA,
			onB
		},
		onLoad() {
		},
		mounted() {
			console.log(this.$root.$children[0].$children[0]._data);
			console.log(this.$root.$children[0].$children[1]._data.msg);
			console.log(this.$root.$children[0].$children[2]._data.msg);
		},
		methods: {

		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

  

七、$set - 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的

1.运行这个示例时,我们发现对象新增的属性(e)是不会更新

<template>
	<view>
		<view @click="addd(obj)">点击增加1:{{obj.d}}</view>
		<view @click="adde(obj)">点击增加2:{{obj.e}}</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				obj: {}
			}
		},
		mounted() {
			// 原有的
			this.obj = {
				d: 0
			};
			// 新增的对象.e
			this.obj.e = 0;
			console.log(‘after--‘, this.obj);
		},
		methods: {
			addd(item) {
				item.d = item.d + 1;
				console.log(‘item--1‘, item);
			},
			adde(item) {
				item.e = item.e + 1;
				// this.$forceUpdate();
				console.log(‘item--2‘, item);
			}
		}
	}
</script>

  

2. 我们有两种解决方案,一种是利用this.$set或者this.$foreUpdate();让它渲染到视图层 - 代码引用简书:https://www.jianshu.com/p/71b1807b1815

<template>
	<view>
		<view @click="addd(obj)">点击增加1:{{obj.d}}</view>
		<view @click="adde(obj)">点击增加2:{{obj.e}}</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				obj: {}
			}
		},
		mounted() {
			// 原有的
			this.obj = {
				d: 0
			};
			// 新增的对象.e
			// this.obj.e = 0;
			this.$set(this.obj, ‘e‘, 0);
			console.log(‘after--‘, this.obj);
		},
		methods: {
			addd(item) {
				item.d = item.d + 1;
				console.log(‘item--1‘, item);
			},
			adde(item) {
				item.e = item.e + 1;
				// this.$forceUpdate();
				console.log(‘item--2‘, item);
			}
		}
	}
</script>

  

理清一下已经使用过的vue实例,可能会再次更新(-.-)

原文地址:https://www.cnblogs.com/cisum/p/12195515.html

时间: 2024-10-07 06:54:16

uniapp - props、 ref、$emit、$parent、$child的相关文章

React 事件对象、键盘事件、表单事件、ref获取dom节点、react实现类似Vue双向数据绑定

1.案例实现代码 import React, { Component } from 'react'; /** * 事件对象.键盘事件.表单事件.ref获取dom节点.react实现类似Vue双向数据绑定 * 事件对象: 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息 * 表单事件: 获取表单的值 * 1.监听表单的改变事件 ---onChange * 2.在改变的事件里面获取表单输入的值 ---event * 3.把表单输入的值赋值给username

C# 基础(一) 访问修饰符、ref与out、标志枚举等等

C# 基础(一) 访问修饰符.ref与out.标志枚举等等 一.访问修饰符 在C#中的访问修饰符有:private.protected.internal.public public:公共类型,同一程序集或其他程序集都可以访问此成员 private:私有类型,同一类里或结构里才可以访问此成员 protected:保护类型,同一类里或者派生类中才可以访问此成员 internal:内部类型,只有在同一程序集才可以访问此成员 访问性不一致:子类的访问权限不能比父类高.防止暴露父类的信息.. 二.stat

固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符串型(string)Convert.ToDateTime() 转换为日期型(datetime)Convert.ToDouble() 转换为双精度浮点型(double)Conert.ToSingle() 转换为单精度浮点型(float) 二.运算符算术运算符 + - * / %逻辑运算符 & | ^

C#之out修饰符、ref修饰符、params修饰符的简单介绍

一.out修饰符 1.调用一个带有输出参数的方法也需要使用out 修饰符,但是作为输出变量传递的本地变量在将他们作为输出变量传递前不需要赋值(因为调用后会改变或丢失),编译器允           许你传递未分配的数据,原因是在于所调用的方法内部必须包含这种变量的数据分配. 2.一个很有用的用途,就是调用一次方法返回多个返回值     static void Add(out int x, out int y, out int ans) { x = 1; y = 2; ans = x + y; }

论asp.net out、ref、return

论asp.net out.ref.return ref(引用类型) ref引用类型进出都必须赋值,赋值后会改变类型原来的指针. out(值类型) out值类型进可以不赋值,出必须赋值. return(返回函数类型) return必须返回函数对应的类型. ref实例: protected void Page_Load(object sender, EventArgs e) { string s = "原指针"; str(ref s); Response.Write(s); //结果:新的

黑马程序员_浅谈out参数、ref参数和可变参数

1.out参数 out关键字会导致参数通过引用来传递,通俗点说,就是往外传值的. out参数的作用:用于以内部变量为外部变量赋值的,out一般适用于某个方法不只是使用return返回单个值,而是需要有多个返回值的情况. out参数的使用需要注意以下几点:  1)out参数传递的变量在传递之前不需要对其进行初始化. 分析:在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,不过反正都是要在调用时被覆盖掉,所以大可不必赋值,因为赋值了虽然不会报错,但却根本也没有用处,没必要多此一举

C# 方法的out、ref、params参数

一.out参数实例 [实例]求一个数组中的最大值.最小值.总和.平均值 class Program { static void Main(string[] args) { //写一个方法 求一个数组中的最大值.最小值.总和.平均值 int[] nums = { 1, 2, 3, 4, 5, 6 ,7}; int max; int sum; int min; int avg; bool b; string s; double d; GetValue(nums, out max, out min,

vue03----生命周期、nextTick()、ref、filter、computed、vue中异步请求渲染问题(swiper不轮播)(在开发过程中遇到什么问题、踩过的坑)

### 1.vue的组件和实例都有生命周期,而且是一样的 生命周期:(组件从创建到销毁的过程) 创建 挂载 更新 销毁 组件到达某一个阶段就会自动触发某一些函数,这个函数就叫生命周期的钩子函数. 创建:组件创建的时候触发 beforeCreate created     组件刚创建的数据请求 挂载:创建完成挂载前后触发 beforeMount mounted     DOM的初始化操作 更新:数据发生改变的时候触发 beforeUpdate updated     数据的变化监听,尽量不要在这里

PHP. 02&#174;. Ajax异步处理、常见的响应状态、XMLHttpRequest对象及API、ajax的get/post方法、

异步对象 a)创建异步对象 b)设置请求的url等参数 c)  发送请求 d)注册时间 e)在注册的事件中获取返回的内容并修改页面显示的内容 布尔类型不能直接用echo输出 常见的响应状态 Ajax概念 在浏览器中,我们也能够不刷新页面,通过ajax的方式去获取一些新的内容,类似网页有微博,朋友圈,邮箱等 单词解释: Asynchronous Javascript And XML(异步JavaScript和XML), 他并不是凭空出现的新技术,而是对于现有技术的结合:核心是js对象XMLHttp