Vuejs2 Vuetify:导航抽屉:将v型车型更改传达给母公司

Vuejs2 Vuetify:导航抽屉:将v型车型更改传达给母公司,vuejs2,vuetify.js,Vuejs2,Vuetify.js,我使用Vuetify的导航抽屉创建了一个边栏组件。代码如下所示: <template> <v-navigation-drawer persistent clipped v-model="isVisible" fixed app> <!-- content of the sidebar goes here --> </v-navigation-drawer> </template> <script> expo

我使用Vuetify的导航抽屉创建了一个边栏组件。代码如下所示:

<template>
  <v-navigation-drawer persistent clipped v-model="isVisible" fixed app>
    <!-- content of the sidebar goes here -->
  </v-navigation-drawer>
</template>

<script>
export default {
  name: 'Sidebar',
  props: {
    visible: Boolean,
  },
  data() {
    return {
      isVisible: this.visible,
    };
  },
}
</script>

导出默认值{
名称:'侧边栏',
道具:{
可见:布尔,
},
数据(){
返回{
isVisible:this.visible,
};
},
}
请注意,我正在用isVisible数据复制visible道具。我尝试在v模型中直接使用道具,但每次侧边栏关闭时,我都会在控制台中收到一条关于直接更改道具的警告,因为当父级重新渲染时,道具将被覆盖

在父视图中,我在工具栏上有一个按钮,它应该根据工具栏的可见性更改图标

<template>
  <v-container fluid>
    <sidebar :visible="sidebarVisible"/>
    <v-toolbar app :clipped-left="true">
      <v-btn icon @click.stop="sidebarVisible = !sidebarVisible">
        <v-icon v-html="sidebarVisible ? 'chevron_right' : 'chevron_left'"/>
      </v-btn>
    </v-toolbar>
    <v-content>
      <router-view/>
    </v-content>
    <v-footer :fixed="fixed" app>
      <span>&copy; 2017</span>
    </v-footer>
  </v-container>
</template>

<script>
import Sidebar from '@/components/Sidebar.vue';

export default {
  name: 'MainView',
  data() {
    return {
      sidebarVisible: false,
      fixed: false,
      title: 'Title',
    };
  },
  components: {
    Sidebar,
  },
};
</script>

&抄袭;2017
从“@/components/Sidebar.vue”导入侧栏;
导出默认值{
名称:“MainView”,
数据(){
返回{
sidebarVisible:false,
修正:错误,
标题:“标题”,
};
},
组成部分:{
侧边栏,
},
};
我的问题是,如果我通过单击侧边栏外部来关闭侧边栏,工具栏上按钮的图标不会变为V形左。此外,为了恢复侧边栏,我需要点击按钮两次


显然,这是因为侧边栏关闭时,主视图中的侧边栏可见数据不会更新。如何确保边栏关闭时边栏可见被更新?

我正在使用下一个构造

在我的组件中

<template>
  <v-navigation-drawer v-model="localDrawer"></v-navigation-drawer>
</template>
...
<script>
  export default {
    props: { value: { type: Boolean } },
    data: () => ({
     localDrawer: this.value
    }),
    watch: {
     value: function() {
       this.localDrawer = this.value
     },
     localDrawer: function() {
       this.$emit('input', this.localDrawer)
     }
    }
  }
</script>

...
导出默认值{
属性:{value:{type:Boolean}},
数据:()=>({
localDrawer:this.value
}),
观察:{
值:函数(){
this.localDrawer=this.value
},
localDrawer:function(){
this.$emit('input',this.localDrawer)
}
}
}
在父层中

<app-drawer v-model="drawer"></app-drawer>


这对我来说很有用

Vuetify导航抽屉问题修复:

  • 将浏览器窗口重置为默认值100%
  • 这是密码
  • 模板:

    <nav>
         <v-toolbar flat app>
            <v-toolbar-side-icon class="grey--text" @click="toggle"></v-toolbar-side-icon>
    
            <v-toolbar-title class="text-uppercase grey--text">
              <span class="font-weight-light">Repo</span>
              <span>hub</span>
            </v-toolbar-title>
            <v-spacer></v-spacer>
            <v-btn flat color="grey">
              <span>Sign Out</span>
              <v-icon right>exit_to_app</v-icon>
            </v-btn>
          </v-toolbar>
    
          <v-navigation-drawer app v-model="drawer" class="indigo">
            <p>test</p>
          </v-navigation-drawer>
    </nav>
    

    使用v-bind:value:value从道具绑定抽屉值

    子组件:

    <template>
     <v-navigation-drawer v-bind:value="drawer"></v-navigation-drawer>
    </template>
    
    <script>
    export default {
        props : ['drawer']
    }
    </script>
    
    <template>
    <app-side-bar :drawer="drawer"/>
      <v-app-bar app clipped-left>
          <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
        </v-app-bar>
    </template>
    
    
    导出默认值{
    道具:[“抽屉”]
    }
    
    父组件:

    <template>
     <v-navigation-drawer v-bind:value="drawer"></v-navigation-drawer>
    </template>
    
    <script>
    export default {
        props : ['drawer']
    }
    </script>
    
    <template>
    <app-side-bar :drawer="drawer"/>
      <v-app-bar app clipped-left>
          <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
        </v-app-bar>
    </template>