• Vue父组件 和 子组件 相互调用修改参数的问题-解决


    简介:

    我们按照正常流程走一遍:

    当我点击页面的显示窗口会弹出子界面的弹窗,然后当我点击关闭图标或者点击遮罩层都会调用子组件中的onClose方法,然后更改父组件的exchangeShow为false时子组件的弹窗会消失


    使用到了Vant的Popup 弹出层
    在这里插入图片描述


    界面样式:
    在这里插入图片描述

    父组件代码:

    <template>
      <div class="container">
        <div class="exchange">
          <div class="exchange-btn" @click="onPopupShow">点击显示窗口</div>
        </div>
        <!-- 点击显示弹窗 -->
        <Info :show="exchangeShow" />
      </div>
    </template>
    
    <script>
    //引入子组件
    import Info from "./component/index"
    
    export default {
      components: {
        Info
      },
      data() {
        return {
          exchangeShow: false,
        };
      },
      created() {
    
      },
      methods: {
        onPopupShow() {
          console.log("点击显示前的exchangeShow状态",this.exchangeShow)
          this.exchangeShow = true;
          console.log("点击显示完成后的exchangeShow状态",this.exchangeShow)
        },
      },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    子组件代码:

    <template>
      <van-popup v-model="nodeShow" position="center" :style="{width: '80%','border-radius': '4px',}"  @click-overlay="onClose">
        <div class="exchange-popup-close" @click="onClose">
        <van-icon class="exchange-popup-close-icon" name="cross" />
      </div>
      <div class="exchange-header van-hairline--bottom">显示窗口</div>
    
      </van-popup>
    </template>
    
    <script>
    import { Popup } from 'vant';
    export default {
      name: 'test',
      props:{
        show: {
          type: Boolean,
          required:true
        }
      },
      components:{
        Popup
      },
      computed:{
      },
      data(){
        return{
          nodeShow:this.show
        }
      },
      created(){
        console.log("子组件show状态:",this.show)
      },
      methods:{
        onClose() {
          console.log("点击更改父组件的值")
          this.handleShowChange(false);
        },
        handleShowChange(v) {
          this.$emit('update:show', v);
        }
      }
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    测试效果是不是预期想的那样:
    点击按钮,可以看出点击后的状态已经变成true了,那么子组件应该跳出弹窗展示才对
    在这里插入图片描述
    你们的看到这个问题,会怎么描述这个问题?

    1.Vue父组件属性更改子组件值不变


    父组件修改值时,子组件获取的值不变

    解决方式:(监听)

    在子组件中添加监听:

      watch:{
        //父组件传递需要监听的值
        show:{
          deep:true,/*深度监听*/
          handler(newV,oldV){/*newV变化的新值, oldV变化前的值 */
            this.nodeShow=newV
          }
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    演示效果:

    可以看出该结果是正常的
    在这里插入图片描述

    2.子组件通过$emit修改父属性值不成功

    问题二的出现:

    当我点击遮罩关闭窗口后,在点击显示窗口按钮发现没效果了,下面我们分析下,看图理解下

    在这里插入图片描述
    那这个问题怎么描述?

    子组件通过$emit修改父属性值不成功

    在这里插入图片描述

    添加关键字(.sync)

    在使用子组件的绑定属性添加.sync修饰符
    在这里插入图片描述
    修改完看效果

    演示效果:

    在点击显示可以看出状态值已经从false保存true并且弹窗也正常显示了

    在这里插入图片描述

    3.子组件使用$emit调用父组件方法并且传值

    改造子组件:

    在子组件中添加按钮

        <div type="primary" class="exchange-btn button-active gray" @click="onSubmit">
          调用父的方法
        </div>
    
    • 1
    • 2
    • 3

    并且添加点击事件onSubmit
    在这里插入图片描述

    onSubmit方法:

        onSubmit(){
          //调用子组件的事件把参数传递给父方法中
          this.$emit('finish', "演示完成");
        }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    修改父组件:

    添加finish事件,这个事件名称要和子组件中的$emit中的事件名称要一样
    在这里插入图片描述
    这样子组件就可以调用父的方法
    父组件的方法:finishTest(v)v是用于接受子组件的参数值

        finishTest(v){
          console.log("子组件调用父组件方法并且传递参数",v)
        }
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    演示效果:

    可以看出我点击按钮,调用父组件方法已经成功了,并且也把值传递给父组件了

    在这里插入图片描述

  • 相关阅读:
    钉钉事件订阅AES_KEY解密失败踩坑
    一、Flink 1.13 源码解析前导——Akka通信模型
    JS加密/解密之你是否真的明白xss
    Qt OpenGL(二十五)——Qt OpenGL 核心模式-Qt封装的函数实现彩色三角形
    计算机毕业设计(附源码)python学生网上请假系统
    ios 网站打包操作步骤介绍
    nginx 反向代理 与缓存功能
    ArcGIS中查看栅格影像最大值最小值的位置
    Docker 容器
    携手并进 | 云畅科技与华商智造院签署战略合作协议
  • 原文地址:https://blog.csdn.net/qq_45502336/article/details/126429533