首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地设置两个导航抽屉的Vuetify框架?

如何正确地设置两个导航抽屉的Vuetify框架?
EN

Stack Overflow用户
提问于 2019-12-02 20:13:58
回答 1查看 5.6K关注 0票数 1

在我的Vue.JS应用程序中,我尝试使用两个v-navigation-drawer of Vuetify框架。由于某些原因,我的下一段代码会引发一个错误。在我的例子中,每个侧边栏都在一个单独的组件中。如何纠正这样的错误?

错误:

vue.esm.js?efeb:628 Vue警告:避免直接更改支柱,因为每当父组件重新呈现时,值都会被覆盖。相反,使用基于支柱值的数据或计算属性。道具变异:“打开”

BaseLayout.vue:

代码语言:javascript
复制
<template>
  <div>
    <v-app-bar app>
      <v-btn
        icon
        @click.stop="openLeftNavigationDrawer=!openLeftNavigationDrawer">
        <v-icon>mdi-map-clock-outline</v-icon>
      </v-btn>

      <v-spacer></v-spacer>

      <v-btn
        icon
        @click.stop="openRightNavigationDrawer=!openRightNavigationDrawer">
        <v-icon>mdi-filter</v-icon>
      </v-btn>
    </v-app-bar>

    <left-navigation-drawer
      :open="openLeftNavigationDrawer">
    </left-navigation-drawer>

    <right-navigation-drawer
      :open="openRightNavigationDrawer">
    </right-navigation-drawer>

    <v-content style="padding:unset!important;">
      <slot></slot>
    </v-content>
  </div>
</template>

<script>
import LeftNavigationDrawer from '../elements/LeftNavigationDrawer'
import RightNavigationDrawer from '../elements/RightNavigationDrawer'

export default {
  name: 'BaseLayout',
  components: {
    LeftNavigationDrawer,
    RightNavigationDrawer
  },
  data: function () {
    return {
      openLeftNavigationDrawer: false,
      openRightNavigationDrawer: false
    }
  }
}
</script>

LeftNavigationDrawer.vue:

代码语言:javascript
复制
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    left>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'LeftNavigationDrawer',
  props: {
    open: false
  }
}
</script>

RightNavigationDrawer.vue:

代码语言:javascript
复制
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    right>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'RightNavigationDrawer',
  props: {
    open: false
  }
}
</script>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 06:54:39

在您的LeftNavigationDrawerRightNavigationDrawer组件中,在编写v-model="open"时,它允许v-navigation-drawer组件更改open的值。

但是,在VueJS中,组件不允许更改其道具的值。只有家长才能做到这一点。因为,open是一个道具,而v-navigation-bar试图更改它,所以您可以看到错误Avoid mutating a prop...

为了修复它,您可以在组件中定义发送到datav-navigation-drawer。就像这样:

代码语言:javascript
复制
// RightNavigationDrawer.vue/LeftNavigationDrawer
<template>
  <v-navigation-drawer
    v-model="drawerOpen"
    @input="onInput"
    absolute
    right>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'RightNavigationDrawer',
  props: {
    open: {
       type: Boolean,
       default: false
    }

  },
 data(){
   return {
      drawerOpen: this.open
   }
 },
 watch:{
   open(newVal){
      this.drawerOpen = newVal
   }
 },
 methods:{
   onInput(isOpen){
      this.$emit('drawerOpened', isOpen)
   }
 }
}
</script>

communication)

  • The drawerOpen存储是否打开了drawerOpenv-navigation-drawer

  • 监视open允许您在open支柱发生更改时更改抽屉状态(父级到子级的drawerOpen处理程序允许将新的抽屉状态发送到父组件(子到父组件)(子到父组件))

一旦您对左右导航抽屉组件进行了更改,您的BaseLayout.vue将需要侦听drawerOpened事件。

代码语言:javascript
复制
// BaseLayout.vue
<template>
  <div>
    <v-app-bar app>
      <v-btn
        icon
        @click.stop="openLeftNavigationDrawer=!openLeftNavigationDrawer">
        <v-icon>mdi-map-clock-outline</v-icon>
      </v-btn>

      <v-spacer></v-spacer>

      <v-btn
        icon
        @click.stop="openRightNavigationDrawer=!openRightNavigationDrawer">
        <v-icon>mdi-filter</v-icon>
      </v-btn>
    </v-app-bar>

    <left-navigation-drawer
      :open="openLeftNavigationDrawer"
      @drawer-opened="handleDrawerChange("left", $event)"   // Add these event handlers
    >
    </left-navigation-drawer>

    <right-navigation-drawer
      :open="openRightNavigationDrawer"
      @drawer-opened="handleDrawerChange("right", $event)"
    >
    </right-navigation-drawer>

    <v-content style="padding:unset!important;">
      <slot></slot>
    </v-content>
  </div>
</template>

<script>
import LeftNavigationDrawer from '../elements/LeftNavigationDrawer'
import RightNavigationDrawer from '../elements/RightNavigationDrawer'

export default {
  name: 'BaseLayout',
  components: {
    LeftNavigationDrawer,
    RightNavigationDrawer
  },
  data: function () {
    return {
      openLeftNavigationDrawer: false,
      openRightNavigationDrawer: false
    }
  },
  methods:{
    handleDrawerChange(type, isOpen){
       if(type === "left"){
          this.openLeftNavigationDrawer = isOpen
       }else{
          this.openRightNavigationDrawer = isOpen
       }
    }

  }
}
</script>

  • 在您的HTML中,您侦听drawer-opened事件,在事件处理程序中传递
  • ,传递两个参数:一个是抽屉是左还是右。另一个参数是从component.
  • Based收到的关于抽屉是左还是右的值,您可以在BaseLayout.vue

中更改适当数据的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59146023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档