vue组件常用的父子、兄弟、跨组件等传值方法

 更新时间:2023年12月02日 09:56:34   作者:冷r  
Vue常用的三种传值方式有: •父传子 •子传父 •非父子传值 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递,熟悉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

到此这篇关于vue组件常用的父子、兄弟、跨组件等传值方法的文章就介绍到这了,更多相关vue组件的传值方法(父子\兄弟\跨组件)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于vue-cli3创建libs库的实现方法

    基于vue-cli3创建libs库的实现方法

    这篇文章主要介绍了基于vue-cli3创建libs库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 基于better-scroll 实现歌词联动功能的代码

    基于better-scroll 实现歌词联动功能的代码

    BetterScroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件,BetterScroll 是使用纯 JavaScript 实现的,这意味着它是无依赖的。本文基于better-scroll 实现歌词联动功能,感兴趣的朋友跟随小编一起看看吧
    2020-05-05
  • 函数式组件劫持替代json封装element表格

    函数式组件劫持替代json封装element表格

    这篇文章主要介绍了为大家函数式组件劫持替代json封装element表格的过程思路及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vue 3 响应式系统中ref 在 reactive 中的自动解包行为解析

    Vue 3 响应式系统中ref 在 reactive 中的自动解包行为

    Vue3中,ref与reactive配合使用时会自动解包,使代码更简洁,响应式系统更智能,替换ref会断开旧连接,浅层reactive/shallowRef不触发解包,但是需注意区分,下面通过示例给大家介绍Vue3响应式探秘:ref 在reactive中的自动解包行为解析,感兴趣的朋友一起看看吧
    2025-07-07
  • vue2 webpack proxy与nginx配置方式

    vue2 webpack proxy与nginx配置方式

    这篇文章主要介绍了vue2 webpack proxy与nginx配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Axios在vue项目中的封装步骤

    Axios在vue项目中的封装步骤

    Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js,是一个第三方插件,第三方异步请求工具库,这篇文章主要介绍了Axios在vue项目中的封装方法,需要的朋友可以参考下
    2022-10-10
  • Vue表格首列相同数据合并实现方法

    Vue表格首列相同数据合并实现方法

    这篇文章主要介绍了Vue实现表格首列相同数据合并的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • vue中轻量级模糊查询fuse.js使用方法步骤

    vue中轻量级模糊查询fuse.js使用方法步骤

    这篇文章主要给大家介绍了关于vue中轻量级模糊查询fuse.js使用方法的相关资料,Fuse.js是一个功能强大、轻量级的模糊搜索库,通过提供简单的 api 调用,达到强大的模糊搜索效果,需要的朋友可以参考下
    2024-01-01
  • Vue项目打包成exe可执行文件的实现过程(无瑕疵,完美版)

    Vue项目打包成exe可执行文件的实现过程(无瑕疵,完美版)

    突然接到公司需求,说客户想让我们把项目直接打包,所以下面这篇文章主要给大家介绍了关于Vue项目打包成exe可执行文件的实现过程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 如何使用Vue进行文件预览与打印功能

    如何使用Vue进行文件预览与打印功能

    这篇文章主要给大家介绍了关于如何使用Vue进行文件预览与打印功能的相关资料,这个功能其实也是自己学习到的,做完也有一段时间了,一直想记录总结一下,需要的朋友可以参考下
    2023-10-10

最新评论