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


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

    父传子 (自定义属性 props)

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

    1. //父组件代码 渲染子组件
    2. <Son :name="name" />
    3. // 子组件代码,接受父参数
    4. export default {
    5. props: {
    6. name:{
    7. type:String,
    8. default:"我是默认字符串"//定义参数默认值
    9. required:false//定义参数是否必须值
    10. }
    11. }
    12. }

    子传父 (自定义事件 this.$emit)

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

    1. // 父组件代码,渲染子组件
    2. <Son @setValue="valueFn" />
    3. export default{
    4. method:{
    5. valueFn(value) {}
    6. }
    7. }
    8. // 子组件代码
    9. this.$emit('setValue', this.say)

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

    父传子

    1. //父组件
    2. <Home ref="home"></Home>
    3. <button @click="toValue">点击</button>
    4. methods:{
    5. toValue(){
    6. this.msg = "这是父组件的值";
    7. this.$refs.home.setMsg(this.msg);
    8. }
    9. }
    10. //子组件
    11. <div class="home">
    12. {{msg}}
    13. </div>
    14. methods:{
    15. setMsg(val){
    16. this.msg = val;
    17. }
    18. }

    子传父(如果子组件是公共组件,需判断父组件是否具有该方法)

    1. //父组件
    2. <Home ref="home"></Home>
    3. methods:{
    4. toValue(val){
    5. this.msg = val
    6. }
    7. }
    8. //子组件
    9. <div class="home">
    10. <button @click="setMsg">点击</button>
    11. </div>
    12. methods:{
    13. setMsg(val){
    14. this.$parent.toValue(this.msg);
    15. }
    16. }

    三、兄弟之间传参

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

    1. // 传输方组件调用方式
    2. import Bus from '@/EventBus.js'
    3. Bus.$emit('pass-value', this.say);
    4. // 接收方接受参数
    5. import Bus from '@/EventBus.js'
    6. created() {
    7. Bus.$on('pass-value', val => {
    8. this.sibilingValue = val;
    9. })
    10. }

    四 $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)

    1. //爷组件
    2. <div id="app">
    3. <Home :msg="msg"></Home>
    4. </div>
    5. //父组件(父组件的操作最简单,但不做就会传不过去)
    6. <div class="home">
    7. <Sun v-bind="$attrs"></Sun>
    8. </div>
    9. //孙组件
    10. <div class="sun">
    11. {{ msg }}
    12. </div>
    13. //props直接接受
    14. props:{ msg:String, }

    孙传爷($listeners)

    1. //爷组件
    2. <div id="app">
    3. <Home @setVal="setVal">>
    4. </div>
    5. methods:{ setVal(val){ this.msg = val; } }
    6. //父组件(父组件的操作最简单,但不做就会传不过去)
    7. <div class="home">
    8. <Sun v-on="$listeners"></Sun>
    9. </div>
    10. //孙组件
    11. <div class="sun">
    12. <button @click="toVal">点我</button>
    13. </div>
    14. methods:{ toVal(){ this.$emit("setVal",this.msg) } }

    五、通过Vuex数据共享

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

    1. // 注册代码
    2. const store = new Vue.Store({
    3. state:{
    4. count: 100
    5. },
    6. mutations: {
    7. addCount(state, val = 1) {
    8. state.count += val;
    9. },
    10. subCount(state, val = 1) {
    11. state.count -= val;
    12. }
    13. }
    14. })
    15. // 组件调用
    16. this.$store.commit('addCount'); //1
    17. this.$store.commit('subCount'); //1

     

  • 相关阅读:
    uniapp 原生sqlite本地数据库管理 Ba-Sqlite
    Win11显示麦克风未插上怎么办?Win11显示麦克风未插上的解决方法
    【SpringBoot笔记18】SpringBoot实现统一异常处理、统一结果响应、统一参数校验
    Redis 分布式锁
    树莓派断网自动连接
    Windows 10 安装配置WSL2(Ubuntu 20.04)教程
    tomcat 问题
    python基于轻量级卷积神经网络模型开发构建眼疾识别系统
    【自用】三阶段项目-起步
    jacoco的学习以及理解
  • 原文地址:https://blog.csdn.net/qq_44693047/article/details/127841464