Vue 组件间传值

vue

前言

Vue 作为现在比较火的框架之一,相信您在使用的过程中,也会遇到组件间传值的情况,本文将讲解几种 Vue 组件间传值的几种方法,跟着小编一起来学习一下吧!

实现

注意: 学习本文,需要您对 Vue 有一定的了解。

为了便于讲解,以下方法均假设父组件是 FatherComponent,子组件是 ChildComponent,兄弟组件是:BrotherComponent。我们来假定一种场景:点击父组件“传递给子组件”按钮,向子组件传递一条消息“I am your father.”;点击子组件“传递给父组件”按钮,向父组件传递一条消息“I am your child.”;点击子组件“传递给兄弟组件”按钮,向兄弟组件传递一条消息“I am your brother.”

1. 方法一

关键词: props、$emit

父组件 FatherComponent 代码:

<template>

<div>

<div>{{toFatherInfo}}</div>

<ChildComponent :toChildInfo="toChildInfo" @toFather="toFather" @toBrother="toBrother"/>

<BrotherComponent :toBrotherInfo="toBrotherInfo"/>

<button @click="toChild">传递给子组件</button>

</div>

</template>

<script>

import ChildComponent from 'components/test/child-component'

import BrotherComponent from 'components/test/brother-component'

export default {

components: {

ChildComponent,

BrotherComponent

},

data () {

return {

toFatherInfo: '',

toChildInfo: '',

toBrotherInfo: ''

}

},

methods: {

toFather (res) {

this.toFatherInfo = res

},

toBrother (res) {

this.toBrotherInfo = res

},

toChild () {

this.toChildInfo = 'I am your father.'

}

}

}

</script>

<style lang="less">

button {

font-size: 36px;

border: none;

padding: 20px;

background-color: #999;

color: #fff;

width: 100%;

margin-top: 30px;

}

</style>

子组件 ChildComponent 代码:

<template>

<div>

<div>{{toChildInfo}}</div>

<button @click="toFather">传递给父组件</button>

<button @click="toBrother">传递给兄弟组件</button>

</div>

</template>

<script>

export default {

props: {

toChildInfo: {

type: String

}

},

methods: {

toFather () {

this.$emit('toFather', 'I am your child.')

},

toBrother () {

this.$emit('toBrother', 'I am your brother.')

}

}

}

</script>

<style lang="less">

</style>

兄弟组件 BrotherComponent 代码:

<template>

<div>{{toBrotherInfo}}</div>

</template>

<script>

export default {

props: {

toBrotherInfo: {

type: String

}

}

}

</script>

<style lang="less">

</style>

通过上面代码,不难发现,我们通过使用 props 来实现父组件给子组件传值;子组件向父组件传值时,借助 $emit 来实现;而子组件向兄弟组件传值时,将两者结合起来使用。

2. 方法二

关键词:独立的事件中心 eventHub

首先需要先创建 eventHub.js 文件,代码如下:

// 将在各处使用该事件中心

// 组件通过它来通信

import Vue from 'vue'

export default new Vue()

然后在组件中,可以使用 $emit, $on, $off 分别来分发、监听、取消监听事件。

父组件 FatherComponent 代码:

<template>

<div>

<div>{{info}}</div>

<ChildComponent />

<BrotherComponent />

<button @click="toChild">传递给子组件</button>

</div>

</template>

<script>

import eventHub from '../../components/test/eventHub'

import ChildComponent from 'components/test/child-component'

import BrotherComponent from 'components/test/brother-component'

export default {

components: {

ChildComponent,

BrotherComponent

},

data () {

return {

info: ''

}

},

created: function () {

eventHub.$on('toFather', this.toFather)

},

// 最好在组件销毁前

// 清除事件监听

beforeDestroy: function () {

eventHub.$off('toFather', this.toFather)

},

methods: {

toFather (res) {

this.info = res

},

toChild () {

eventHub.$emit('toChild', 'I am your father.')

}

}

}

</script>

<style lang="less">

button {

font-size: 36px;

border: none;

padding: 20px;

background-color: #999;

color: #fff;

width: 100%;

margin-top: 30px;

}

</style>

子组件 ChildComponent 代码:

<template>

<div>

<div>{{info}}</div>

<button @click="toFather">传递给父组件</button>

<button @click="toBrother">传递给兄弟组件</button>

</div>

</template>

<script>

import eventHub from './eventHub'

export default {

data () {

return {

info: ''

}

},

created: function () {

eventHub.$on('toChild', this.toChild)

},

// 最好在组件销毁前

// 清除事件监听

beforeDestroy: function () {

eventHub.$off('toChild', this.toChild)

},

methods: {

toChild (res) {

this.info = res

},

toFather () {

eventHub.$emit('toFather', 'I am your child.')

},

toBrother () {

eventHub.$emit('toBrother', 'I am your brother.')

}

}

}

</script>

<style lang="less">

</style>

兄弟组件 BrotherComponent 代码:

<template>

<div>{{info}}</div>

</template>

<script>

import eventHub from './eventHub'

export default {

data () {

return {

info: ''

}

},

created: function () {

eventHub.$on('toBrother', this.toBrother)

},

// 最好在组件销毁前

// 清除事件监听

beforeDestroy: function () {

eventHub.$off('toBrother', this.toBrother)

},

methods: {

toBrother (res) {

this.info = res

}

}

}

</script>

<style lang="less">

</style>

3. 方法三

关键词:Vuex

我们需要创建 store.js 来存放数据:

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({

state: {

fromFatherInfo: '',

fromChildInfo: '',

fromBrotherInfo: ''

},

mutations: {

changeFromFatherInfo (state, fromFatherInfo) {

state.fromFatherInfo = fromFatherInfo

},

changeFromChildInfo (state, fromChildInfo) {

state.fromChildInfo = fromChildInfo

},

changeFromBrotherInfo (state, fromBrotherInfo) {

state.fromBrotherInfo = fromBrotherInfo

}

}

})

实例化:

import Vue from 'vue'

import App from './App'

import store from './store'

new Vue({

el: '#app',

store,

template: '<App/>',

components: { App }

})

父组件 FatherComponent 代码:

<template>

<div>

<div>{{fromChildInfo}}</div>

<ChildComponent />

<BrotherComponent />

<button @click="toChild">传递给子组件</button>

</div>

</template>

<script>

import ChildComponent from 'components/test/child-component'

import BrotherComponent from 'components/test/brother-component'

export default {

components: {

ChildComponent,

BrotherComponent

},

computed: {

fromChildInfo () {

return this.$store.state.fromChildInfo

}

},

methods: {

toChild () {

this.$store.commit('changeFromFatherInfo', 'I am your father.')

}

}

}

</script>

<style lang="less">

button {

font-size: 36px;

border: none;

padding: 20px;

background-color: #999;

color: #fff;

width: 100%;

margin-top: 30px;

}

</style>

子组件 ChildComponent 代码:

<template>

<div>

<div>{{fromFatherInfo}}</div>

<button @click="toFather">传递给父组件</button>

<button @click="toBrother">传递给兄弟组件</button>

</div>

</template>

<script>

export default {

computed: {

fromFatherInfo () {

return this.$store.state.fromFatherInfo

}

},

methods: {

toFather () {

this.$store.commit('changeFromChildInfo', 'I am your child.')

},

toBrother () {

this.$store.commit('changeFromBrotherInfo', 'I am your brother.')

}

}

}

</script>

<style lang="less">

</style>

兄弟组件 BrotherComponent 代码:

<template>

<div>{{fromBrotherInfo}}</div>

</template>

<script>

export default {

computed: {

fromBrotherInfo () {

return this.$store.state.fromBrotherInfo

}

}

}

</script>

<style lang="less">

</style>

来源:https://segmentfault.com/a/1190000018088789

以上是 Vue 组件间传值 的全部内容, 来源链接: utcz.com/z/380653.html

回到顶部