尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

JeechBoot表格操作列下拉菜单实现:Vue3+ant-design-vue完整方案

发布时间:2026/9/29 14:13:52

资讯中心
01
ARTICLE

JeechBoot表格操作列下拉菜单实现:Vue3+ant-design-vue完整方案

JeechBoot表格操作列下拉菜单实现:Vue3+ant-design-vue完整方案
一开始接到这个需求的时候我以为是给 JeechBoot 的表格加一个简单的el-select下拉框结果沟通完才知道是在表格的“操作”列里放一个下拉菜单把“编辑、删除、详情、更多”这些按钮收纳进去。这个场景在 JeechBoot 这类中后台低代码平台里太常见了操作按钮一多表格列就会被撑得乱七八糟显示不完、对齐也难看于是“下拉收纳”成了最务实的解法。这篇文章我会直接站在 JeechBoot 前端尤其是 Vue3 ant-design-vue 技术栈的角度把表格操作列里做下拉菜单的完整思路、代码、踩坑记录一次讲透。不管你是刚接触 JeechBoot 的新手还是已经在里面折腾过几个页面的前端照着这套思路改基本不会再被“下拉不显示、点击没反应、菜单被遮挡”这类问题卡住。1. 需求拆解表格操作列为什么要做下拉1.1 JeechBoot 前端表格体系到底是什么JeechBootJeecgBoot的前端默认是基于 Vue3 Vite ant-design-vue 4.x 的一套中后台解决方案表格这块封装得比较重。你在页面上看到的很多JTable、JeecgTable、J-search-table之类的组件底层都是包了一层 ant-design-vue 的Table再加上分页、搜索、列设置、导入导出这些通用能力。所以你在 JeechBoot 里改表格本质上还是在跟 ant-design-vue 的 Table 打交道。而操作列下拉这件事听起来像是“Table 的功能”实际上依赖的是另一个组件Dropdown下拉菜单。换句话说我们要解决的是“Table 单元格里如何优雅地放一个 Dropdown”以及“这个 Dropdown 在 JeechBoot 的封装体系里怎么接进去”。很多刚接触 JeechBoot 的同学会去翻它的源码想找到操作列的配置入口结果发现有的页面操作列是写死在template #bodyCell里的有的页面又是通过columns配置项里的customRender渲染的还有的封装版本支持action配置。这个差异很容易让人懵后面我会把几种写法都铺开讲。1.2 操作项一多按钮组压不住不做下拉的时候最直观的方案是直接在操作列放一排小按钮a-space a-button typelink sizesmall clickhandleEdit(record)编辑/a-button a-button typelink sizesmall clickhandleDelete(record)删除/a-button a-button typelink sizesmall clickhandleDetail(record)详情/a-button /a-space这个写法在只有两三个操作时完全没问题但业务一复杂就露馅了。比如订单管理页面常见操作有详情、编辑、审核、作废、导出、打印、复制、变更记录、重新推送、删除。十个按钮塞进一列就算每个只占 50px 宽度这一列也得 500px 起步而客户的屏幕往往只有 1366px 宽再减去左侧菜单、右侧滚动条表格实际可用宽度可能就 800px。这时候你要是还坚持全按钮平铺表格就要横向滚动用户看个列表得来回拖滚动条体验很差。下拉方案的核心思路是把高频操作比如编辑、删除留在外面做“主按钮”把低频或次要操作详情、导出、打印、历史记录收进“更多”菜单里。一列宽度可以稳定控制在 160px 左右表格整体结构马上清爽了。这也是后台管理系统里最常见的交互取舍不是所有按钮都值得被用户一眼看到与其平铺十个入口不如保持界面干净。1.3 “下拉”这个词在前端里的两种含义这里得先澄清一个容易混淆的点。热搜里同时出现了“表格下拉”、“下拉电阻”、“下拉参数”这些词但咱们做前端的说的“下拉”通常指的是两种东西下拉选择框Select/Dropdown Select用户从预设选项里选一个值比如给某一行记录修改状态。下拉菜单Dropdown Menu点击或悬停后弹出的菜单列表常见于操作列和导航栏。我们要做的是第二种也就是菜单式的下拉不是表单里的选择器。组件层面对应的是 ant-design-vue 的a-dropdown/a-dropdown-button而不是a-select。这两者的使用场景、事件机制、样式调法差别很大如果你在操作列里误用了a-select就会出现“一列表格全是下拉框”的诡异效果所以先从概念上把目标锁定清楚。2. 方案选型Dropdown 组件的渲染机制与取舍2.1 Dropdown 为什么适合操作列从底层原理看a-dropdown的核心是一个触发器 一个浮层。触发器的内容完全由你决定可以是一个按钮、一段文字、一个图标浮层里放a-menu菜单项点击后通过click或command事件把指令传出来。它适合操作列有四个原因触发方式灵活trigger支持hover和click表格场景一般选click避免鼠标不小心滑过就弹菜单。浮层不占文档流空间菜单弹出时是绝对定位不影响表格列的宽度计算。菜单项天然支持分组、禁用、图标、分隔线业务上“更多”里的操作五花八门a-menu的danger状态、disabled状态都现成。事件模型简单菜单项点击后触发统一事件你在处理函数里根据key分发逻辑不用为每个按钮单独绑定 handler。对比常见的自研方案——比如在单元格里放一个按钮点击后用v-if显示一个自定义div弹层——a-dropdown已经把定位、层级、点击外部关闭、键盘操作这些底层细节处理好了。自研弹层百分之百会踩到“定位错位”、“点其他地方关不掉”、“页面滚动后弹层还在原地”这些坑属于拿自己的时间去换组件库已经解决的问题没必要。2.2 a-dropdown 与 a-dropdown-button 怎么选ant-design-vue 里有两个长得像的组件组件结构适用场景a-dropdown触发器内容完全自定义里面可以塞任何东西想放图标按钮、文字链接、自定义标签时a-dropdown-button左侧按钮 右侧下拉箭头两者拼在一起想保留一个高频主操作同时附带更多菜单时在我做过的 JeechBoot 页面里用得最多的是a-dropdown-button因为它天然契合“主操作 更多”的交互。比如订单操作列左侧按钮“编辑”点击直接进入编辑。右侧箭头点开后有“详情、导出、打印、删除”等。这样用户第一眼看到的是主操作需要更多功能时再点箭头既不丢高频入口又控制了列宽。如果主操作不固定或者不需要强突出某个按钮那我建议直接用a-dropdown包一个更多文本按钮或者包一个BarsOutlined图标视觉上更轻量。另外要提醒一点a-dropdown-button左侧按钮的点击事件是click右侧菜单项点击走的是click里拿key或者用a-menu的click。我第一次用的时候把菜单点击事件绑在了a-dropdown-button外层结果点了半天没反应后来才意识到事件挂载位置不对。2.3 在封装组件里写死还是做成配置驱动JeechBoot 表格通常不直接用原生a-table而是用它的二次封装组件。你可能会遇到三种接入方式在bodyCell插槽里直接写下拉代码针对某个列单独处理。在columns配置里通过customRender返回 VNode。使用 JeechBoot 封装好的操作列配置项例如某些版本里的action或operate配置。我的建议是如果项目里操作列逻辑比较统一优先做成配置驱动。也就是把每个操作项定义成对象数组包含key、text、icon、danger、disabled、permission等字段然后统一渲染成下拉菜单。这样新增一个操作只需要在配置文件里加一行不需要动模板。如果只是某一个页面临时加个下拉直接在bodyCell插槽里写是最快的不要为了“优雅”强行抽象过度设计也是坑。后面我会给两套代码你自己按场景抄。3. 核心实现JeechBoot 操作列下拉菜单完整代码3.1 最直接的写法bodyCell 插槽 a-dropdown-button假设你现在用 JeechBoot 封装好的j-table结构大致是这样的j-table reftableRef :columnscolumns :dataSourcedataSource :loadingloading changehandleTableChange template #bodyCell{ text, record, index, column } template v-ifcolumn.key action a-dropdown-button sizesmall clickhandleEdit(record) 编辑 template #overlay a-menu clickhandleActionMenuClick a-menu-item keydetail详情/a-menu-item a-menu-item keyexport导出/a-menu-item a-menu-item keyprint打印/a-menu-item a-menu-divider / a-menu-item keydelete danger删除/a-menu-item /a-menu /template /a-dropdown-button /template /template /j-table对应的处理函数const handleEdit (record: any) { // 左侧主按钮的点击直接走编辑 console.log(编辑, record) } const handleActionMenuClick ({ key }: { key: string }) { // 右侧菜单项点击所有操作都汇聚到这里 switch (key) { case detail: // 打开详情抽屉 break case export: // 导出当前行数据 break case print: // 打印 break case delete: // 删除注意二次确认 break } }这里有个细节template #overlay里放的是a-menu而不是像 Element Plus 那样用template #dropdown。如果你之前写的是 Element Plus 的el-dropdown换成 ant-design-vue 时很容易记混。而且 ant-design-vue 4.x 里旧的slot写法虽然还兼容但新项目建议直接用overlay这对应组件库底层的v-slot:overlay插槽机制。另外菜单项点击后默认会自动关闭浮层这个行为我们一般不需要改保持默认就好。后面我会说到如果菜单里有“打开某个弹窗”的操作弹窗打开的同时浮层是否关闭要看组件库版本处理不当会出现“弹窗开着下拉还挂在页面上”的叠层问题。3.2 配置驱动版把操作项抽成数组当操作项超过五六个写死在模板里就开始难受了。我会把操作项抽成一个配置数组配合渲染函数或者v-for生成菜单项const actionItems [ { key: detail, label: 详情, icon: ProfileOutlined, show: true }, { key: edit, label: 编辑, icon: EditOutlined, show: true }, { key: export, label: 导出, icon: DownloadOutlined, show: true }, { key: print, label: 打印, icon: PrinterOutlined, show: false }, { key: delete, label: 删除, icon: DeleteOutlined, danger: true, show: true }, ] const visibleActionItems computed(() { return actionItems.filter(item item.show) })模板里用v-for渲染菜单项a-dropdown-button sizesmall clickhandlePrimaryAction(record) 操作 template #overlay a-menu clickhandleActionMenuClick(record) a-menu-item v-foritem in visibleActionItems :keyitem.key :dangeritem.danger component :isitem.icon v-ifitem.icon / span{{ item.label }}/span /a-menu-item /a-menu /template /a-dropdown-button注意handleActionMenuClick这里要带上record因为菜单点击事件的参数里只有key你还需要知道点的是哪一行。一种做法是在v-for渲染时给每个a-menu-item加自定义属性然后在点击事件里取e.domEvent.currentTarget.dataset但实测下来最稳妥的还是闭包传参也就是把record作为参数传进处理函数。每次调用都会生成新的函数实例数据量小的时候性能完全没问题。JeechBoot 页面里的表格行数据通常来自后端分页接口record里还会带上id所以实际处理删除、编辑时直接用record.id调接口即可。3.3 也可以走 columns 配置的 customRender如果你用的是原生a-table或者 JeechBoot 某些页面是通过columns配置驱动渲染的那可以在列定义里用customRender{ title: 操作, key: action, align: center, width: 160, fixed: right, customRender: ({ record }: { record: any }) { return h(AButtonGroup, [ h(AButton, { size: small, onClick: () handleEdit(record) }, { default: () 编辑 }), h(ADropdown, { trigger: [click], // ts-ignore overlay: h(AMenu, { onClick: ({ key }) handleActionMenuClick(record, key) }, { default: () actionItems.map(item h(AMenuItem, { key: item.key }, () item.label)) }) }, { default: () h(AButton, { size: small }, { default: () h(MoreOutlined) }) }) ]) } }不过说实话我一般不太推荐在 JeechBoot 里用customRender来写复杂交互。原因有两个JeechBoot 自身封装表格时可能已经拦截或改写了一些列配置customRender在封装链路上不一定每次都符合预期。模板里写bodyCell插槽可读性比一长串h()函数高得多而且调试时能看到清晰的 DOM 结构。customRender更适合那种“整列渲染逻辑非常简单、不值得单独开插槽”的情况。操作列下拉这种复杂度还是老实走插槽。3.4 把“更多”图标按钮版本也备好有时候页面操作列空间极其紧张连“操作”两个字都嫌占地方这时候可以退化成纯图标下拉a-dropdown :trigger[click] a-button typetext sizesmall more-outlined / /a-button template #overlay a-menu clickhandleActionMenuClick(record) a-menu-item keydetail详情/a-menu-item a-menu-item keyedit编辑/a-menu-item a-menu-item keydelete danger删除/a-menu-item /a-menu /template /a-dropdown这种做法的好处是操作列宽度可以压到 60px 左右适合那种表格字段很多、屏幕空间不足的场景。坏处是“发现性变差”用户不知道这个小图标里藏着什么功能第一次用的人可能完全不会去点。折中方案是鼠标悬停时给按钮加个 tooltip 提示“更多操作”。我经历过一个实际项目表格有 20 多列客户还要求每行都能看全操作列如果按按钮组方案就得 300px 宽整张表完全没法看。最后就是用了纯图标下拉 悬停提示客户接受度很高。所以方案没有绝对好坏取决于你的表格密集度。4. 实操中的细节调优宽度、对齐、事件、层级4.1 操作列宽度与固定列的处理JeechBoot 表格默认会自适应宽度但操作列这种固定内容的列最好显式设置width。我常用的取值只有“编辑”一个按钮80px“编辑 删除”两个按钮120px下拉按钮 “操作”文字140px ~ 160px纯图标下拉“60px”配合fixed: right可以让操作列固定不随横向滚动。这个在 JeechBoot 里可以直接在columns里配置或者如果你用的封装组件暴露了列配置属性直接传fixed字段即可。再补充一个对齐细节操作列一般设align: center但如果里面既有按钮又有下拉箭头a-dropdown-button本身是一个整体组件居中是没问题的。如果你自定义了a-dropdown 多个按钮的组合建议外面套一层a-space再配合align避免文字和图标在垂直方向上错位。4.2 权限按钮怎么和下拉项结合JeechBoot 自带按钮权限体系通常是usePermission或类似工具方法来判断当前用户有没有某个按钮权限。下拉菜单里的每个项也得过一遍权限。实际开发里我会把权限判断放进配置数组const allActions [ { key: edit, label: 编辑, permission: order:edit }, { key: delete, label: 删除, permission: order:delete, danger: true }, ] const visibleActions computed(() { return allActions.filter(item hasPermission(item.permission)) })这样没有权限的操作项根本不会渲染到菜单里而不是渲染出来点击后再提示“无权访问”。后者体验差还暴露了功能入口。如果某个行的数据状态导致操作不可用比如已作废的订单不能编辑再加一个disabled字段去控制a-menu-item的禁用状态比整体移除更合理——用户能看到有这个功能但知道当前不可用。4.3 大数据量下的渲染性能问题JeechBoot 表格如果一次加载几百行操作列的下拉菜单配置又是一个数组每个单元格都要创建按钮和菜单实例性能确实可能成为瓶颈。我遇到过一个用户反馈列表滚动卡顿排查下来不是表格虚拟滚动的问题而是操作列下拉浮层相关的监听器太多。处理办法有几个尽量开启 JeechBoot 表格自带的分页或虚拟滚动控制同时渲染的行数这是最有效的。操作按钮如果不需要动态权限控制把配置数组提到组件外部避免每个record都触发重复计算。不要把整个表格行的数据都塞进record的引用里然后传到菜单组件内部必要的时候只传id和几个关键字段减少 Vue 响应式的代理负担。这里说一下为什么只传id有效Vue3 的响应式系统会对对象做代理当你在下拉菜单的点击处理函数里持有整个record时这个对象整个生命周期都被响应式追踪。如果record里有个超大字段比如后端返回的长文本、base64 图片性能影响很明显。只传id处理函数里通过id再去查行数据或直接调接口响应式追踪范围就小很多。4.4 行点击事件和下拉点击的冲突JeechBoot 里如果给表格行绑定了row-click事件用来做“点击行查看详情”那么用户点操作列的下拉按钮时这个行点击事件也会触发导致“下拉菜单刚弹出来详情弹窗也跟着打开了”。这是后台管理系统里极其常见的交互 bug。解决思路是在行点击事件里排除操作列const handleRowClick (record: any, index: number, event: Event) { const target event.target as HTMLElement // 如果点击目标在操作列内部或者包含 .ant-dropdown 相关节点直接返回 if (target.closest(.ant-dropdown-trigger) || target.closest(.ant-table-cell-fix-right)) { return } // 正常处理行点击 }更干净的做法是给操作列单元格加一个click.stoptemplate #bodyCell{ record, column } template v-ifcolumn.key action click.stop !-- 下拉组件 -- /template /template但插槽模板上的click.stop不一定每次都生效因为 JeechBoot 封装的表格可能对单元格事件做了二次代理。我实测下来最稳的是在handleRowClick里做节点判断或者干脆不绑行点击事件改用每行的“详情”按钮进入详情。交互越明确后续维护越省心。4.5 浮层被父级容器裁剪的问题JeechBoot 的表格外层往往包着a-card、滚动容器、甚至弹窗/抽屉。下拉菜单弹出时浮层默认挂在组件内部如果某个父节点设置了overflow: hidden或overflow: auto菜单就可能被裁剪掉一部分尤其是靠近表格底部时下拉菜单直接看不见。解决方式给a-dropdown设置getPopupContainer让浮层挂到body上:getPopupContainer() document.body。或者在 JeechBoot 页面最外层表格容器上把overflow从hidden改成visible视页面布局而定不能无脑改。我更推荐第一种因为body上没有overflow限制浮层定位只依赖触发元素的位置出现滚动也不会跟丢。但要注意挂到body后浮层的position计算是基于触发节点的矩形如果页面有 transform 动画偶尔有偏移这时候需要用popupMatchSelectWidth或手动调overlayStyle修正。这个坑我在 JeechBoot 的“单据弹窗选择器”里踩过表格在弹窗里getPopupContainer没设置时下拉箭头点了没反应实际上菜单渲染到了弹窗滚动容器内部被裁掉了改挂body后立刻正常。5. 常见问题与排查技巧实录5.1 点击菜单项后事件不触发遇到过好几次菜单能弹出来但点了a-menu-item没反应。排查步骤按顺序来确认你绑定的事件是a-menu的click而不是a-dropdown的click。这两个不是一回事。确认菜单项没有设置disabled禁用项点击不触发事件是正常行为。确认a-menu-item的key没有重复重复时 Vue 渲染不稳定事件可能串掉。看看浏览器控制台有没有报错比如某个 handler 未定义Vue 的报错会直接体现为点击无响应。最常见的是第一点。很多人照抄 Element Plus 的习惯把command写在el-dropdown上换成 ant-design-vue 后习惯性去找类似事件结果绑错位置。5.2 下拉菜单与弹窗/抽屉的层级冲突在 JeechBoot 里操作列下拉经常要给“详情抽屉”或者“编辑弹窗”传参。如果你发现弹窗打开后下拉浮层还盖在弹窗上面或者弹窗变灰但下拉菜单还亮着多半是 z-index 层级问题。ant-design-vue 的浮层默认使用比较高的 z-index但如果你用了自定义的蒙层组件、或者 JeechBoot 内部对弹窗做了封装层级就可能压不住。此时给a-dropdown传overlayStyle调整 z-index 可以解决但更推荐先排查项目里有没有全局的 z-index 管理文件统一规范浮层层级。另外一个很容易忽略的点点击菜单项“打开详情抽屉”之后如果抽屉打开成功但下拉浮层因为destroyOnHide配置不当还在 DOM 里叠加在抽屉上用户会觉得很奇怪。建议在下拉菜单点击处理函数里主动关闭浮层或者确保a-dropdown的浮层在触发元素失焦或点击外部时自动销毁。5.3 操作列下拉和表头筛选下拉混用JeechBoot 的表格列有时候会开启表头筛选比如状态列用a-table-column的filters属性渲染筛选项。这个筛选本身也是一个下拉浮层当它和操作列下拉在同一张表里出现时偶尔会互相干扰。最典型的表现是你点了操作列下拉再点表头筛选箭头筛选的浮层不出现或者出现了马上消失。原因是两个浮层共用了同一套“点击外部关闭”的逻辑而 ant-design-vue 对这种场景的处理有时不够细腻。我的建议表头筛选尽量用 JeechBoot 封装的查询条件区而不是表格列上的filters两个下拉功能在视觉上分离用户心智也更清晰。如果必须用filters给表头筛选列设置独立的getPopupContainer不要让两个浮层挂到同一个容器里。给操作列下拉的触发器加click.stop阻断事件冒泡到表格的表头处理逻辑。5.4 菜单项文字和图标如何对齐清晰细节决定使用体验。下拉菜单里如果有的项有图标、有的项没有文字就会参差不齐。我的习惯是所有菜单项都预留 icon 位置没有图标的就用空白占位或者干脆全部文字不要图标。ant-design-vue 的a-menu-item里放icon时建议用component :isitem.icon /动态渲染同时给菜单项设置统一的style{ display: flex, alignItems: center }。如果你发现图标和文字垂直错位检查是不是父容器行高不一致给它写死行高比逐项微调要省事得多。还有一个很实用的细节菜单分隔符用a-menu-divider把危险操作和其他操作隔开比如“删除”单独放在分隔线下面配合红色danger样式用户误操作的概率会明显降低。这个纯属交互心理学但在实际业务里非常管用。6. 封装思路把“操作列下拉”做成可复用组件6.1 做一个简单的 ActionDropdown 组件如果项目里多个列表页都要用操作列下拉我会抽一个轻量组件ActionDropdown.vuetemplate a-dropdown :trigger[click] :getPopupContainer() document.body a-button typetext sizesmall more-outlined / /a-button template #overlay a-menu clickhandleClick a-menu-item v-foritem in visibleActions :keyitem.key :disableditem.disabled :dangeritem.danger component :isitem.icon v-ifitem.icon / span{{ item.label }}/span /a-menu-item /a-menu /template /a-dropdown /template script setup langts import { computed } from vue import { MoreOutlined } from ant-design/icons-vue const props defineProps{ actions: ActionItem[] record: any permission?: (code: string) boolean }() const emit defineEmits([action]) const visibleActions computed(() { return props.actions.filter(item { if (item.disabled) return true if (item.permission props.permission) { return props.permission(item.permission) } return true }) }) const handleClick ({ key }: { key: string }) { emit(action, { key, record: props.record }) } /script使用方只需要维护一份actions配置并在action回调里统一分发逻辑。组件内部已经把浮层挂载、权限过滤、事件包装做掉了。这样一个组件引到业务页面后操作列模板只需要两三行代码维护成本大大降低。不过组件也不是越抽象越好。每个页面的操作项 icon、文案、危险状态都可能不一样所以ActionItem类型要设计得宽松一点宁可多留几个可选字段也不要为了“精简”把能力砍掉不然业务方用起来还得自己包一层。6.2 和 JeechBoot 权限体系的进一步结合JeechBoot 的权限体系通常是基于菜单/按钮编码的组件内部的permission函数可以直接透传 JeechBoot 的鉴权方法。这样每个页面的actions配置里只需要写按钮编码渲染时组件自行判断是否展示业务代码里少掉一堆v-ifhasPerm(xxx)。这个方案的优点是把“权限控制”和“UI 渲染”解耦。以后权限规则变了只需要改配置数组或全局鉴权函数不用进每个页面改模板。我在团队里推过这个模式最直接的感受是新增一个操作按钮新人只需要在数组里加一行不用理解表格插槽和菜单事件上下文切换成本骤降。6.3 扩展方向操作项前置按钮 更多下拉实际项目里不可能所有操作都塞进下拉总要有几个高频操作直接露出来。更成熟的模式是操作列左侧放 1~2 个图标按钮比如编辑、删除右侧放一个“更多”下拉把剩下的低频操作收起来。这个组合比纯下拉更灵活也比纯按钮组省空间。实现方式不难在bodyCell里放一个a-space左边是普通按钮右边是ActionDropdown组件。左边按钮绑定显式的事件右边菜单走统一的action分发。这样“高频操作入口”和“低频操作收纳”各司其职是后台表格操作列在功能密度和界面清爽度之间的最佳平衡点。踩过几次坑之后我现在的习惯是接到“表格操作列”相关的需求先问自己三个问题——操作项有几个哪些操作用户每天都会用哪些操作一个月都用不上一次想清楚了再动手不要交给用户十个平铺按钮“自由选择”交互设计的原则本来就是减少选择而不是增加选择。最后再分享一个细节技巧下拉菜单里凡是高危操作删除、作废、清空处理函数里务必加二次确认弹窗JeechBoot 有现成的Modal.confirm别嫌麻烦。我们项目上线头一个月就出现过一次用户误点删除的情况虽然数据可以用备份恢复但那一整天的工单都在救数据属实不值当。操作可以收进下拉安全意识不能一起收进去。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。