首页 > 其他分享 >Vue中父组件向子组件传值无法响应props的变化

Vue中父组件向子组件传值无法响应props的变化

时间:2022-10-24 15:01:05浏览次数:47  
标签:向子 Vue isEditorShowing isEditorShow editor props 组件 true

父组件:

<template>    
        <q-btn
          round
          color="pink-4"
          size="0.9em"
          text-color="white"
          dense
          icon="add"
          @click="addYunpanItem"
        />
    <wysisyg-editor  :is-editor-show="isEditorShowing" />
</template>
<script>
export default {
  components: { LoginQr, WysisygEditor },
  name: 'YunpanLayout',

  data() {
    return {
      isEditorShowing: false,
    };
  },
  methods: {

    addYunpanItem() {
      console.log('this isEditorShowing is ' + this.isEditorShowing);
      this.isEditorShowing = true;
    },
 }
</script>

子组件:

<template>
  <q-dialog v-model="isEditorShow" @hide="dialogHide">
    <q-card class="full-width YL__editor_card">
      <q-bar>
        <q-space />
        <q-btn dense flat icon="close" v-close-popup>
          <q-tooltip>Close</q-tooltip>
        </q-btn>
      </q-bar>
    </q-card>
  </q-dialog>
</template>
<style lang="sass">
.YL
  &__editor_card
    @media(min-width: $breakpoint-xs-max)
      width: 600px
</style>
<script>
export default {
  name: 'WysisygEditor',
  data() {
    return { post: { body: '' } };
  },

  props: ['isEditorShow'], // 微信auth code

  mounted() {
    console.log('WysisygEditor is mounted');
  },

  methods: {
    dialogHide() {},
  },
};
</script>

其中子组件的props isEditorShow控制子组件的显示,但是只有第一次点击按钮时this.isEditorShowing=true时才显示,第二次点击就不行了。我觉的可能是第一次点击this.isEditorShowing由false变成true,子组件重新渲染。但把dialog隐藏时只是子组件prop isEditorShow变回了false,父组件的isEditorShowing还是true,所以第二次点击时由于isEditorShowing已经是true,所以子组件没有重新渲染。所以就失效了。所以当子组件dialog隐藏时,需要把父组件的isEditorShowing设为false。

改成下面代码:

父组件:

<template>
        <q-btn
          round
          color="pink-4"
          size="0.9em"
          text-color="white"
          dense
          icon="add"
          @click="addYunpanItem"
        />
      </q-toolbar>
    <wysisyg-editor @editor-show-changed="editorShowChanged" :is-editor-show="isEditorShowing" />

</template>

<script>

export default {
  components: { LoginQr, WysisygEditor },
  name: 'YunpanLayout',

  data() {
    return {
      isEditorShowing: false,
    };
  },

  methods: {
    addYunpanItem() {
      console.log('addYunpanItem ...');
      this.isEditorShowing = true;
    },
    editorShowChanged(value) {
      this.isEditorShowing = value;
    },
  },

子组件:

<template>
  <q-dialog v-model="editorShow" @hide="dialogHide">
    <q-card class="full-width YL__editor_card">
      <q-bar>
        <q-btn dense flat icon="close" v-close-popup>
          <q-tooltip>Close</q-tooltip>
        </q-btn>
      </q-bar>
    </q-card>
  </q-dialog>
</template>
<style lang="sass">
.YL
  &__editor_card
    @media(min-width: $breakpoint-xs-max)
      width: 600px
</style>
<script>
export default {
  name: 'WysisygEditor',
  data() {
    return { post: { body: '' } };
  },
  computed: {
    editorShow: {
      set: function (newV) {
        this.$emit('editor-show-changed', newV);
        // this.isEditorShow = newV;
      },
      get: function () {
        return this.isEditorShow;
      },
    },
  },
  props: ['isEditorShow'], // 微信auth code

  mounted() {
    console.log('WysisygEditor is mounted');
  },

  methods: {
    dialogHide() {}
  },
};
</script>

子组件的dialog关闭时,this.$emit('editor-show-changed', newV); 通知父组件修改isEditorShowing为false,则dialog就隐藏了。这里子组件的v-model改成一个computed 的data,因为原先直接用props时是会警告的。这里子组件隐藏时一定要通知父组件修改传过来的参数值,如果不通知因为没有修改父组件的isEditorShowing一直都是true,不会重新渲染子组件。

 

 

 

标签:向子,Vue,isEditorShowing,isEditorShow,editor,props,组件,true
From: https://www.cnblogs.com/zjhgx/p/16821463.html

相关文章

  • vue2面试题
    面试题3)谈谈对vue生命周期的理解 Vue实例从创建到销毁的过程,就是生命周期,生命周期总共分为三个阶段:初始化、更新、销毁 1)初始化和挂载阶段 *beforeCreate()实例......
  • vue3面試題
    1.面试题(vue2和vue3区别) 1)Vue3中设计了一套强大的组合APi代替了Vue2中的optionAPI,复用性更强了,更好的支持TS Vue2.x的组织代码形式,叫OptionsAPI,而Vue3最大的......
  • vue笔记 11 createElement、Vue3、Vue.config.productionTip = false/true打包时日记
                  面试了解            ......
  • vue中的data为什么是函数
    1.vue中组件是用来复用的,为了防止data复用(同一个组件被复用多次会创建多个实例)。2.vue组件中的data数据都应该是相互隔离,互不影响的,组件每复用一次,data数据就应该被复制一......
  • Vue 中 nextTick 的实现原理是什么
    vue中有一个较为特殊的API,nextTick。根据官方文档的解释,它可以在DOM更新完毕之后执行一个回调,用法如下://修改数据 vm.msg = 'Hello' //DOM还没有更新 Vue.......
  • element日期组件时间范围选择限制
                参考:https://blog.csdn.net/Shids_/article/details/122881216 ......
  • el-cascader组件根据最后一级向上找到父级并设置默认值
    vue+ elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数据,......
  • Feign组件
    一、简介Feign是Netflix开发的声明式,模块化的HTTP客户端1 导入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-star......
  • vue这些原理你都知道吗?(面试版)
    前言在之前面试的时候我自己也经常会遇到一些vue原理的问题,我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来,欢迎大家一起学习交流,有更好的方法......
  • 一文梳理vue面试题知识点
    Vue3.0和2.0的响应式原理区别Vue3.x改用Proxy替代Object.defineProperty。因为Proxy可以直接监听对象和数组的变化,并且有多达13种拦截方法。相关代码如下imp......