VUE data传值

data 必须是一个函数

上面例子中,可以看到 button-counter 组件中的 data 不是一个对象,而是一个函数:

data: function () {
  return {
    count: 0
  }
}

这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例,如下所示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>v-on-data事件</title>
		<script src="js/vue.js"></script>
	</head>
	<body>
		<div id="components-demo">
			<button-counter></button-counter>
			<button-counter></button-counter>
			<button-counter></button-counter>
		</div>
		<script>
			var buttonCounter2Data={count:0}
			Vue.component('button-counter',{
				data:function(){
					//data选项是一个对象,会影响到其他实例;
					return buttonCounter2Data
				},
				template:'<button v-on:click="count++">点击了{{count}}次</button>'
			})
			new Vue({
				el:'#components-demo'
			})
		</script>
	</body>
</html>

 

 

### Vue3 组件间方法详解 Vue3 提供了多种组件间的方式,这些方式可以满足不同场景下的需求。以下是常见的几种方法及其具体实现: #### 1. **父组件向子组件 - 使用 `props`** 父组件可以通过 `props` 将数据递给子组件。这是最常见的一种单向数据流模式。 ##### 示例代码: ```vue <!-- 父组件 --> <template> <div> <child-component :message="parentMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: '来自父组件的消息', }; }, }; </script> ``` ```vue <!-- 子组件 --> <template> <div>{{ message }}</div> </template> <script setup> defineProps({ message: String, }); </script> ``` 这种方法适用于父子组件之间的简单数据递[^1]。 --- #### 2. **子组件向父组件 - 使用 `$emit`** 子组件可以通过 `$emit` 向父组件发送事件并附带参数,从而完成数据的反向递。 ##### 示例代码: ```vue <!-- 子组件 --> <template> <button @click="sendDataToParent">点击按钮向父组件</button> </template> <script setup> const emit = defineEmits(['updateValue']); function sendDataToParent() { emit('updateValue', '来自子组件的数据'); } </script> ``` ```vue <!-- 父组件 --> <template> <div> <p>接收自子组件的数据:{{ childData }}</p> <child-component @updateValue="handleUpdate"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { childData: '', }; }, methods: { handleUpdate(value) { this.childData = value; }, }, }; </script> ``` 这种方式适合处理简单的双向交互逻辑[^4]。 --- #### 3. **兄弟组件之间 - 使用 Provide/Inject 或 Vuex/Pinia** 当两个无直接关系的组件需要共享状态时,可以借助 `provide/inject` 或者全局状态管理工具(如 Pinia/Vuex)来实现。 ##### 示例代码(Provide/Inject 方式): ```vue <!-- 祖先组件 --> <script setup> import { ref, provide } from 'vue'; const sharedState = ref('祖先组件的状态'); provide('sharedKey', sharedState); </script> ``` ```vue <!-- 子孙组件 --> <script setup> import { inject } from 'vue'; const sharedState = inject('sharedKey'); </script> <template> <div>接收到的状态:{{ sharedState }}</div> </template> ``` 此方法适用于层级组件间的通信[^1]。 --- #### 4. **任意组件间 - 使用 Event Bus 或 Global State Management** 对于更复杂的场景,推荐使用专门的状态管理库(如 Pinia 或 Vuex)。如果只是临时性的消息通知,则可通过创建一个全局事件总线来实现。 ##### 示例代码(EventBus 实现): ```javascript // event-bus.js import { reactive } from 'vue'; export const EventBus = reactive({ messages: [] }); ``` ```vue <!-- 发送方组件 --> <script setup> import { EventBus } from './event-bus'; EventBus.messages.push('新消息'); </script> ``` ```vue <!-- 接收方组件 --> <script setup> import { watchEffect } from 'vue'; import { EventBus } from './event-bus'; watchEffect(() => console.log(EventBus.messages)); </script> ``` 这种方案灵活性高,但需注意避免滥用导致耦合度过大[^2]。 --- #### 总结 以上介绍了四种主要的 Vue3 组件间方法,分别是基于 `props/$emit` 的父子组件通信、利用 `provide/inject` 级联通讯以及通过第三方机制(如 Pinia 和 EventBus)达成全项目范围内的资源共享。开发者应根据实际情况选取最适合的技术手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

teayear

读后有收获可以获取更多资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值