我来为你讲解一下“Vue传值方式的十二种方法总结”的完整攻略。
一、前言
在开发Vue的过程中,我们经常需要进行组件之间的数据传递。这时候,就需要选择一种合适的传值方式。本篇文章将为大家总结了十二种常见的Vue传值方式,并对它们进行详细的介绍和对比。希望对大家在开发中提供一些帮助。
二、直接传值
最简单的方式就是直接传值。也就是说,我们可以在父组件中直接将数据传递给子组件。这种方式通常需要使用props。在父组件中,我们可以通过v-bind指令向子组件中的props传递数据。
【示例1】父组件向子组件中传递数据
父组件中的代码:
<template>
<div>
<child-component :child-data="parentData"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: '我是父组件的数据'
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ childData }}</p>
</div>
</template>
<script>
export default {
props: ['childData']
}
</script>
三、事件传递
事件传递是将子组件中的数据通过事件穿透到父组件中。通常情况下,这种方式被用来触发一个父组件中的方法,或者改变父组件中的数据。
【示例2】子组件向父组件中传递数据
父组件中的代码:
<template>
<div>
<child-component v-on:child-change="handleChange"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: ''
}
},
methods: {
handleChange(value) {
this.parentData = value;
}
}
}
</script>
子组件中的代码:
<template>
<div>
<button v-on:click="handleClick">点击我改变父组件的数据</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('child-change', '我是子组件的数据');
}
}
}
</script>
四、Vuex
Vuex是为Vue.js应用程序开发的状态管理模式。它使用单个全局调度程序管理应用程序的所有状态。
在使用Vuex中,我们可以使用各种Getter、Commit以及Dispatch进行数据的获取和修改。简单来说,Vuex的使用可以让组件之间的数据传递更加简单明了。
五、provide/inject
provide-inject是Vue2.2.0版本中引入的新特性。它是一种向下传递数据的方式。与props相反,使用provide-inject可以直接将数据传递给所有的子组件。
在父组件中,我们使用provide提供数据。然后在children组件中,我们可以使用inject来注入数据。
【示例3】provide/inject
父组件中的代码:
<template>
<div>
<child-component></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
provide() {
return {
parentData: '我是父组件的数据'
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ childData }}</p>
</div>
</template>
<script>
export default {
inject: ['parentData'],
computed: {
childData() {
return this.parentData;
}
}
}
</script>
六、$attrs和$listeners
当定义组件时,我们通常使用props来定义组件的属性,然后在父组件中通过v-bind来传递参数。但是,在某些情况下,我们可能需要在组件中动态添加属性。这时候,就需要使用$attrs和$listeners了。
在一个组件中,$attrs是一个包含所有没有被声明为props的属性的对象。$listeners是一个包含父组件绑定的所有事件监听器的对象。
【示例4】$attrs和$listeners
父组件中的代码:
<template>
<div>
<child-component v-bind="$attrs" v-on="$listeners"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: '我是父组件的数据'
}
},
methods: {
handleClick() {
this.parentData = '我是改变后的值';
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ $attrs.parentData }}</p>
<button v-on:click="$listeners['click']">点击我触发父组件中的事件</button>
</div>
</template>
<script>
export default {}
</script>
七、$parent和$children
$parent和$children是Vue内置属性,可以在组件中直接访问。
$parent是一个属性,指向组件在父组件中的实例。$children是一个数组,包含了所有组件子实例的引用。
【示例5】$parent和$children
父组件中的代码:
<template>
<div>
<child-component></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: '我是父组件的数据'
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ $parent.parentData }}</p>
</div>
</template>
<script>
export default {}
</script>
八、ref
在Vue中,可以使用ref来获取组件或HTML元素的引用。通过这种方式,我们可以访问组件或HTML元素的各种属性和方法。
【示例6】ref
父组件中的代码:
<template>
<div>
<child-component ref="myComponent"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
methods: {
handleClick() {
console.log(this.$refs.myComponent);
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ childData }}</p>
</div>
</template>
<script>
export default {
data() {
return {
childData: '我是子组件的数据'
}
}
}
</script>
九、$emit
$emit是Vue中的一个方法,用于向父组件发送一个自定义的事件。当组件需要向上级组件传递数据时,可以使用该方法。
【示例7】$emit
父组件中的代码:
<template>
<div>
<child-component v-on:child-change="handleChange"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: ''
}
},
methods: {
handleChange(value) {
this.parentData = value;
}
}
}
</script>
子组件中的代码:
<template>
<div>
<button v-on:click="handleClick">点击我改变父组件的数据</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('child-change', '我是子组件的数据');
}
}
}
</script>
十、$root
$root是Vue组件树中最顶层的Vue实例。在子组件中,我们可以使用$root来访问根组件中的数据和方法。
【示例8】 $root
根组件中的代码:
<template>
<div>
<child-component></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
rootData: '我是根组件的数据'
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ $root.rootData }}</p>
</div>
</template>
<script>
export default {}
</script>
十一、$attrs和$listeners
$attrs和$listeners的作用已经在第六种方式中进行了介绍,这里再介绍一下另一种使用方式。
在一个组件中,$attrs和$listeners也可以通过v-bind和v-on来进行传递。
【示例9】$attrs和$listeners
父组件中的代码:
<template>
<div>
<child-component v-bind="$attrs" v-on="$listeners"></child-component>
</div>
</template>
<script>
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: '我是父组件的数据'
}
},
methods: {
handleClick() {
this.parentData = '我是改变后的值';
}
}
}
</script>
子组件中的代码:
<template>
<div>
<p>{{ $attrs.parentData }}</p>
<button v-on:click="$listeners['click']">点击我触发父组件中的事件</button>
</div>
</template>
<script>
export default {}
</script>
十二、eventBus
eventBus是一种非常灵活的传值方式。在Vue中,我们可以使用eventBus来完成组件之间的数据传递。具体地,就是通过一个全局的事件总线来完成。
【示例10】eventBus
eventBus的实现:
import Vue from 'vue';
export default new Vue();
父组件中的代码:
<template>
<div>
<child-component></child-component>
</div>
</template>
<script>
import EventBus from './EventBus';
import childComponent from './childComponent';
export default {
components: {
childComponent
},
data() {
return {
parentData: '我是父组件的数据'
}
},
created() {
EventBus.$on('change', (value) => {
this.parentData = value;
});
}
}
</script>
子组件中的代码:
<template>
<div>
<button v-on:click="handleClick">点击我改变父组件的数据</button>
</div>
</template>
<script>
import EventBus from './EventBus';
export default {
methods: {
handleClick() {
EventBus.$emit('change', '我是子组件的数据');
}
}
}
</script>
到这里,我们已经介绍完了十二种Vue的传值方式。它们各有优缺点,需要根据具体的情况来选择最合适的方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue传值方式的十二种方法总结 - Python技术站