vue组件间属性传值的常用的方法和规范详解

 更新时间:2025年05月23日 10:15:33   作者:盛夏绽放  
在Vue CLI项目中,组件间的属性传值是一个常见的需求,本文为大家整理了一些常用的传值方法和规范以及相应的代码演示和解说,感兴趣的小伙伴可以跟随小编一起学习一下

一. 父组件向子组件传值(Props)

1.规范:父组件通过属性(props)向子组件传递数据。子组件需要在props选项中声明这些属性。

2.代码演示:

(1) 父组件:

<template>
  <div>
    <child-component :parent-data="dataFromParent"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      dataFromParent: '这是来自父组件的数据'
    };
  }
};
</script>

(2) 子组件:

<template>
  <div>
    {{ parentData }}
  </div>
</template>

<script>
export default {
  props: {
    parentData: String
  }
};
</script>

解说:父组件使用v-bind(或简写为:)将dataFromParent属性传递给子组件。子组件通过声明props来接收这个数据,并可以在模板中使用它。

二. 子组件向父组件传值(Events)

1.规范:子组件通过发射事件($emit)向父组件传递数据。父组件通过监听这些事件来接收数据。

2.代码演示:

(1)子组件:

<template>
  <div>
    <button @click="sendDataToParent">发送数据到父组件</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendDataToParent() {
      this.$emit('dataToSend', '这是子组件发送的数据');
    }
  }
};
</script>

 (2)父组件:

<template>
  <div>
    <child-component @dataToSend="handleDataFromChild"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

​​​​​​​export default {
  components: {
    ChildComponent
  },
  methods: {
    handleDataFromChild(data) {
      console.log(data); // 输出:这是子组件发送的数据
    }
  }
};
</script>

解说:子组件通过this.$emit触发一个事件,并传递数据。父组件通过v-on(或简写为@)监听这个事件,并在事件处理函数中接收数据。

三. 兄弟组件传值(Event Bus)

1.规范:兄弟组件可以通过一个共同的父组件或使用全局事件总线(Event Bus)来传递数据。

2.代码演示:

(1)Event Bus:

// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();

(2)兄弟组件A(发送数据):

<template>
  <div>
    <button @click="sendData">发送数据到兄弟组件</button>
  </div>
</template>

<script>
import { EventBus } from './event-bus.js';

​​​​​​​export default {
  methods: {
    sendData() {
      EventBus.$emit('data-to-brother', '这是来自兄弟组件A的数据');
    }
  }
};
</script>

(3)兄弟组件B(接收数据):

<template>
  <div>
    <div>{{ dataFromBrother }}</div>
  </div>
</template>

<script>
import { EventBus } from './event-bus.js';

​​​​​​​export default {
  data() {
    return {
      dataFromBrother: ''
    };
  },
  created() {
    EventBus.$on('data-to-brother', this.receiveData);
  },
  methods: {
    receiveData(data) {
      this.dataFromBrother = data;
    }
  },
  beforeDestroy() {
    EventBus.$off('data-to-brother', this.receiveData);
  }
};
</script>

3.代码讲解

这段代码是一个 Vue.js 组件的示例,它使用了 Vue 的事件总线(Event Bus)来接收来自兄弟组件的数据,并将其显示在模板中。以下是对代码的详细解释:

代码结构

模板部分 (<template>):

  • 这是一个简单的 Vue 模板,包含一个 div 元素,用于显示从兄弟组件接收到的数据。
  • {{ dataFromBrother }} 是 Vue 的插值语法,用于动态绑定数据。

脚本部分 (<script>):

定义了一个 Vue 组件,包含 data、created、methods 和 beforeDestroy 生命周期钩子。

代码详细解释

1.数据绑定

data() {
  return {
    dataFromBrother: ''
  };
}

data 是 Vue 组件的选项,用于定义组件的响应式数据。

dataFromBrother 是一个字符串,用于存储从兄弟组件接收到的数据。

2. 事件监听

created() {
  EventBus.$on('data-to-brother', this.receiveData);
}

created 是 Vue 的生命周期钩子,表示组件实例被创建后执行的代码。

EventBus.$on 是事件总线的监听方法,用于监听事件 'data-to-brother'。

当事件 'data-to-brother' 被触发时,调用 this.receiveData 方法。

3. 数据接收

methods: {
  receiveData(data) {
    this.dataFromBrother = data;
  }
}

methods 是 Vue 组件的选项,用于定义组件的方法。

receiveData 是一个方法,接收一个参数 data,并将该数据赋值给 dataFromBrother。

4. 事件解绑

beforeDestroy() {
  EventBus.$off('data-to-brother', this.receiveData);
}

beforeDestroy 是 Vue 的生命周期钩子,表示组件销毁之前执行的代码。

EventBus.$off 是事件总线的解绑方法,用于移除事件 'data-to-brother' 的监听器。

这一步非常重要,避免内存泄漏和不必要的事件触发。

事件总线(Event Bus)

事件总线是一种在 Vue 组件之间通信的方式,适用于兄弟组件之间的通信。它通过一个共享的事件中心来触发和监听事件。

事件总线的定义

在 event-bus.js 文件中,通常会这样定义事件总线:

import Vue from 'vue';
export const EventBus = new Vue();

这里创建了一个新的 Vue 实例作为事件总线。

使用场景

假设有一个兄弟组件,它通过事件总线发送数据:

// 兄弟组件
import { EventBus } from './event-bus.js';

export default {
  methods: {
    sendData() {
      const dataToSend = 'Hello from brother component';
      EventBus.$emit('data-to-brother', dataToSend);
    }
  }
};

当 sendData 方法被调用时,它通过事件总线触发 'data-to-brother' 事件,并传递数据。

总结

这段代码展示了如何使用 Vue 的事件总线在兄弟组件之间通信。通过监听和触发事件,组件可以共享数据,而不需要直接的父子关系。

四. 跨级组件传值(Provide/Inject)

1.规范:祖先组件可以使用provide选项提供数据,而子孙组件可以使用inject选项注入这些数据。

2.代码演示:

(1)祖先组件:

<template>
  <div>
    <descendant-component />
  </div>
</template>

<script>
import DescendantComponent from './DescendantComponent.vue';

​​​​​​​export default {
  components: {
    DescendantComponent
  },
  provide() {
    return {
      crossLevelData: '这是跨级传递的数据'
    };
  }
};
</script>

(2)子孙组件:

<template>
  <div>
    {{ crossLevelData }}
  </div>
</template>

<script>
export default {
  inject: ['crossLevelData']
};
</script>

解说:祖先组件通过provide提供数据,子孙组件通过inject注入这些数据。这种方法适用于跨越多个层级的组件通信。

这些是在Vue CLI项目中常用的组件间属性传值的方法和规范。每种方法都有其适用场景,开发者可以根据具体需求选择最合适的传值方式。

以上就是vue组件间属性传值的常用的方法和规范详解的详细内容,更多关于vue组件属性传值的资料请关注脚本之家其它相关文章!

相关文章

  • 前端vue3打印功能实现(多页打印、不使用插件)

    前端vue3打印功能实现(多页打印、不使用插件)

    在Vue项目中实现打印功能是前端开发中常见需求之一,这篇文章主要介绍了前端vue3打印功能实现的全部过程,文中介绍的方法实现了多页打印并且不使用插件,需要的朋友可以参考下
    2024-09-09
  • 八种vue实现组建通信的方式

    八种vue实现组建通信的方式

    这篇文章主要介绍是八种vue实现组建通信的方式,包括、props 父组件与子组件通信、$emit 子组件父组件传递、$emit与props结合 兄弟组件传值等等,想具体了解的朋友可以参考下面文章的具体内容
    2021-09-09
  • vite项目添加eslint prettier及husky方法实例

    vite项目添加eslint prettier及husky方法实例

    这篇文章主要为大家介绍了vite项目添加eslint prettier及实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 关于Vue 消除Token过期时刷新页面的重复提示问题

    关于Vue 消除Token过期时刷新页面的重复提示问题

    很多朋友在token过期时刷新页面,页面长时间未操作,再刷新页面时,第一次弹出“token失效,请重新登录!”提示,针对这个问题该怎么处理呢,下面小编给大家带来原因分析及解决方法,一起看看吧
    2021-07-07
  • 基于vue如何发布一个npm包的方法步骤

    基于vue如何发布一个npm包的方法步骤

    这篇文章主要介绍了基于vue如何发布一个npm包的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • vue使用npm发布自己的公网包

    vue使用npm发布自己的公网包

    本文主要介绍了vue使用npm发布自己的公网包,通过创建一个简单的npm包,本文详细阐述了从创建到发布的整个过程,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • vue resource发送请求的几种方式

    vue resource发送请求的几种方式

    这篇文章主要介绍了vue resource发送请求的几种方式,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue3中路由传参query、params及动态路由传参详解

    vue3中路由传参query、params及动态路由传参详解

    vue3中的传参方式和vue2中一样,都可以用query和params传参,下面这篇文章主要给大家介绍了关于vue3中路由传参query、params及动态路由传参的相关资料,需要的朋友可以参考下
    2022-09-09
  • vue代理如何配置重写方法(pathRewrite与rewrite)

    vue代理如何配置重写方法(pathRewrite与rewrite)

    这篇文章主要介绍了vue代理如何配置重写方法(pathRewrite与rewrite),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue中el-select中多选回显数据后没法重新选择和更改的解决

    vue中el-select中多选回显数据后没法重新选择和更改的解决

    本文主要介绍了vue中el-select中多选回显数据后没法重新选择和更改解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论