Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确设置Vuetify框架的两个导航抽屉?_Javascript_Vue.js_Vue Component_Vuetify.js_Vue Props - Fatal编程技术网

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

Javascript 如何正确设置Vuetify框架的两个导航抽屉?,javascript,vue.js,vue-component,vuetify.js,vue-props,Javascript,Vue.js,Vue Component,Vuetify.js,Vue Props,在我的Vue.JS应用程序中,我试图使用Vuetify框架的两个v-navigation-drawer。出于某种原因,我的下一个代码会引发一个错误。在我的例子中,每个边栏都在一个单独的组件中。如何修正这种错误 错误: <template> <div> <v-app-bar app> <v-btn icon @click.stop="openLeftNavigationDrawer=!openLeft

在我的
Vue.JS
应用程序中,我试图使用
Vuetify
框架的两个
v-navigation-drawer
。出于某种原因,我的下一个代码会引发一个错误。在我的例子中,每个边栏都在一个单独的组件中。如何修正这种错误

错误:

<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>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    left>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'LeftNavigationDrawer',
  props: {
    open: false
  }
}
</script>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    right>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'RightNavigationDrawer',
  props: {
    open: false
  }
}
</script>
vue.esm.js?efeb:628[vue warn]:避免直接变异道具,因为 只要父组件 重新渲染。相反,使用基于 道具的价值。道具变异:“打开”

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">
    </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>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    left>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'LeftNavigationDrawer',
  props: {
    open: false
  }
}
</script>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    right>
  </v-navigation-drawer>
</template>

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

mdi映射时钟大纲
mdi过滤器
从“../elements/LeftNavigationDrawer”导入LeftNavigationDrawer
从“../elements/RightNavigationDrawer”导入RightNavigationDrawer
导出默认值{
名称:“BaseLayout”,
组成部分:{
左导航抽屉,
右导航抽屉
},
数据:函数(){
返回{
openLeftNavigationDrawer:false,
openRightNavigationDrawer:false
}
}
}
LeftNavigationDrawer.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">
    </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>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    left>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'LeftNavigationDrawer',
  props: {
    open: false
  }
}
</script>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    right>
  </v-navigation-drawer>
</template>

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

导出默认值{
名称:'LeftNavigationDrawer',
道具:{
开放:假
}
}
RightNavigationDrawer.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">
    </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>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    left>
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'LeftNavigationDrawer',
  props: {
    open: false
  }
}
</script>
<template>
  <v-navigation-drawer
    v-model="open"
    absolute
    right>
  </v-navigation-drawer>
</template>

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

导出默认值{
名称:“RightNavigationDrawer”,
道具:{
开放:假
}
}

LeftNavigationDrawer
RightNavigationDrawer
组件中,当您编写
v-model=“open”
时,它允许
v-navigation-drawer
组件更改
open
的值

但是,在VueJS中,不允许组件更改其道具的值。只有父母才能这样做。由于,
open
是一个道具,而
v-navigation-bar
正试图更改它,因此您会看到错误
避免对道具进行变异…

为了修复它,您可以在组件中定义发送到
v-navigation-drawer
数据。大概是这样的:

// 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>
  • 在HTML中,您将侦听
    抽屉打开事件
  • 在事件处理程序中,传递2个参数:一个是抽屉是左还是右。另一个参数是从组件接收的值
  • 根据抽屉是左还是右,可以在
    BaseLayout.vue

谢谢您的回答!我注意到小(
600px><960px
)屏幕设备中的奇怪行为。假设我打开右侧导航抽屉,然后单击需要打开左侧导航抽屉的左侧按钮。在这种情况下,右导航抽屉关闭,左导航抽屉打开。在这种情况下,
openRightNavigationDrawer
变量的值没有改变。我需要在小屏幕设备中更改该值。你对这种行为有什么想法吗?我不知道为什么,但是从来没有调用过
handleDrawerChange
方法。@NurzhanNogerbek我无法重现你的场景。这是一个包含您的代码的代码箱:。在此
中,将调用handleDrawerChange
。你能用叉子叉这个问题并尝试复制你的问题吗?也请考虑通过点击<代码>蜱< /COD>图标来接受我的答案,这样它可以帮助社区中的其他开发者,注意你不需要2个抽屉。您只需创建一个抽屉(NavigationDrawer)并将右侧导航抽屉的
属性设置为true。更好的方法是直接在
BaseLayout.vue
中使用
v-navigation-drawer
,并且没有额外的drawer组件。