zoukankan      html  css  js  c++  java
  • vue父子组件通信高级用法

    子通信父

    父组件

    <template>
      <div class="parent">
        我是父组件
        <!--父组件监听子组件触发的say方法,调用自己的parentSay方法-->
        <!--通过:msg将父组件的数据传递给子组件-->
        <children :msg="msg" @say="parentSay"></children>
      </div>
    </template>
    
    <script>
    import Children from './children.vue'
    export default {
      data () {
        return {
          msg: 'hello, children'
        }
      },
      methods: {
          // 参数就是子组件传递出来的数据
          parentSay(msg){
              console.log(msg) // hello, parent
          }
      },
    
      // 引入子组件
      components:{
          children: Children
      }
    }
    </script>
    

    子组件

    <template>
      <div class="hello">
        <div class="children" @click="say">
          我是子组件
          <div>
            父组件对我说:{{msg}}
          </div>
        </div>
    
      </div>
    </template>
    
    <script>
    
      export default {
          //父组件通过props属性传递进来的数据
          props: {
              msg: {
                  type: String,
                  default: () => {
                      return ''
                  }
              }
          },
          data () {
            return {
                childrenSay: 'hello, parent'
            }
          },
    
          methods: {
              // 子组件通过emit方法触发父组件中定义好的函数,从而将子组件中的数据传递给父组件
              say(){
                  this.$emit('say' , this.childrenSay);
              }
          }
      }
    </script>
    

    子组件使用$emit方法调用父组件的方法,达到子通信父的目的。

    父通信子

    父组件

     <!--html-->
    <template>
       <!--父组件触发click方法-->
      <div class="parent" @click="say">
        我是父组件
        <!--通过ref标记子组件-->
        <children ref="child"></children>
      </div>
    </template>
    
    <script>
    import Children from './children.vue'
    export default {
      data () {
        return {
            msg: "hello,my son"
        }
      },
      methods: {
          // 通过$refs调用子组件的parentSay方法
          say(){
             this.$refs.child.parentSay(this.msg);
          }
      },
    
      // 引入子组件
      components:{
          children: Children
      }
    }
    </script>
    

    子组件

    <template>
      <div class="hello">
        <div class="children" >
          我是子组件
          <div>
            父组件对我说:{{msg}}
          </div>
        </div>
    
      </div>
    </template>
    
    <script>
    
      export default {
          data () {
            return {
                msg: ''
            }
          },
    
          methods: {
              // 父组件调用的JavaScript方法parentSay
              parentSay(msg){
                  this.msg = msg;
              }
          }
      }
    </script>
    

    父组件通过$refs调用子组件的方法。 以上就是父子组件通信的方式,父子组件传递数据直接用props,或者使用$emit和$refs依靠事件来传递数据。  

    父子组件通信提升篇

    上文中,子通信父是在子中触发点击事件然后调用父组件的方法,父通信子是在父中触发点击事件调用子组件的方法。但是实际情况中可能存在子通信父时子组件不允许有点击事件而事件在父中或者父通信子时点击事件在子组件中。

    资源搜索网站大全 https://www.renrenfan.com.cn 广州VI设计公司https://www.houdianzi.com

    子通信父时击事件在父组件

    这种情况其实很常见,例如提交一个表单时表单的内容为子组件,而保存按钮在父组件上。此时点击保存按钮想要获取子组件表单的值。这种情况下已经不单单是子通信父和父通信子了,需要将两者结合在一起使用才能完成整个通信过程。

    实现的思路是在父组件中点击事件时,先通过父子通信调用子组件的方法,然后在子组件中的该方法里使用子父通信调用父组件的另一个方法并将信息传递回来。以下是代码演示:

    父组件

    <template>
      <div class="parent" @click="getData">
        我是父组件
        <!--父组件监听子组件触发的transData方法,调用自己的transData方法-->
        <!--通过ref标记子组件-->
        <children ref="child" @transData="transData"></children>
      </div>
    </template>
    
    <script>
    import Children from './children.vue'
    export default {
      data () {
        return {
          msg: 'hello, children'
        }
      },
      methods: {
          getData(){
              // 调用子组件的getData方法
              this.$refs.child.getData();
          },
          // 参数就是子组件传递出来的数据
          transData(msg){
              console.log(msg) // hello, parent
          }
      },
    
      // 引入子组件
      components:{
          children: Children
      }
    }
    </script>
    

    子组件

    <template>
      <div class="hello">
        <div class="children" >
          我是子组件
          <div>
            子组件的数据:{{childrenSay}}
          </div>
        </div>
    
      </div>
    </template>
    
    <script>
    
      export default {
          data () {
            return {
                childrenSay: 'hello, parent'
            }
          },
          methods: {
              // 子组件通过emit方法触发父组件中定义好的函数,从而将子组件中的数据传递给父组件
              getData() {
                  this.$emit('transData' , this.childrenSay);
              }
          }
      }
    </script>
    

    另一种情况思路也和这个一样,基础就在与父通信子和子通信父的灵活运用。

  • 相关阅读:
    常见数据结构图文详解-C++版
    求单链表中环的起点,原理详解
    Qt Creator 整合 python 解释器教程
    Qt 共享库(动态链接库)和静态链接库的创建及调用
    qt creator 中的"提升为..."功能简介
    QT 操作 excel 教程
    网易2017校园招聘算法题c语言实现源码
    c语言版贪吃蛇小游戏
    mysql语法结构
    Spring MVC rest接收json中文格式数据显示乱码
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/14102159.html
Copyright © 2011-2022 走看看