为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这个子事件不在父级(Vue)中更新状态

为什么这个子事件不在父级(Vue)中更新状态

一只甜甜圈 2023-03-03 13:12:13
我有一个名为 customize-charts 的组件,其中包含一个 Vuetify 抽屉:<template>  <v-col>    <v-btn style="float: right" class="mr-4 mt-2" small @click="toggleCustomize"  v-if="!open">Customize Dashboard</v-btn>    <v-navigation-drawer      v-model="open"      temporary      absolute      right      style="width: 25vw"    >      <span>draw contents</span>      <v-divider />    </v-navigation-drawer>  </v-col></template><script>export default {  props: {    data: {      type: Array,      default () { return [] }    },    open: {      type: Boolean,      default () { return false }    }  },  data () {    return {      draggingItem: null    }  },  methods: {    toggleCustomize () {      this.$emit('open')    }  }}</script>如您所见,抽屉正在监听的布尔值称为“打开”,它是从父级传递的:  <customize-charts v-if="chartCards.length" :data="chartCards" :open="customizePanel" @updateorder="updateOrder" @toggleshow="toggleShow" @open="customizePanel=!customizePanel"/> 父母还有以下内容:{  data () {    return {       customizePanel: false,    }  }} 我的问题是,当open调用自定义事件 (@open="customizePanel=!customizePanel") 时,抽屉会打开,但当它关闭时(用户在抽屉外单击)它不会设置为customizePanelfalse。我怎样才能做到这一点?
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

问题是您正在使用 prop openwith v-model. Props 仅设计为一种数据绑定方式(将数据从父级传递给子级),您不应该修改它在子组件中的值(如果您打开浏览器开发工具,我相信您会看到来自 Vue 的很好的警告,对此进行了解释)因为新值将在下次重新渲染时被父值覆盖...


只需将计算属性用于v-model:


computed: {

  isOpen: {

   get() { return this.open }, // return prop value

   set() { this.$emit('open') } // emit event and change prop value in parent's event handler - new value gets propagated back to child

  }

}


查看完整回答
反对 回复 2023-03-03
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信