尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3 步把 amis 接入 React 项目:低代码落地到上线的实操指南

3 步把 amis 接入 React 项目:低代码落地到上线的实操指南 3 步把 amis 接入 React 项目低代码落地到上线的实操指南【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amisamis 是百度开源的低代码框架页面写成 JSON它负责渲染成 React 组件。本文解决 amis 与 React 集成的完整链路该不该上、接线怎么接、上线前要避哪些坑。全程 3 步推进跟着做完就能跑通第一个页面。一、先做判断这个方案值不值得上动手之前先对齐预期amis 不是万能药。判断标准就一条你的页面里列表 表单 弹窗占比多少。场景推荐度理由后台管理CRUD 占主导高增删改查、表单、详情 amis 全覆盖页面基本不用写组件代码配置页、数据看板、运营后台高页面结构稳定schema 可进版本库、可评审、可回滚重交互页面拖拽、画布、富编辑低自定义组件写到最后低代码收益被稀释高频迭代的核心业务流程中schema 可读性好但调试要绕进 JSON 层团队需有心理准备结论先给超过一半的页面是常规增删改查值得做UI 全部特殊化就只把外围页面交给它。二、动手前检查依赖、构建、主题三项核对依赖React 16.8 以上amis 内部使用 Hooksnpm install amis装主包axios、copy-to-clipboard可选分别用于接管请求和复制按钮后文接线时会用到。构建webpack 里是否已有.css和字体文件woff/ttf/eot的处理规则。amis 图标走字体文件字体 loader 缺失时图标直接空白且报错信息不指向根因排查很费时间。主题样式默认主题是 cxd需要三个文件amis/lib/themes/cxd.css、amis/lib/helper.css、amis/sdk/iconfont.css。三件套在项目入口引一次即可不要逐页引。三、三步接入安装、封装、挂载3.1 装依赖配构建npm install amis axios copy-to-clipboard构建配置里确认两条 loader 规则用到 code-editor 组件时再加 monaco 插件// webpack.config.js只标出接线点 module.exports { module: { rules: [ { test: /\.css$/, use: [style-loader, css-loader] }, { test: /^(woff2?|ttf|eot)$/, use: file-loader } ] }, plugins: [/* 使用 code-editor 才需要 */ new MonacoWebpackPlugin()] };3.2 怎么封装渲染组件整个集成就一个核心函数render(schema, props, env)返回一个 React 元素包一层组件即可。两个容易漏的点主题样式在文件里引一次外层必须挂ToastComponent和AlertComponent否则页面里的轻提示和错误通知不会显示。// components/AmisRenderer.jsx import { render } from amis; import { ToastComponent, AlertComponent } from amis-ui; import amis/lib/themes/cxd.css; import amis/lib/helper.css; import amis/sdk/iconfont.css; class AmisRenderer extends React.Component { render() { const { schema, env {}, data {} } this.props; return ( div ToastComponent themecxd positiontop-right / AlertComponent themecxd / {render(schema, { data }, { theme: cxd, ...env })} /div ); } } export default AmisRenderer;注意第三个参数env它是集成的插口请求、跳转、复制能力都从这里注入实现放在下一节。3.3 schema 怎么挂进路由schema 就是一个 JS 对象放独立文件管理。下面这份 crud 加弹窗编辑的示例挂上路由就能跑// schema/userTable.js export default { type: page, body: { type: crud, name: userTable, api: /api/users, columns: [ { name: id, label: ID, type: text }, { name: username, label: 用户名, type: text }, { name: actions, type: operation, label: 操作, buttons: [{ type: button, label: 编辑, actionType: dialog, dialog: { title: 编辑用户, body: { type: form, api: /api/users/${id}, body: [ { name: username, label: 用户名, type: input-text } ] } } }] } ] } };// App.jsx路由指向它用法和普通页面一致 Route path/users element{AmisRenderer schema{userTable} /} /整条接入链路四、把 amis 接进你的项目体系4.1 请求接管fetcher 怎么写schema 里所有api请求都会走env.fetcher不传就用内置 fetch你的鉴权头、错误规范全被绕过。接管它const env { fetcher: async ({ url, method get, data, config {} }) { const res await fetch(url, { method, headers: { Content-Type: application/json, ...config.headers }, body: method ! get ? JSON.stringify(data) : undefined }); if (!res.ok) throw new Error(请求失败${res.status}); return res.json(); // 返回解析后的对象amis 取其中的 data 字段 } };access token 在这一处统一附加。顺带把env.copy接给 copy-to-clipboardschema 里的复制按钮才会走你的剪贴板逻辑。4.2 状态注入Redux 数据怎么进 schemarender的第二个参数是 props把状态塞进dataJSON 里就能用${user}这类变量引用// 接到 store整页 schema 均可引用 const Connected connect((state) ({ data: { user: state.user, permissions: state.permissions } }))(AmisRenderer);这是单向数据流React 状态进 amis。反向表单值回流到你组件别绕全局状态用事件或从 env 读取路径短得多。4.3 路由跳转jumpTo 接进 react-routerschema 里的链接、按钮url默认走window.location整页刷新SPA 状态全丢。传jumpTo后全部改走你的路由const env { ...baseEnv, jumpTo: (path) navigate(path) // 组件内 useNavigate 拿到 };请求、状态、跳转三线接完amis 页面才真正长在你的项目里而不是一个孤岛。五、JSON 不够用时两条扩展路线内置组件表达不了的 UI走先注册、后使用。展示组件走Renderer注册后 schema 里按 type 直接引用import { Renderer } from amis; Renderer({ type: user-card }) class UserCard extends React.Component { render() { const { name, avatar, body, render } this.props; return ( div classNameuser-card img src{avatar} alt{name} / {body render(body, body)} /div ); } } // 用法{ type: user-card, avatar: ... }表单控件走FormItem值和校验由框架托管只写 UIimport { FormItem } from amis; FormItem({ type: input-phone }) class InputPhone extends React.Component { render() { const { value, onChange } this.props; return ( input value{value || } onChange{(e) onChange(e.target.value)} / ); } // 可覆写 validate() 返回错误文案触发校验 }两处注册都放在入口、路由挂载之前执行全站可用。附带收益注册过的组件在可视化编辑器里也能被识别并拖进页面。只定制某一页的单个控件时不必注册JSON 里用children函数或component属性直接内联 React 代码需要 Hooks 时用后者。完整字段以仓库内docs/zh-CN/extend/custom-react.md的自定义组件章节为准。六、发布前避坑清单四个最常见的现象 → 处理现象amis 页面和 antd/fusion 样式互相串味。原因双方样式都是全局选择器类名语义撞车。处理给render传prefix改类名前缀做系统级隔离外层再包一层容器类名收敛作用域。all: initial这种硬重置会把 amis 自身样式一起清掉别用。现象首包过大加载慢。原因amis、echarts、monaco 全被打进主 chunk。处理按路由懒加载const AmisPage React.lazy(() import(/* webpackChunkName: amis */ ./AmisRenderer) ); Suspense fallback{Spinner /} AmisPage schema{pageSchema} / /Suspense现象来回切页面schema 重复拉取解析。原因schema 存在接口里组件卸载后缓存丢失。处理内存 Map 按 key 缓存schema 版本升级时清一次const schemaCache new Map(); const loadSchema async (key) schemaCache.get(key) || (await (schemaCache.set(key, await fetchJSON(key)), schemaCache.get(key)));现象TS 项目里import amis报无类型声明。原因老版本未随包发布声明文件。处理升级到带 d.ts 的新版本优先被锁死的老版本写declare module amis补render、Renderer、FormItem三个签名env用宽松类型先顶着。另外要从外部操作组件实例给 schema 组件设name再调保存的env上的getComponentByName(userTable).reload()这是官方支持的取实例路径不要试图从render返回值上摸 ref。七、三个高频问题速答Q项目已有 antd引入 amis 后样式体系会不会打架A会除非你隔离。prefix换类名前缀 容器收作用域两步做完两者互不可见主题文件是独立的想换肤只写一份 css。schema 内部不要混嵌 antd 组件两套视觉语言叠在一起是最难看的状态。Q弹窗里编辑完数据列表怎么刷新A不用手动管。表单配了api提交成功后触发它的 CRUD 自动刷新。跨组件刷新用name加getComponentByName调reload()或走 env 的全局广播事件两者任选。Qschema 让后端或运营写怎么防止写坏Aschema 进 git 或后端管理CI 里挂校验编辑器自带 validator前端只渲染不编辑。渲染层再包一层 ErrorBoundary坏配置单页报错不至于白屏整个站点。结尾适用边界与下一步三条边界落地前先确认交互细节是产品主卖点的页面拖拽、画布类别首批接入从列表页和表单页开始。后端接口契约未稳定前schema 的api字段会反复改先冻接口再迁页面。团队要接受JSON 先行的开发方式写法和评审规范是一次性投入抵触明显就缓一缓。下一步按第三节把三件套和渲染组件对着 mock 接口跑通CRUD、表单、弹窗都出结果后挑一个真实的列表页开始迁移各组件的完整字段说明在仓库docs/zh-CN的组件章节逐篇过一遍即可。【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表