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组件。