在我的Vue.JS应用程序中,我尝试使用两个v-navigation-drawer of Vuetify框架。由于某些原因,我的下一段代码会引发一个错误。在我的例子中,每个侧边栏都在一个单独的组件中。如何纠正这样的错误?
错误:
vue.esm.js?efeb:628 Vue警告:避免直接更改支柱,因为每当父组件重新呈现时,值都会被覆盖。相反,使用基于支柱值的数据或计算属性。道具变异:“打开”
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>LeftNavigationDrawer.vue:
<template>
<v-navigation-drawer
v-model="open"
absolute
left>
</v-navigation-drawer>
</template>
<script>
export default {
name: 'LeftNavigationDrawer',
props: {
open: false
}
}
</script>RightNavigationDrawer.vue:
<template>
<v-navigation-drawer
v-model="open"
absolute
right>
</v-navigation-drawer>
</template>
<script>
export default {
name: 'RightNavigationDrawer',
props: {
open: false
}
}
</script>发布于 2019-12-03 06:54:39
在您的LeftNavigationDrawer和RightNavigationDrawer组件中,在编写v-model="open"时,它允许v-navigation-drawer组件更改open的值。
但是,在VueJS中,组件不允许更改其道具的值。只有家长才能做到这一点。因为,open是一个道具,而v-navigation-bar试图更改它,所以您可以看到错误Avoid mutating a prop...。
为了修复它,您可以在组件中定义发送到data的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>communication)
drawerOpen存储是否打开了drawerOpen的v-navigation-drawer。
open允许您在open支柱发生更改时更改抽屉状态(父级到子级的drawerOpen处理程序允许将新的抽屉状态发送到父组件(子到父组件)(子到父组件))一旦您对左右导航抽屉组件进行了更改,您的BaseLayout.vue将需要侦听drawerOpened事件。
// 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>drawer-opened事件,在事件处理程序中传递BaseLayout.vue中更改适当数据的值。
https://stackoverflow.com/questions/59146023
复制相似问题