基于vue和flex实现页面可配置组件顺序

需求

已有实现:页面存在A、B、C三个组件按照ABC顺序展示,不支持后台配置顺序 期望改成:组件的顺序支持配置,比如后台配置B,C,A,那么页面的展示顺序为B、C、A

实现

方案实现,需要考虑不能影响到组件原来的逻辑,还需要考虑可扩展性,比如后续迭代新增一个组件D,可以方便地接入本方案。

实现的核心就是利用flex布局的order设置组件的顺序。

假设产品经理/运营人员配置的order是B,C,A,我们先把这串字符串改为配置映射

js 复制代码
const getOrderConfig = (order) => {
  const orderConfig = {}
  order.split(',').forEach((orderKey, index) => {
    orderConfig[orderKey] = index + 1
  })
  return orderConfig
}

实现一个flex布局的包裹组件OrderWrapper,结合使用vue的具名插槽,插槽的name就是上述配置映射的orderKey

vue 复制代码
<script setup name="OrderWrapper">
import { defineProps, computed } from 'vue'

const props = defineProps({
  orderConfig: {
    type: Object,
    default: () => ({}),
  }
})

const orderKeys = computed(() => Object.keys(props.orderConfig))
</script>

<template>
  <div style="display:flex;flex-direction:column;">
    <div
      v-for="orderKey in orderKeys"
      :key="orderKey"
      :style="{ order: orderConfig[orderKey] }"
    >
      <slot :name="orderKey" />
    </div>
  </div>
</template>

OrderWrapper组件的使用如下:

vue 复制代码
<Comp :order-config="orderConfig">
  <template v-slot:A>
    <A />
  </template>
  <template v-slot:B>
    <B />
  </template>
  <template v-slot:C>
    <C />
  </template>
</Comp>

如果想自己改改代码,试试效果,可以点下面这个playground链接

示例代码的playground演示

相关推荐
vipbic4 小时前
别再把“做个H5”挂嘴边了:这个词,官方压根就没有定义过
前端
ZC跨境爬虫5 小时前
跟着 MDN 学CSS day_39:(Flexbox 弹性盒子核心机制)
前端·css·ui·html·tensorflow
小陈同学呦6 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
开发者每周简报6 小时前
网海三部曲·无名宗师传
javascript·人工智能
喵个咪6 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
qq_2518364577 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
摆烂大大王7 小时前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao7 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色8 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆8 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6