vue组件的五种传值方法(父子\兄弟\跨组件)

简介: vue组件的五种传值方法(父子\兄弟\跨组件)

一、props/$emit父子组件传值:

父传子 (自定义属性 props)
父组件向子组件传参,通过自定义属性的方式进行传参,在子组件中使用prop定义自定义的属性,然后在父组件中通过v-bind指令把需要传递的数据绑定在子组件上,那在子组件中props里面的自定义属性可以直接使用。

//父组件代码   渲染子组件
<Son  :name="name" />

 // 子组件代码,接受父参数
export default {
   
  props: {
   
    name:{
   
                type:String,
                default:"我是默认字符串"//定义参数默认值
                required:false//定义参数是否必须值
            }
  }
}

子传父 (自定义事件 this.$emit)
子组件向父组件传数据使用自定义事件, vue 组件提供了一个emit(‘自定义事件名’, 传递的数据) ),子组件传递数据时,触发响应的事件函数,就会自动触发通过$emit给父组件绑定的自定义事件,自定义事件接受一个参数,参数就是子组件传递过来的数据。

// 父组件代码,渲染子组件
<Son   @setValue="valueFn" />
export default{
   
  method:{
   
    valueFn(value) {
   }
  }
}
// 子组件代码
this.$emit('setValue', this.say)

二、ref与parent/children父子组件传值:

父传子

//父组件
<Home ref="home"></Home>
<button @click="toValue">点击</button>
methods:{
   
  toValue(){
   
          this.msg = "这是父组件的值";
          this.$refs.home.setMsg(this.msg);
   }
}
//子组件
<div class="home">
      {
   {
   msg}}
 </div>
    methods:{
   
        setMsg(val){
   
            this.msg = val;
        }
    }

子传父(如果子组件是公共组件,需判断父组件是否具有该方法)
//父组件
<Home ref="home"></Home>
methods:{
   
  toValue(val){
   
          this.msg = val

   }
}
//子组件
<div class="home">
<button @click="setMsg">点击</button>
 </div>
    methods:{
   
        setMsg(val){
   
             this.$parent.toValue(this.msg);
        }
    }

三、兄弟之间传参
兄弟组件之间的数据传递,通过eventBus来做中间的桥梁,传输方通过中间组件调用 emit 传数据,接收方通过on 接受数据,两者之间的自定义属性名保持一致。

// 传输方组件调用方式
import Bus from '@/EventBus.js'
Bus.$emit('pass-value', this.say);

// 接收方接受参数
import Bus from '@/EventBus.js'

created() {
   
  Bus.$on('pass-value', val => {
   
     this.sibilingValue = val;
  })
}

四 $attrs/$listeners隔代组件传值(爷孙组件参数互传)

$attrs

1.包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外);
2.当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=“$attrs” 传入内部组件。通常配合 interitAttrs 选项一起使用。
$listeners
1.包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。
2.它可以通过 v-on=“$listeners” 传入内部组件。
简单来说:$attrs 与$listeners是两个对象,$attrs 里存放的是父组件中绑定的非 Props 属性,$listeners 里 存放的是父组件中绑定的非原生事件。
爷传孙($attrs)

    //爷组件
    <div id="app">
      <Home :msg="msg"></Home>
    </div>
    //父组件(父组件的操作最简单,但不做就会传不过去)

    <div class="home">
      <Sun v-bind="$attrs"></Sun>
    </div>
    //孙组件
    <div class="sun">
      {
   {
    msg }}
    </div>
    //props直接接受 
    props:{
    msg:String, }

孙传爷($listeners)

//爷组件
    <div id="app">
      <Home @setVal="setVal">></Home>
    </div>
    methods:{
    setVal(val){
    this.msg = val; } }
    //父组件(父组件的操作最简单,但不做就会传不过去)

    <div class="home">
      <Sun v-on="$listeners"></Sun>
    </div>
    //孙组件
    <div class="sun">
      <button @click="toVal">点我</button>
    </div>
    methods:{
    toVal(){
    this.$emit("setVal",this.msg) } }

五、通过Vuex数据共享

通过Vuex存储数据, Vuex是一个专为vue.js 应用程序开发的状态管理模式, 它采用集中式存储管理数据,以相应的规则保证状态以一种可预测的方式发生改变, 一变全变,同步更新数据。

// 注册代码
const store = new Vue.Store({
   
  state:{
   
    count: 100
  },
  mutations: {
   
    addCount(state, val = 1) {
   
      state.count += val;
    }subCount(state, val = 1) {
   
      state.count -= val;
    }
  }
})

// 组件调用
this.$store.commit('addCount');  // 加 1
this.$store.commit('subCount');  // 减 1
相关文章
|
4天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
57 1
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
516 0
|
2月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
96 0
|
2月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
221 1
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
730 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
524 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
357 17