踩坑记12 vuex4 module 命名空间 | el-menu 文字超范围显示

2021.8.6

坑39(vuex4、module、命名空间):目标是将原先直接写在store/index.js中的部分与页面布局相关的参数进行模块化集成到store/modules/layout.js中。

文档: Module | Vuex (vuejs.org)

以下是未设置命名空间时(会报warning,见下):

// layout.js

const state={
    //菜单是否水平收起
    isMenuCollapse:false
}

const mutations={
    SET_IS_MENU_COLLAPSE(state,payload){
        state.isMenuCollapse=payload.isMenuCollapse
    }
}

export default {
    // namespaced:true,
    state,
    mutations
}


// index.js

import { createStore } from 'vuex'
import mutations from './mutations'
import actions from './actions'
import ModuleLayout from './modules/layout'

const state={
    //keep-alive缓存的组件名称
    keepComponents: ['Index'],
    //用户名
    userName:'',
}

const store = createStore({
    state,
    mutations,
    actions,
    modules:{
        layout:ModuleLayout
    }
})

export default store

发现warning提示:

runtime-core.esm-bundler.js:38 [Vue warn]: VNode created with invalid key (NaN). VNode type: ul

  at <ElMenu collapse=undefined collapse-transition=false default-active="/index"  ... >

......

经排查,问题出在collapse=undefined上,而在组件的setup中,传递给collapse的响应式参数isMenuCollapse是这样设置的:isMenuCollapse=store.state.isMenuCollapse,也就是说store.state中并无isMenuCollapse参数,用vue devtools可以查看到isMenuCollapse参数位于store.state.layout下。因此对调用将调用的store.state.isMenuCollapse全部改为 store.state.layout.isMenuCollapse。

为什么?查看文档,关于不使用命名空间时的情况有一些介绍:"默认情况下,模块内部的 action 和 mutation 仍然是注册在全局命名空间的——这样使得多个模块能够对同一个 action 或 mutation 作出响应。Getter 同样也默认注册在全局命名空间"。也就是说,无论是否使用命名空间,state都是注册在模块的命名空间下的;namespaced控制的是action、mutation、Getter注册于哪个命名空间

未使用命名空间,读取state与提交commit:

isMenuCollapse=store.state.layout.isMenuCollapse

store.commit('SET_IS_MENU_COLLAPSE',{
    isMenuCollapse:!state.isMenuCollapse
})

使用命名空间,namespaced:true,读取state与提交commit:

isMenuCollapse=store.state.layout.isMenuCollapse //不变

// 不修改的话会报错: [vuex] unknown mutation type: SET_IS_MENU_COLLAPSE
store.commit('layout/SET_IS_MENU_COLLAPSE',{
    isMenuCollapse:!state.isMenuCollapse
})

坑40(el-menu、collapse、el-aside、文字显示):问题发现,当折叠菜单时,菜单项title中的文字内容依然显示,超出了el-menu、显示在el-aside,下方提供了滚动条供翻阅。

解决方法一(有时导致样式变化):使用v-if属性,仅在菜单展开状态下显示文字内容。v-if='!isMenuCollapse'。

解决方法二(推荐):使用css的overflow属性。设置overflow: hidden。

附:由于菜单项title中使用了图片+文字,并设置了基线对齐,即display: flex和align-items: baseline,当使用解决方法一时,文字不再渲染,图片的位置会跑到顶上。故而建议使用方法二。

坑41【暂未填】(el-menu、collapse、el-aside、折叠动画):目前将el-menu嵌套在el-aside中的,el-aside的宽度根据菜单的折叠情况,设置为64px或220px。观察实际渲染的菜单元素,折叠到展开其宽度是瞬变;而在展开转变为折叠时,根据el-menu的collapse-transition属性,true(默认)宽度慢慢变小,false瞬变。

于是一开始的目标使el-aside的宽度随el-menu的宽度变化,提升显示效果的动态感。但之后发现el-menu是非原始元素,使用ref或window.getComputedStyle都无法获取其宽度。

附相关参考: Vue获取元素的宽高_meoncih_的博客-CSDN博客_vue获取元素宽度

因此改变目标:对el-aside添加折叠/展开动画,尽量配合el-menu的折叠/展开速度,达成类似效果。动画效果非必要,之后再做。

by 莫得感情踩坑机(限定)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值