AppSmith 它到底好用吗?

团队尝试使用低代码平台AppSmith更新老旧管理端,发现其优点如OAuth2集成和丰富的数据源,但也存在控件布局问题、代码格式化不足和局限的JS功能。结论是,在前后端分离场景下,AppSmith不如熟悉的模板项目灵活。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

前段时间公司里一个给经销商用了挺长时间的管理端需要更新一下, 补充一些功能, 于是我们把项目代码翻了出来, 发现是一个基于 Vue 2 的简易管理端和 Spring Boot 2 后端组成的项目.
简单规划了一下需要改动的范围, 确定好方案之后很快就完成了业务上需要的功能.

本着项目难得更新一次, 不如这一次一并更新一下技术栈, 避免项目腐化的想法, 我们团队内部讨论了几个方案, 包括更新到 Vue 3, 使用 Nuxt 3 进行重构, 使用低代码平台进行重构等.
讨论了一番后, 我们决定尝试一下低代码平台, 于是我们找到了 AppSmith, 当时的搜索结果页大概是这个样子:

  • AppSmith 官网
  • 最强开源低代码平台 - Appsmith 功能介绍与使用体验 - 知乎
  • Github 最火开源低代码 Appsmith: 我们是如何达到 28K Star 的?

团队成员都表示, 哇, 这个项目看起来很厉害啊, 我们试试看吧!

本着调研的心态, 我们把此次改动的管理端列表页作为参考, 打算使用 AppSmith 对这个页面进行一个 1:1 的复制.

接下来就让我们一起来看看 AppSmith v1.16 在真实项目中的表现如何吧. 🧐

Note:
由于 AppSmith 是一个仍在活跃开发的项目, 因此本文提到的内容具有时效性, 阅读时请注意当前时间与文章发布时间的间隔, 内容仅供参考.

所以 AppSmith 它到底好用吗?

让我们先来看看它的优点

  • 管理端项目免不了需要使用登录功能, 正当我们准备随便糊弄一下登录页的时候, 我们发现在新建页面时有模板页可供选择, 真是减少许多调研的工作量 👍:
    image.png
  • 支持标准的 OAuth 2 认证方式, 可以快速的将业务系统的登录功能接入进来, 配置好以后还可以将访问令牌注入到 HTTP 请求中, 并自动刷新令牌. (只可惜这个项目的 Spring Boot 后端没有用标准的 OAuth 2 认证协议 😂)
  • 数据源类型丰富, 支持直接连接到多种数据库, 使用 HTTP 请求或者使用 Open AI 服务等.
  • 可以拖拽式的进行页面布局, 方便开发者像搭积木一样将界面原型搭建出来.
  • 支持编写 JavaScript 函数作为数据源或事件监听器, 自由实现业务功能.
  • 支持导入第三方 JavaScript 库, 扩展平台能力.
    image.png
  • 支持基于 React 或原生 JavaScript 创建自定义控件.
  • 支持将项目持久化到 Git 仓库里.
  • 支持多分支, 允许开发人员在分支上进行开发而不影响已发布的版本.
  • 支持环境变量/多环境数据源, 方便开发者在测试环境的数据源上进行调试.

    商业授权起步 40 USD 每月, 附带 100 小时使用时长, 超出部分按 0.4 USD 每用户每小时按量付费, 每用户每月最多收取 20 USD, 对单个应用而言门槛相对较高.

    建议在同一个账户下创建多个应用来分摊授权成本.
    image.png

那它有哪些文档上没提到的缺点呢?

  • 我们在开发列表页时, 发现拖拽控件到页面上时有可能会打乱已有的布局: 比如拖拽中的控件穿过已有的布局时会导致其下方的控件被挤到其他地方去.

    建议拖拽过程中绕过已有的控件, 尽量从布局的边缘进入画布中间.
  • 容器控件的高度无法选择为适应窗口高度, 只能选择自动或者固定高度 (" 留白是一门艺术 ").

  • 网页编辑器上的 JavaScript 代码格式化功能约等于没有, 而且快捷键 Shift + Alt + F 很难触发:
    image.png

  • 键盘党的恶梦: 编辑 HTTP 请求时, 无法在脱离鼠标的情况下快速地填写内容, 而且你很难准确的判断按下 Enter 键以后究竟是换行还是确认当前输入的内容:
    image.png

  • 所有的数据源操作都是由 AppSmith 的代理服务器执行的, 意味着你不能像调试其他 Web 项目一样从 Chrome 控制台里直接找到你想要的 url.

    你需要打开 Chrome 的控制台, 选中 execute 请求并将 form data 设置为 view source 模式, 否则默认的 view parsed 模式下看到的都是二进制字段:
    image.png

  • JS 和 UI 的编辑器是两个互斥的页面, 导致没法像本地开发一样将 IDE 和浏览器放置在同一个窗口中进行分屏调试.

image.png

变通方案是在字段的 Computed Value 里将 JS 代码调试好, 再复制到 JS 对象里, 去引用这段代码:

  • 自带的 moment.js 没有安装中文本地化的配置, 虽然查询出来已安装了 en, zh, zh-cn 三种本地化配置, 但实际都是英语. 这也进一步引发了下一个问题.
    image.png

  • 无法从第三方库中导入任意内容. 例如: 无法从 dayjs/plugin/duration 中导入 duration 插件:
    image.png

  • 因为 JS 对象是跟页面绑定的, 所以无法很方便地创建多页面共享的工具类 JS 对象.

    可选的变通方案包括:

    • 把工具类复制到其他页面, 可能会导致潜在的工具类实现不一致/不同步的问题.
    • 花钱上企业版, 用 AppSmith 的 Packages 功能
    • 或者发布一个自定义的包到 NPM 上, 再通过安装第三方库的形式使用这个工具类.

结论

我们最终花了大概 1 周左右的时间, 一边翻文档学习 AppSmith 的基础知识, 一边弄脏双手进行实践, 最终发现 AppSmith 并没有想象中的那般美好: 目前来看 AppSmith 在前后端分离的场景下似乎并没有显著的优势, 相比接触过的几个 admin 模板项目只是多了一个拖拽式的布局生成功能, 反而是它的 JS 部分功能有限.

如果团队有比较熟悉的 admin 模板项目的话, 建议直接基于熟悉的项目进行二次开发, 自由度与灵活度要比 AppSmith 高出不少, 而且现有的前端 UI 框架也不比 AppSmith 自带的 UI 库要差.

相关内容

推广

欢迎大家尝试电脑微信多开小工具, 12 Mb 的小工具, 可以帮你在电脑上多开微信.

image.png

大家遇到什么使用问题或者有任何建议都可以私信我.

<think>好的,用户现在遇到了一个问题,他们在一个输入框的defaultText属性中使用了`{{ appsmith.store.formData?.[currentItem] || "" }}`,但想要显示当前表格中对应列名的行数据。他们是在表格中添加了一个修改按钮,用于更新数据库的。 首先,我需要回顾之前的对话。用户之前的问题是关于`tableColumns`未定义的错误,我建议他们要么在本地定义变量,要么从store中获取。现在他们的问题可能涉及到如何正确绑定数据到输入框,以便在修改时显示正确的行数据。 用户提到的`currentItem`可能是指当前行的某个标识符,比如列名或字段名。他们希望当点击修改按钮时,输入框能显示该列对应的当前行的数据。现在的问题是,如何正确获取并显示这些数据。 接下来,我需要分析可能的错误点。用户可能在设置`formData`时没有正确存储当前行的数据。比如,当点击修改按钮时,应该将当前行的数据保存到`appsmith.store.formData`中,这样输入框才能通过`currentItem`来访问对应的字段值。 可能的解决方案是确保在点击修改按钮时,将当前行的数据正确存储到store中。例如,修改按钮的onClick事件应该触发一个函数,将当前行的数据存入`formData`,并将当前列名存入`currentItem`。这样,输入框的defaultText就可以正确绑定到对应的值。 此外,需要注意数据绑定的正确性。在Appsmith中,动态值通常需要用双花括号`{{}}`包裹,并且可能需要正确的路径访问。例如,如果`formData`是一个对象,那么`formData[currentItem]`需要正确的语法,可能需要使用`.`或`[]`来访问属性。 还需要考虑异步存储的问题,确保在存储数据到store之后才进行读取,避免数据未及时更新导致的显示问题。可能需要使用`async/await`或回调函数来处理存储操作。 最后,验证用户是否在按钮点击时正确触发了存储操作,以及`currentItem`是否正确传递了当前列名或字段名。如果这些步骤都正确,那么输入框应该能正确显示对应的数据。</think>根据你的场景需求,我将分步骤解释如何正确实现表格行数据绑定到输入框。以下是结构化解决方案: --- ### 一、问题核心分析 你需要在**修改按钮**被点击时: 1. 捕获当前行的数据 2. 将数据预填充到输入框中 3. 确保绑定关系正确 --- ### 二、实现步骤(关键代码示例) #### 1. 修改按钮点击处理 在表格的修改按钮 `onClick` 事件中: ```javascript // 将当前行数据存储到formData中,同时记录当前操作行ID storeValue("formData", currentRow); storeValue("currentItemId", currentRow.id); // 假设主键字段是id ``` #### 2. 输入框默认值绑定 在输入框的 `defaultText` 属性中使用: ```javascript {{ appsmith.store.formData?.[appsmith.store.tableColumns?.find(col => col.column_name === currentItem)]?.value || "" }} ``` --- ### 三、完整解决方案(两种模式) #### 方案一:单输入框绑定特定字段(推荐) ```javascript // 修改按钮 onClick 触发: storeValue("formData", currentRow); storeValue("currentColumn", "price"); // 假设当前列是price // 输入框 defaultText: {{ appsmith.store.formData?.[appsmith.store.currentColumn] || "" }} ``` #### 方案二:动态列绑定(通用型) ```javascript // 修改按钮 onClick 触发: storeValue("formData", currentRow); storeValue("currentColumnName", currentItem.column_name); // 通过上下文获取列名 // 输入框 defaultText: {{ appsmith.store.formData?.[appsmith.store.currentColumnName] || "" }} ``` --- ### 四、关键原理说明 1. **数据存储层级** ![](https://static.apexschool.com/as-docs/store-value-flow.png) (图示说明:storeValue → 组件绑定的数据流向) 2. **动态路径访问技巧** - 使用 `object?.[variable]` 语法代替 `object.variable` - 通过 `appsmith.store.tableColumns` 获取列元数据 - 结合 `Array.find()` 定位具体列 --- ### 五、常见错误排查 | 现象 | 解决方法 | |-------|----------| | 显示 `[object Object]` | 检查是否误绑定整个对象而非具体属性 | | 输入框始终为空 | 确认 `storeValue` 执行成功,添加控制台日志验证:<br>`{{ console.log("存储数据", appsmith.store.formData) }}` | | 列名不匹配 | 使用统一列名标识:<br>`columns.map(col => col.name.toLowerCase())` | --- ### 六、增强建议 ```javascript // 在按钮点击时添加数据验证 if (!currentRow || !currentItem) { showAlert("请选择要编辑的行", "error"); } else { storeValue("formData", { ...currentRow, _lastModified: Date.now() }); } ``` 通过以上步骤可实现:点击修改按钮 → 自动填充对应字段 → 修改后提交更新的完整闭环。建议优先采用方案一实现具体字段绑定,再扩展至动态列场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值