Vue项目中父子组件通信

在 vue-cli 构建的项目中实现父子组件通信
核心点

1.设置组件的 ref 属性
2.父组件给子组件传值 , 使用 :valueName , 子组件 使用 props:[‘valueName’] 接收 {{valueName}} 直接使用
3.子组件调用父组件的方法 需要在组件上 添加 @methedName="(需要调用的方法名)" 子组件使用 this.emit(“methedName”)调用
4.父组件调用子组件 data 内定义的属性及方法 使用 this.$refs.(定义的 ref 名).(valueName/methodName)

父组件
<template>
	<dropList ref="dropList" 
	           :dropdata=“data” 
	           @test=“testMethod” 
	           :tid=“1” >
	</dropList>
<template>
<script>
import dropList from "../components/index/dropList"

export default {
 	components: {
        dropList
    },
	methods : {
	    // 供子组件调用的方法
		testMethod(){
			console.log("testMethod  trigger ...")
		},
		// 父组件想要 访问或设置子组件data定义的的变量
		// 给 组件 设置 ref 的值
		changeOrgetChildData(){
			//获取子组件的变量
			this.$refs.dropList.dataName
			//设置子组件内的变量
			this.$refs.dropList.dataName=xxx
		},
		triggerChildMethod(){
			//调用子组件内的方法
			this.$refs.dropList.methodName();
		}
	}
}
</script>
子组件
<template>
	<div>
	   <!-- 调用父组件传给子组件的变量 -->
		{{dropdata}} 
	</div>
<template>
<script>
export default {
    props : ['dropdata'] ,//接收父组件传给子组件的变量
 	data : {
		return {
			dataName : " "
		}
	}
	methods : {
		//子组件内 调用父组件 testMethod 方法
	    triggetParentMethod(){
			this.$emit("test")
		}
	}
}
</script>
### Vue.js 父子组件间的通信方式 #### 使用 Props 进行单向数据流传递 Props 是一种自定义属性,允许父组件通过这些属性向子组件传递数据。这是一种单向下行的数据绑定机制,在这种情况下,任何来自父级的变化都会向下流动到子组件。 ```html <!-- 子组件 --> <template> <p>{{ message }}</p> </template> <script> export default { props: ['message'] } </script> ``` ```html <!-- 父组件 --> <template> <child-component :message="parentMessage"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello from Parent' } } } </script> ``` [^1] #### 利用 Events 实现双向通信 除了使用 `props` 向下传递数据外,还可以利用 `$emit()` 方法让子组件触发事件并向上通知其父组件。这种方式可以用来实现从子组件到父组件的信息反馈。 ```html <!-- 子组件 --> <template> <button @click="$emit('increment')">Increment Counter</button> </template> ``` ```html <!-- 父组件 --> <template> <child-component @increment="counter++"></child-component> <p>Counter value is {{ counter }}</p> </template> <script> // ...省略导入部分... export default { // ... data() { return { counter: 0 }; } }; </script> ``` [^4] #### Refs 和 $refs 的应用 对于更复杂的场景,比如直接操作 DOM 或调用子组件的方法时,则可以通过给子组件设置唯一的 `ref` 属性,并借助于 `$refs` 来访问它。这使得可以在特定时刻获取子组件实例及其内部状态或执行某些行为。 ```html <!-- 父组件 --> <template> <div class="parent"> <child ref="myChild"/> </div> </template> <script> export default { mounted(){ const myChildInstance = this.$refs.myChild; console.log(myChildInstance.name); // 输出 "child.vue" myChildInstance.hello(); // 控制台打印 "hello JS" } } </script> ``` ```html <!-- 子组件 --> <template></template> <script> export default { data(){ return { name:"child.vue" } }, methods:{ hello(){ console.log("hello JS") } } } </script> ``` [^3] #### Vuex 对全局状态管理的支持 当涉及到多个层次嵌套的组件之间共享复杂的状态逻辑时,推荐采用 Vuex 库来进行集中式的存储管理和同步更新。这样不仅简化了跨多层组件树的状态传播过程,而且提高了代码可维护性和性能表现。 [^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值