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>
    

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

  • 相关阅读:
    数据库原理与应用-------------触发器和视图
    Python操作SQLServer示例
    基于python的图片修复程序-可用于水印去除
    Android APK反编译就这么简单 详解
    android官网文档学习笔记
    android散点技术
    读书笔记一
    eclipse的各种错误和解决方法
    css
    响应式设计
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/14102159.html
Copyright © 2011-2022 走看看