zoukankan      html  css  js  c++  java
  • Vue学习(二)-Vue中组件间传值常用的几种方式

    版本说明:vue-cli:3.0

    主要分为两类:

      1.父子组件间的传值

      2.非父子组件间的传值

    1.父子组件间传值

      父组件向子组件传值

      第一种方式:

          props   

          父组件嵌套的子组件中,使用v-bind:msg=‘xxxx’进行对象的绑定,子组件中通过定义props接收对应的msg对象如图

          父组件代码

    <template>
      <div>
        <!-- 注意  :msg 后面是一个对象,值是字符串时,需要写冒号,如果省略:就是一个字符串 -->
        <!-- <m-child msg="from Parent msg" ></m-child> -->
        <m-child v-bind:msg="'from Parent msg'" ></m-child>
      </div>
    </template>
    
    <script>
    // 引入子组件
    import MChild from './Child'
    export default {
      data () {
        return {
          msg: ''
        }
      },
      components: {
        MChild,
      },

         子组件代码

    <template>
      <div>
        <h5>{{msg}}</h5>
      </div>
    </template>
    
    <script>
    export default {
      // 要接受父组件传递的参数
      props: {
        msg: {
          type: String,
          default: ''
        },
      },

      第二种方式:

         使用$children获取子组件和父组件对象

         父组件代码:

     this.msg2=this.$children[0].msg

      第三种方式:

         使用$ref获取指定的子组件

            父组件代码:

    
    
      <m-child v-bind:msg="p2C" @showMsg='getChild' ref='child'></m-child>
    this.c2P=this.$refs.child.msg33

      子组件向父组件传值

      第一种方式:

         使用$emit传递事件给父组件,父组件监听该事件

           子组件代码      

    <button @click="pushMsg()"></button>
    methods: {
        pushMsg() {
          this.$emit("showMsg", "这是子组件===>父组件的值");
        }
      },

          父组件代码

    <m-child v-bind:msg="p2C" @showMsg='getChild' ref='child'></m-child>
      methods: {
            getChild(val) {
                this.msg=val
            },
    }

      第二种方式:

         使用$parent.获取父组件对象,然后再获取数据对象

         子组件代码

      mounted() {
        this.msg22 = this.$parent.msg2;
      }

            

    二.非父子组件间传值

      1.事件总线

        原理上就是建⽴立⼀一个公共的js⽂文件,专⻔门⽤用来传递消息

        bus.js

    import Vue from 'vue'
    export default new Vue

        在需要传递消息的地⽅方引⼊入

    mport bus from './util/bus'
    methods: {
    passMsg () {
    bus.$emit('msg', 'i am from app')
    }
    },

          传递消息,在需要接受消息的地方使用bus.$on接受消息

    mounted () {
        bus.$on('msg', (val) => {
          this.childMsg = val
        });

      2.$sttrs/listeners 用于多级组件间传值的问题

         解决多级组件间传值的问题
         $attr 将⽗父组件中不不包含props的属性传⼊入⼦子组件,通常配合 interitAttrs 选项

        组件A传递到组件C,使用组件B作为桥梁A-B-C

    组件A
    <template> <div id="app"> <!-- this is app --> <m-parent :msg="a" :msgb="b" :msgc="c"></m-parent> </div> </template>

         组件B

    <template>
      <div>
        <m-child  v-bind="$attrs"></m-child>
      </div>
    </template>

        组件C    注意:如果组件C中有props属性接受的对象的化,组件A传递的对象就会被自动过滤掉

    
    
    props: {
    msg: {
    type: String,
    default: ''
    },
    }
    
    
     mounted () {
        console.log('attrs',this.$attrs)
      }


        一起使用。
        如果不不想在dom上出现属性,可设置interitAttrs: false
         $listeners监听⼦子组件中数据变化,传递给⽗父组件

      3.vuex

      

  • 相关阅读:
    PAT乙级1002. 写出这个数 (20)
    PAT乙级1001. 害死人不偿命的(3n+1)猜想 (15)
    HDU 4520 小Q系列故事——最佳裁判
    POJ 3414 Pots(BFS)
    POJ 1118 Lining Up
    POJ 2484 A Funny Game
    POJ 2231 Moo Volume
    HDU 5718 Oracle(高精度)
    FZU 1502 Letter Deletion(DP)
    HDU 1564 Play a game
  • 原文地址:https://www.cnblogs.com/july-sunny/p/11687008.html
Copyright © 2011-2022 走看看