现有 React 项目集成 amis:从首屏渲染到接入真实后端的实操路线
现有 React 项目集成 amis从首屏渲染到接入真实后端的实操路线【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis从一个真实的交付任务说起上周接到的需求给一个已有的 React 后台补一个用户管理页——查询区、表格、新增/编辑弹窗、导出3 天内交付。团队讨论下来选择引入 amis 来做这块页面这类表单加表格的页面用 amis 写 JSON 配置比手写组件快交付周期可以压到 1~2 天参考值。但引入前要先回答三个问题下面先给判断标准再走一遍最小集成流程。动手前三个判断标准技术栈是否兼容查一下项目里 React 的版本amis 要求 16.8.6 及以上mobx 需要 4.5.0 及以上见packages/amis/package.json的 peerDependencies。老到 React 16 的项目可以接React 15 就不要硬上了。页面类型是否合适表单密集、表格密集、纯展示详情页是 amis 的主场拖拽画布、重自定义动画、高频交互的页面写 schema 反而更绕。判断标准可以很简单页面 70% 以上的内容是表单和表格就值得接。团队成本写 JSON schema 的门槛比写 React 组件低但前提是团队有人能读懂 amis 的数据流并且接受扩展靠注册 React 组件这条路。只有一个人会 React 的团队建议先做一个小页面验证再谈铺开。最小集成流程整条主线就三步先看图再逐步落地第一步装依赖确认构建工具能处理 CSS 和字体npm i amis主题、图标是单独的 CSS 文件构建工具必须能处理它们。webpack 项目加这几条规则// webpack 增量配置 module.exports { module: { rules: [ { test: /\.css$/, use: [style-loader, css-loader] }, { test: /\.(woff2?|ttf|eot|svg)$/, use: file-loader } ] } };如果用 vite以上资源默认就能处理只需import即可。页面里要用代码编辑器editor组件的话webpack 侧再补一个monaco-editor-webpack-plugin。第二步封装一个可复用的渲染组件把 toast、请求、跳转这些胶水收进一个组件业务页面以后只管传 schema 和初始数据// src/amis/AmisView.tsx import React from react; import { render as renderAmis } from amis; import { ToastComponent, AlertComponent } from amis-ui; import amis/lib/themes/cxd.css; import amis/lib/helper.css; import amis/sdk/iconfont.css; // 用 render 的函数签名反推第三个参数的类型比手写接口更稳 export type FetcherEnv Parameterstypeof renderAmis[2]; export default class AmisView extends React.Component{ schema: any; initialData?: any; userContext?: any; env: FetcherEnv; } { render() { const { schema, initialData, userContext, env } this.props; return ( ToastComponent themecxd positiontop-right / AlertComponent themecxd / {renderAmis( schema, { data: initialData, context: userContext }, env )} / ); } }renderAmis接收三个参数schema页面配置、props下发给页面的数据、env运行环境请求函数就在这里。data会成为顶层数据域schema 里任何组件都能取到context适合放平台级数据如当前登录人。接入真实后端fetcher 与全局数据让请求走项目既有的请求链路amis 里所有api字段最终都会调到你提供的fetcher。写法上直接复用项目的 axios 实例、token 注入、统一错误处理只处理最后的 payload 形状import request, { ApiResult } from /services/request; // 项目现有请求封装 export const fetcher async (cfg: any) { const { url, method get, data, config {} } cfg; config.headers { ...(config.headers || {}), token: getAccessToken() }; const isGet method get || method head; const payload await requestApiResult({ url, method, // GET 放 query其余放 body params: isGet ? data : undefined, data: isGet ? undefined : data, ...config }); if (payload.status 0) return payload.data; return Promise.reject(new Error(payload.msg || request failed)); };把路由参数和全局状态传进去AmisView schema{userPageSchema} initialData{{ tenantId: routeParams.tenantId }} // 路由参数进数据域 userContext{{ current: currentUser }} env{{ fetcher, theme: cxd }} /这样 schema 里${tenantId}、${current.name}都能直接解析。updateLocation、isCurrentUrl这几个 env 钩子在需要 amis 管理地址栏时才补多数场景用不上。页面跳转交给项目路由不接jumpTo时amis 默认按地址跳转处理SPA 里会变成整页刷新env: { fetcher, theme: cxd, jumpTo: (to: string) history.push(to) // react-router 的 history }缺什么补什么注册自定义组件与表单项内置渲染器覆盖不到的部分用两个装饰器补齐。三步注册一个自定义渲染器import { Renderer } from amis; Renderer({ type: watermark, autoVar: true }) class Watermark extends React.Component { render() { const { tip } this.props; // autoVar 开启后配置里的 ${} 已解析好 return div classNamewm{tip}/div; } }在 schema 里就能用了{type: watermark, tip: ${current.name}}子区域如body通过 props 下发的render函数渲染签名是render(body, node)这是自定义组件最常被问到的一个点。表单项用 FormItem别用 RendererFormItem会替你处理 label 布局、校验、三种表单排布你只管回显和改值import { FormItem } from amis; FormItem({ type: color-pick }) class ColorPick extends React.Component { render() { const { value, onChange } this.props; return ( input typecolor value{value || #ffffff} onChange{e onChange(e.target.value)} / ); } }{type: color-pick, label: 主题色, name: themeColor}注意type要和注册时一致拼错会静默回退成普通文本排查时要先看这里。工程化懒加载、schema 管理与缓存懒加载amis 的包体不小没必要让首屏全量吃掉。把包装器拆出去按需引入即可const AmisView React.lazy(() import(/amis/AmisView)); function UserPage() { return ( Suspense fallback{div页面加载中…/div} AmisView schema{schema} env{envConfig} / /Suspense ); }schema 集中管理建议把页面配置收敛到一个目录例如src/schemas/下按页面拆文件与组件代码分开评审需要动态下发时走接口前端只做一层带过期时间的缓存const schemaCache new Mapstring, { t: number; v: any }(); export async function loadSchema(key: string, ttl 300_000) { const hit schemaCache.get(key); if (hit Date.now() - hit.t ttl) return hit.v; const { data } await request.get(/schemas/${key}); schemaCache.set(key, { t: Date.now(), v: data }); return data; }schema 还可以走可视化编辑的路线仓库内自带可视化编辑器见packages/amis-editor表单类页面直接拖出来交付前再人工过一遍配置。高频问题样式、实例与类型样式冲突amis 组件都挂在c-前缀的类名下和大多数项目的变量式样式不冲突。真撞车时优先用主题变量CSS 变量覆盖色板而不是写高优先级选择器去盖把 amis 页面包在一个容器里、容器内只放开 amis 需要的变量是最省心的隔离方式。获取并操控渲染实例通过scopeRef拿到 scoped 实例等价于 SDK 里的amisScopedconst scopedRef React.createRefany(); // ... renderAmis(schema, { data: initialData, scopeRef: (s: any) (scopedRef.current s) }, env); // 外部触发读表单值 scopedRef.current.getComponentByName(userForm).getValues();顺带提醒React 18 的StrictMode目前不兼容接 amis 的页面记得别开。TS 类型amis包自带类型定义schema.json和schema-minimal.json可以做 schema 的约束校验。容易漏的是env它的方法签名多且零散上面用render签名反推的写法基本够用团队里有多处使用时再单独抽一个FetcherEnv接口收敛。适配性速查页面类型建议表单密集的增删改查用 amis收益最大数据表格 筛选 弹窗编辑用 amiscrud 基本开箱即用详情页、配置页、审批向导可用注意自定义区域的扩展成本拖拽画布、富交互动画页不建议schema 表达力有限首屏性能敏感页谨慎配合懒加载或整页不接amis 不会替代项目里的 React 组件开发它覆盖的是表单和表格这一段工作。接入成本集中在 fetcher 与主题这两处剩下的交给 schema 和按需注册的扩展能跑通首屏之后再谈铺开。【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考