【问题标题】:Switch Vuetify navigation drawer to mini and then temporary将 Vuetify 导航抽屉切换到迷你,然后是临时的
【发布时间】:2019-10-21 10:04:54
【问题描述】:

我在 Vue.js 中有一个项目,我正在使用 Vuetify。我有一个工具栏和导航抽屉。我想要的是在桌面上打开抽屉时。如果用户单击侧面图标,抽屉将切换到迷你。

如果在 md 上,抽屉会切换到 mini。如果用户点击侧边图标,迷你会切换回抽屉

如果打开 sm 或降低导航抽屉切换到临时

我有大部分作品,但是当我单击侧面图标时出现错误。 Computed property 'mini' was assigned to but it has no setter.

这是我的代码:

<v-toolbar 
    :clipped-left="$vuetify.breakpoint.mdAndUp"
    :app="$vuetify.breakpoint.mdAndUp"
    :fixed="$vuetify.breakpoint.mdAndUp"
    flat 
    fixed
    :scroll-toolbar-off-screen="$vuetify.breakpoint.smAndDown"
    :scroll-threshold="50">

    <v-toolbar-side-icon @click.stop="mini = !mini">
    </v-toolbar-side-icon>

    <v-toolbar-title class="text-uppercase">
        <span class="font-weight-light">LOGO</span>
    </v-toolbar-title>
    <v-spacer></v-spacer>
    <v-toolbar-items class="">
        <v-btn icon v-for="item in menu" :key="item.icon">
            <v-icon>{{item.icon}}</v-icon>
        </v-btn>
    </v-toolbar-items>
</v-toolbar>

<v-navigation-drawer 
    clipped 
    :mini-variant="mini"
    v-model="drawer"
    :permanent="$vuetify.breakpoint.mdOnly"
    :temporary="$vuetify.breakpoint.smAndDown"
    app
    hide-overlay>

    <v-list dense>
        <v-list-tile
            v-for="(item, index) in items"
            :key="index"
        >
            <v-list-tile-action>
                <v-icon>{{ item.icon }}</v-icon>
            </v-list-tile-action>

            <v-list-tile-content>
                <v-list-tile-title>{{ item.title }}</v-list-tile-title>
            </v-list-tile-content>
        </v-list-tile>
    </v-list>
</v-navigation-drawer>

我已经用我目前拥有的东西创建了一个代码笔:

https://codepen.io/jsd219/pen/gJJMPQ

【问题讨论】:

    标签: vue.js vuejs2 vuetify.js


    【解决方案1】:

    问题是你试图修改计算属性mini

    要改变计算属性,您需要提供computed setter

    computed: {
        mini: {
            get() {
               // get logic
            },
            set(value) {
               // set logic
            }
        }
    }
    

    在您的情况下,如果基于 $vuetify.breakpoint.mdAndDown,您的计算属性 mini 返回 true 或 false。您需要包含一个新变量,例如 overwriteBreakpoint 并在您的设置器中使用它。

    data() => ({
        overwriteBreakpoint: true
    }),
    computed: {
        mini: {
            get() {
               return this.$vuetify.breakpoint.mdAndDown || this.overwriteBreakpoint;            
            },
            set(value) {
               this.overwriteBreakpoint = value;
            }
        }
    }
    

    这是一个例子:https://codepen.io/dormenog/pen/MddbMY?editors=1011

    更新:

    要使这项工作适用于多种屏幕尺寸,您需要就导航栏的每个道具何时应为truefalse 制定明确的规则。这将很快变得非常混乱,并且跟踪状态的好处并不真正有价值,因为屏幕不会在用户设备上实时改变大小。

    我建议将导航栏的内容分成一个组件,并用多个 &lt;v-navigation-drawer /&gt; 包装它,只有在屏幕尺寸正确的情况下才会由 vue 呈现。这可以使用v-ifv-else 来实现。

    【讨论】:

    • 我实际上只是在您发布之前添加了该内容。 :) 我不再收到错误消息,但是当我单击侧面图标时,什么也没有发生。有什么想法吗?
    • 我不能再在侧面图标上使用:@click.stop="mini = !mini 吗?如果屏幕大小发生变化,但在点击操作上没有变化,则计算的属性会起作用
    • 重新加载并再次检查:)。它的固定
    • 好的,这太棒了!它几乎可以完全发挥作用。现在,当屏幕尺寸发生变化时,导航永远不会回到抽屉
    【解决方案2】:

    您正在尝试将计算属性分配给自身:

    @click.stop="mini != mini"
    

    你真的不想这样做。要找出原因,您需要阅读 JS setter 和 getter。

    如果您希望计算 mini 来确定您的 &lt;navigation-drawer&gt; 是否被缩小,请为您的信息使用两个单独的占位符:

    • 菜单是否被强制打开(称为menuOpen),最初在data()中定义为false,然后被你的@click.stop="menuOpen != menuOpen"覆盖
    • 还有一个来自$vuetify.breakpoint.mdAndUp。叫它mdAndUp

    所以你的mini 变成:

      mini() {
        return !(this.mdAndUp|| this.menuOpen);
      }
    

    here

    【讨论】:

    • 这很接近。目标是在桌面上,菜单打开,侧面图标将其切换为迷你。在 md 大小的设备上,菜单切换到 mini,侧图标将其切换回打开状态,最后在 sm 和 xs 设备上,菜单关闭并转换为 temporay。单击侧面图标时,菜单打开
    • 现在当屏幕尺寸变为 md 时,菜单不会切换到 mini。仅供参考:我在数据对象中更改了menuOpen: true,
    • 这是简单的 JavaScript 逻辑,你可以自己做。我告诉过你潜在的问题是什么(你试图分配给一个吸气剂)。我是来帮助你学习的,但我不能被雇用。此外,考虑到代码的复杂程度,您的请求现在已经触手可及。恕我直言,你会从这里学到更多。如果到明天你还没有工作,我会回来帮你解决任何你觉得太有挑战性的事情。
    猜你喜欢
    • 2021-06-14
    • 2020-07-13
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2019-01-09
    • 2019-06-05
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多