vue 父子组件传值

vue 父子组件传值父子组件传值最常用的方法(4种)1.父组件传递数据给子组件(props)vue官方文档特别注意!!特别注意!!特别注意!!props传值的类型如果是Object类型,如对象,数组等,传递过去的是地址,在子组件中修改这些数据,会连带的把父组件中的值一并修改,强烈建议在子组件中深拷贝之后再使用这些值。然后使用$emit的形式,将修改好的值再传递给父组件,这样数据就会以一种单向的,可预测的形式进行修改(如果不深拷贝,会造成数据被修改后,很难找到修改源头,非常恶心)父组件父组件,定义变量tes

大家好,又见面了,我是你们的朋友全栈君。

父子组件传值 最常用的方法(4种)

在这里插入图片描述

1 . 父组件 传递数据 给子组件(props)vue官方文档

特别注意!!特别注意!!特别注意!!
props传值的类型如果是Object类型,如对象,数组等,传递过去的是地址,在子组件中修改这些数据,会连带的把父组件中的值一并修改,强烈建议在子组件中深拷贝之后再使用这些值。然后使用$emit的形式,将修改好的值再传递给父组件,这样数据就会以一种单向的,可预测的形式进行修改(如果不深拷贝,会造成数据被修改后,很难找到修改源头,非常恶心)

父组件
父组件,定义变量testText,将这个变量传递给子组件
:testText表示:子组件那边用testText这个变量接收(这个可以随便怎么命名)
后面这个testText表示:父组件要传给子组件的变量testText

<template>
	<div>
		parent-one
		<childOne :testText="testText"></childOne>
	</div>
</template>
<script> import childOne from "../components/child-one"; export default { 
     data() { 
     return { 
     testText: "这是一段传给子组件的文字", }; }, components: { 
     childOne, }, }; </script>

子组件
子组件使用props接收,父组件传递过来的数据
props的使用灵活性非常高

1.可以是数组(多个值,用逗号,隔开)

props: ["testText"],

2.可以是对象(多个值,用逗号,隔开)

props: { 
   
	testText: String,
	// testText: [String, Array],
	// testText: String || Array,
},

3.可以是对象,且对象属性也可以是对象,在对象中定义多种限制属性
type包括String Number Boolean Array Object Date Function Symbol

props: { 
   
	testText: { 
   
		type: String,
		default: "123",
		validator: (value) => { 
   
			return ["success", "warning", "danger"].indexOf(value) !== -1;
		},
	},
},
<template>
	<div>
		{ 
   { 
   this.testText}}
	</div>
</template>

<script>
export default { 
   
	data() { 
   
		return { 
   };
	},
	props: { 
   
		testText: { 
   
			type: String,
			default: "123",
			validator: (value) => { 
   
				return ["success", "warning", "danger"].indexOf(value) !== -1;
			},
		},
	},
};
</script>

2 . 在父组件中使用 $refs 调用子组件中的方法

步骤
1 . 给子组件定义一个ref属性,并命名
2 . this.$refs.属性名.子组件方法()的形式调用,也可以向子组件函数中传递参数
(需要注意的是,如果子组件使用了v-for,那么this.$refs会得到一个数组)

父组件

<template>
	<div>
		parent-one
		<button @click="handle_parent">触发子组件事件</button>
		<childOne ref="childOne"></childOne>
	</div>
</template>
<script>
import childOne from "../components/child-one";
export default { 
   
	methods: { 
   
		handle_parent() { 
   
			const arr = [1, 2, 3];
			this.$refs.childOne.handle_child_one(arr);
		},
	},
	components: { 
   
		childOne,
	},
};
</script>

子组件

<template>
	<div></div>
</template>

<script>
export default { 
   
	methods: { 
   
		handle_child_one(value) { 
   
			console.log("子组件child_one中的事件被触发了");
		},
	},
};
</script>

3 . 父组件使用 $children 调用子组件中的方法

注意:this.$children获取的是子组件数组

如果父组件中只定义了一个子组件,那么要使用this.$children[0].子组件方法()调用子组件中的方法
如果父组件中定义了多个子组件,【$children并不保证顺序,也不是响应式的】

而且如果一个父组件中,注册了很多个子组件的话,使用数组下标的方式定位子组件,会造成代码理解成本高,难以维护等问题,所以个人感觉这个方法比较鸡肋

<template>
	<div>
		parent-one
		<button @click="handle_parent">触发子组件事件</button>
		<childOne ref="childOne"></childOne>
    	<childTwo></childTwo>
	</div>
</template>
<script>
import childTwo from "../components/child-two";
import childOne from "../components/child-one";
export default { 
   
	methods: { 
   
		handle_parent() { 
   
			this.$children[0].handle_child_one();
		},
	},
	components: { 
   
    	childTwo,
		childOne,
	},
};
</script>

4 . 子组件使用 $parent 调用父组件中的函数或者属性

在这里插入图片描述
$children不同,$parent获取的不是数组,而是一个父组件实例
因为:父组件中可以有很多个不同子组件
但是:子组件在同一个父组件中,只能存在一个,或者说一种,无论v-for多少个子组件,这些子组件都还是在同一个父组件中,所以在哪个父组件中引入子组件,$parent直接就指向该父组件
(所以形式上,$parent要比$children好用)

子组件

<template>
	<div>
		这是子组件1
    <button @click="handle_parent">调用父组件</button>
	</div>
</template>

<script>
export default { 
   
	methods: { 
   
    handle_parent(){ 
   
      // 调用父组件中的 apply_children 函数
      this.$parent.apply_children()
    }
	},
};
</script>

而且因为this.$parent是直接获取父组件实例,所以可以通过this.$parent.父组件属性||父组件方法直接修改父组件中data中的值

5 . 子组件使用 $emit 调用父组件中的方法

老生常谈,没啥花里胡哨的,就是一个 子组件 向 父组件 通讯的方法
在这里插入图片描述
有两个参数,一个是 【父组件的函数名】(准确说不是父组件函数名,而是子组件在父组件中定义在子组件身上的函数名,文字比较绕,看代码吧),另一个是要传递给父组件的【参数】,注意看官方文档,函数名是个字符串,记得带上引号

父组件

<template>
	<div>
		parent-one
		// 这个 @apply-children 就是子组件需要触发的事件
		<childOne ref="childOne" @apply-children="testchildren"></childOne>
	</div>
</template>
<script>
import childOne from "../components/child-one";
export default { 
   
	methods: { 
   
		testchildren(value) { 
   
			console.log("父组件parent-one中的方法被调用了");
			console.log("子组件传过来的参数:" + value);
		},
	},
	components: { 
   
		childOne,
	},
};
</script>

子组件

<template>
	<div>
		这是子组件1
		<button @click="handle_parent">调用父组件</button>
	</div>
</template>

<script>
export default { 
   
	methods: { 
   
		handle_parent() { 
   
			this.$emit("apply-children",'123');
		},
	},
};
</script>
$emit $parent
子组件向父组件通讯 子组件向父组件通讯
父子通讯常用(推荐使用) 访问组件的应急方法(应急使用)
父子通讯常用(推荐使用) 该子组件定义在多个父组件中时,虽然vue知道定义在哪个父组件,但是开发人员不是很清楚,不利于代码的维护,且 访问组件之外的上下文违反了基于模块开发的第一原则,所以我们要尽量避免使用$parent
$emit 需要触发绑定函数,子组件需要绑定一个供触发的函数 不需要任何绑定,本质是直接获取父组件实例,可以直接调用父组件中的函数、属性

6 . 子(孙)组件使用 $attr 获取父(子)组件传递过来的参数

在这里插入图片描述
使用场景:父、子、孙三个组件相继传值,父组件希望把值传给孙子组件,但是又不想向vuex里面添加数据时使用(当然,父子组件传值也是可以用的)

父组件
在父组件中定义两个变量,分别传给子组件,孙子组件

<template>
	<div>
		parent-one
		<childOne :parent_to_child="parent_to_child" :parent_to_grand="parent_to_grand"></childOne>
	</div>
</template>
<script>
import childOne from "../components/child-one";
export default { 
   
	data() { 
   
		return { 
   
			parent_to_child: "这是一段父组件传递给子组件的数据",
			parent_to_grand: "这是一段父组件传递给子组件的数据",
		};
	},
	components: { 
   
		childOne,
	},
};
</script>

子组件
在子组件中打印一下this.$attrs

<template>
	<div>
		这是子组件1
		<grandOne v-bind="$attrs"></grandOne>
	</div>
</template>

<script>
import grandOne from "./componentsGrand/grand-one";
export default { 
   
	mounted() { 
   
		console.log(this.$attrs);
	},
	components: { 
   
		grandOne,
	},
};
</script>

在这里插入图片描述
注意:根据官方文档,这里有个注意点用大白话说就是,this.$attrs只包含【父组件传递过来的变量,减去,props的数据】,现在我们给子组件加上props接收一个数据,其他代码不变

export default { 
   
	props: ["parent_to_grand"],
	mounted() { 
   
		console.log(this.$attrs);
	},
	components: { 
   
		grandOne,
	},
};

再打印一下this.$attrs,会减去props中接受的属性
在这里插入图片描述
如果希望将参数传递给孙组件,需要在【子组件中的孙组件标签】上加上v-bind="$attrs"

<grandOne v-bind="$attrs"></grandOne>

孙组件 再使用this.$attrs获取 父组件 传递过来的参数,其中会自动过滤掉被 子组件 props 获取过的属性

孙组件

<template>
	<div>
		孙子组件1
	</div>
</template>
<script>
export default { 
   
	data() { 
   
		return { 
   };
	},
	mounted() { 
   
		console.log(this.$attrs);
	},
};
</script>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145426.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 生活角色主要包括哪些内容_简要介绍眼睛是的体位分类

    生活角色主要包括哪些内容_简要介绍眼睛是的体位分类ILSVRC2012数据集(分类部分)简要介绍和初步处理简介即大名鼎鼎ImageNet2012竞赛的数据集,在图像分类数据集中属于最常用的跑分数据集和预训练数据集。主要内容可以参考ILSVRC2012_devkit_t12.gz的readme.txt和中文翻译版内容详解下载的文件主要包括以下几个文件:ILSVRC2012_img_train.tarILSVRC2012_img_val.tarILSVRC2012_img_test.tarILSVRC2012_devkit

    2022年10月21日
    3
  • 小程序列表跳转至详情_小程序跳转链接怎么获取

    小程序列表跳转至详情_小程序跳转链接怎么获取效果展示:列表页js部分:onLoad:function(options){varthat=this;wx.request({url:’你的接口’,data:{ 接口参数},header:{‘content-type’:’ap…

    2022年8月18日
    8
  • datagrip2022.01 激活码【中文破解版】

    (datagrip2022.01 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    207
  • Java反射机制的原理和用途

    Java反射机制的原理和用途看了好多关于Java反射机制的文章,大多都太过官方,消化起来比较稍显费劲,本篇,我会依据自己的理解去阐述什么是Java的反射机制,反射用在什么地方,以及怎么来使用?开篇前,我们还是要了解一下,什么是Java的反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl、Python(看过我写的Python3学习系列的博文,不止一次突出…

    2022年5月2日
    43
  • 如何使用PLATFORM SDK

    如何使用PLATFORM SDK安装好SDK后,打开VC 在菜单中选择TOOL->OPTIONS->DIRECTORIES 在INCLUDEFILES中把SDK的INCLUDE目录添加到里面,把它放在第一项,就可以用SDK了。 

    2022年6月3日
    32
  • java面向对象三大特征及五大原则

    java面向对象三大特征及五大原则java面向对象一、java面向对象的三大特征1、封装(Encapsulation)封转是指属性私有化根据需要提供setter和getter方法来访问属性隐藏具体属性和实现细节,仅对外开放接口控制程序中属性的访问级别目的:增强数据安全性,不能让其他用户随意访问和修改数据,简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员2、继承(Extend)继承是指将…

    2022年7月25日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号