使用prop
父组件Parent.vuejavascript
<template> <div> <child :msg='toChildMsg'></child> </div> </template>
export default { data() { return { toChildMsg: 'message', }, }, }
子组件Child.vuehtml
<template> <div> {{msg}} </div> </template>
export default { props: { msg: String, // 这里是传递参数的类型 default: '默认值', // 这里是默认值 }, }
事件派发vue
子组件Child.vuejava
<template> <div> <button @click='changeParentData'><button> </div> </template>
export default { methods: { changeParentData() { this.$emit('change', '来自子组件的消息'); }, }, }
父组件Parent.vuevuex
<template> <div> <child :change='changeData'></child> </div> </template>
export default { data() { return { parentData: '', }, }, methods: { changeData(val) { // val是子组件传递过来的值 this.parentData = val; // 事件派发修改data }, }, }
固然每次为了修改一条数据就定义一个方法有点繁琐,Vue在2.4+的版本中加了一个语法糖.sync
修饰符ide
下面放用法
子组件Child.vuethis
<template> <div> <button @click='changeParentData'><button> </div> </template>
export default { methods: { changeParentData() { this.$emit('update:parentData', '来自子组件的消息'); }, }, }
父组件Parent.vueprototype
<template> <div> <child :parentData.sync='parentData'></child> </div> </template>
export default { data() { return { parentData: '', }, }, }
使用provide
和inject
,可是这种方式只能由从父元素到孙元素的单向传递。code
祖先组件Parent.vue,这里咱们将父组件的vue实例对象传递出去htm
export default { provide() { return { pVue: this, }; }, data() { return: { pMsg: '祖先组件data', } } };
子孙组件Grandson.vue,接受祖先组件的实例对象,就能够使用Parent.vue中的方法和数据了
<template> <div> {{pVue.pMsg}} </div> </template>
export default { inject: ['pVue'], };
经过事件总线来传递参数
在main.js
中定义一个传递参数的中间件$bus
main.js
const bus = new Vue(); Vue.prototype.$bus = bus;
A.vue
<template> <div> <button @click="change">改变B组件的参数</button> </div> </template>
export default { methods: { change() { this.$bus.$emit('changeB', '修改B组件的参数'); } } };
B.vue
export default { data() { return { data: '等待被修改', }; }, created() { // 监听change事件修改组件内部的参数 this.$bus.$on('changeB', msg => { this.data = msg; }) } };
固然若是有不少数据须要维护,不停的依靠组件通讯也是一件不太优雅的事情,这个时候就能够依赖vuex
,当咱们仅仅须要简单的通讯,以上的方法就能够解决大部分问题.