基于element的场景解决

47 阅读3分钟

场景-中断列表选择

场景描述

  • 背景
    • 基于element的Vue2项目的一个模块中页面1中组件1中使用子组件1,子组件1封装了el-table,开启多选模式,呈现数据。
  • 需求
    • 在多选选中不同列表项时,满足一定条件不可再选中,如选中24个后,不可再选择。
  • 旧版解决方案
    • 在点击选中的业务函数中进行if判断,符合中断条件则return。
  • 结果
    • 该行依然被选中。

技术背景

  • nextTick
  • el-table
    • toggleRowSelection
    • ref

方案解决

  • 解决思路
    • el-table中的选中状态是独立管理的,处理逻辑中的return不干涉UI,不会影响选中状态。
    • 回滚思路。当满足中断条件后,手动移除刚刚选中的行。
      • 结合el-table的toggleRowSelection方法强制取消选中状态。
  • 其他
    • 为了保证状态的同步,需要在DOM更新后手动强制取消选中状态。
      • 结合nextTick方法。

参考资料

场景-异步数据加载和模板渲染时序

场景描述

  • 需求。使用el-form表单。在created中尝试调用API发起异步请求,获取数据,然后模板表单项中显示数据。
  • 结果。数据获取前模板已完成渲染。控制台报错。

技术背景

  • el-form
  • v-if

方案解决

  • v-if解决
    • formData是响应式数据。初始时formData=null,借助v-if判断决定el-form是否使用。在API成功获取数据后,赋值formData,依据响应式和v-if,el-form在模板渲染出异步数据。
    • 用户体验优化。loading

参考资料

场景-切换标签页同时复用组件

场景描述

  • 设置每个收款主体的支付宝微信等账户,实现增加、修改账户功能。支付宝和微信账户字段有异同。

技术背景

  • Vue指令
  • props
  • el-tabs

方案解决

  • 封装账户详情组件AccountDetail.vue,其中根据v-if、v-else指令和props属性,复用账户详情组件,根据props结合v-if来实现组件级权限控制。
  • 封装账户管理组件AccountManagement.vue,使用el-tabs,结合v-if用标签页管理多个账户详情组件。
    • 向不同的账户详情组件传递账户名称accountName,辅助实现组件级权限控制。

参考资料

场景-菜单项内部调转后,子菜单保持高亮

场景描述

  • el-menu高亮菜单,通过:default-active="$route.path",根据当前路由高亮菜单项。
  • 问题。菜单项的页面内部可以点击按钮,跳转路由,但是跳转的路由不在el-menu的菜单数据中,所以不会高亮。但跳转路由同样属于该菜单项的业务,应该保持该菜单项的高亮。

技术背景

  • 时序
    • 点击。
    • Vue Router执行路由守卫,加载目标组件。
      • route.push触发。开始切换路由,route.push触发。开始切换路由,route未更新。
    • 路由切换完成,$route更新为新路由。
      • $route.path为新路由。
    • dispatch更新Vuex。
    • 父组件重新渲染。
    • 高亮。
  • el-menu
  • store

方案解决

  • 高亮菜单的属性值为store中的数据成员activeMenu。监听路由变化,对于要跳转的路由,判断是否在菜单路由中,若在,则store更新aciveMenu。el-menu根据activeMenu高亮显示当前菜单项。
  • 注意
    • dispatch和router.push是异步,需要控制时序。故dispatch需要在监听router.push是异步,需要控制时序。故dispatch需要在监听route变化后再更新,确保更新值为最新路由。

参考资料