博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue 组件间传值
阅读量:5069 次
发布时间:2019-06-12

本文共 7033 字,大约阅读时间需要 23 分钟。

前言

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

转载于:https://www.cnblogs.com/qixidi/p/10390964.html

你可能感兴趣的文章
angularJS----filter
查看>>
Python Api接口自动化测试框架 excel篇
查看>>
Ionic 常见问题及解决方案
查看>>
各浏览器目前对CSS3、HTML5的支持
查看>>
切换jdk版本
查看>>
结对开发四~~
查看>>
关于多用户下自动编号的问题
查看>>
只显示重复数据,或不显示重复数据
查看>>
curl 命令详解
查看>>
javascript 对象简单介绍(一)
查看>>
linux正则表达式回忆记录
查看>>
Response.Buffer = True
查看>>
有趣的python range()函数
查看>>
SQLServer 学习笔记之超详细基础SQL语句 Part 8
查看>>
oracle中分组排序函数用法 - 转
查看>>
webpack执行命令失败之解决办法
查看>>
使用Jedis操作redis 缓存
查看>>
利用 python 实现对web服务器的目录探测
查看>>
实例详解机器学习如何解决问题
查看>>
STS搭建springMVC框架(三)
查看>>