v-navigation-drawer 在窗口调整大小时掉入失控循环

Posted

技术标签:

【中文标题】v-navigation-drawer 在窗口调整大小时掉入失控循环【英文标题】:v-navigation-drawer drops into a runaway loop on window resize 【发布时间】:2020-01-18 22:31:39 【问题描述】:

首先,让我说 v-navigation-drawer 按预期工作,即:

单击汉堡菜单时,TOGGLE_DRAWER 突变被提交,它切换打开/关闭,更新状态。 在调整窗口大小时,它会在指定的断点处打开/关闭

所以它起作用了。

但是窗口调整大小没有正确切换突变,当我调整窗口大小时,我不断收到 Vuex 突变错误:

我明白为什么会出现此错误 - $store.state.ui.drawer 正在修改器之外进行修改(它是 v-navigation-drawer 的 v-model):

<v-navigation-drawer
        v-model="$store.state.ui.drawer"
        app
        clipped
    >

我认为将状态绑定到 v-model 是一种糟糕的形式。但是,当我尝试使用 get()set() 正确获取/提交突变的方法创建 drawer 计算属性时,浏览器崩溃(可能是因为 set 方法触发了无限循环的提交切换 drawer true /false 到无穷大):

computed:  
            drawer: 
                get () 
                    return this.$store.state.ui.drawer
                ,
                set () 
                    this.$store.commit('TOGGLE_DRAWER') // <--crashes the browser
                
            
        

我一直在寻找解决这个问题的方法。尽管它在视觉上似乎可以正常工作,但它却让我感到烦恼。

我考虑过在stateless 模式下运行 v-navigation-drawer 并手动处理所有窗口调整大小事件和状态更新。我还考虑在 Vuex 中禁用“严格”模式(这会隐藏错误)。但前者要复杂得多,而后者是一个创可贴,需要我在开发中调试洞察力。

【问题讨论】:

【参考方案1】:

这听起来像是 Lodash's debounce 函数的完美候选者。如果您在应用此效果时需要坚持使用 setter/getter,请查看this post;否则,this one 用于任何生命周期钩子上的顺序事件订阅。

【讨论】:

【参考方案2】:

在花了一些时间之后,我想我有一个解决方案。想要分享给其他可能面临 VNavigationDrawer 相同问题的人,使用 Vuex 状态来控制可见性。

@input 事件传递了一个val 参数,其中包括窗口调整大小后抽屉的状态。我创建了一个由以下函数调用的新操作:

<v-navigation-drawer
    :value="$store.state.ui.drawer"
    app
    clipped
    @input="updateDrawer($event)"
>

这里是被调度的动作:

methods: 
    updateDrawer(event) 
        if (event !== this.drawer)  // avoids dispatching duplicate actions; checks for unique window resize event
            this.$store.dispatch('updateDrawer',event)
        
    
,

并且该操作将新的val 提交到 Vuex 存储。

基本上,输入事件能够监视抽屉的更新,并在必要时更新抽屉状态。

您还会在上面看到,我固执地接受使用:value 作为docs suggest,尽管我认为这应该由 v-model 控制。

似乎正在工作 - 调用了正确的事件并适当地更新了状态。

【讨论】:

以上是关于v-navigation-drawer 在窗口调整大小时掉入失控循环的主要内容,如果未能解决你的问题,请参考以下文章

VueJs - Vuetify - v-navigation-drawer 与智能手机的迷你变体

VuetifyJS - 滚动 v-navigation-drawer

在 Unity 中,如何检测窗口是不是正在调整大小以及窗口是不是已停止调整大小

在窗口调整大小时调整图像地图大小

动态调整 pixi 舞台的大小及其在窗口调整大小和窗口加载时的内容

win10软件窗口不能调整宽度?