在 Vue 中,组件之间传值有多种方式,以下是常见的几种:
父子组件传值
-
父组件向子组件传值
- 使用 props:在父组件中,通过在子组件标签上以自定义属性的形式绑定数据,子组件通过
props
选项来接收父组件传递的值。例如,父组件Parent.vue
中有一个message
数据,要传递给子组件Child.vue
,在Parent.vue
中可以这样写:
- 使用 props:在父组件中,通过在子组件标签上以自定义属性的形式绑定数据,子组件通过
html
<template>
<div>
<child :message="message"></child>
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child
},
data() {
return {
message: 'Hello from parent'
};
}
};
</script>
在Child.vue
中通过props
接收:
html
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
props: ['message']
};
</script>
-
子组件向父组件传值
-
使用自定义事件:子组件通过
$emit
方法触发自定义事件,并传递数据,父组件在子组件标签上通过v-on
指令监听自定义事件来接收数据。例如,子组件Child.vue
有一个按钮,点击按钮时向父组件传递数据,在Child.vue
中可以这样写:
-
html
<template>
<div>
<button @click="sendMessage">Send Message</button>
</div>
</template>
<script>
export default {
methods: {
sendMessage() {
this.$emit('message-from-child', 'Hello from child');
}
}
};
</script>
在父组件Parent.vue
中监听自定义事件:
html
<template>
<div>
<child @message-from-child="handleMessage"></child>
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child
},
methods: {
handleMessage(message) {
console.log(message);
}
}
};
</script>
兄弟组件传值
-
使用事件总线
- 创建一个
EventBus
实例,在需要传递数据的兄弟组件中,一个组件通过$emit
方法在EventBus
上触发事件并传递数据,另一个组件通过$on
方法在EventBus
上监听事件来接收数据。首先创建eventBus.js
文件:
- 创建一个
javascript
import Vue from 'vue';
export const EventBus = new Vue();
然后在组件Brother1.vue
中触发事件:
html
<template>
<div>
<button @click="sendMessage">Send Message</button>
</div>
</template>
<script>
import { EventBus } from './eventBus.js';
export default {
methods: {
sendMessage() {
EventBus.$emit('message-from-brother1', 'Hello from brother1');
}
}
};
</script>
在组件Brother2.vue
中监听事件:
html
<template>
<div>{{ message }}</div>
</template>
<script>
import { EventBus } from './eventBus.js';
export default {
data() {
return {
message: ''
};
},
mounted() {
EventBus.$on('message-from-brother1', (message) => {
this.message = message;
});
},
beforeDestroy() {
EventBus.$off('message-from-brother1');
}
};
</script>
跨多级组件传值
-
使用 provide 和 inject
- 在祖先组件中通过
provide
选项提供数据,后代组件中通过inject
选项注入数据。例如,祖先组件Ancestor.vue
提供数据:
- 在祖先组件中通过
html
<template>
<div>
<child></child>
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child
},
provide() {
return {
message: 'Hello from ancestor'
};
}
};
</script>
后代组件Descendant.vue
注入数据:
html
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
inject: ['message']
};
</script>