最近想搞一搞 agent cli 开发。UI 层面,node 有比较成熟的 ink 方案。
但是看了下 go TUI 相关的解决方案,描述 UI 的方式有点别扭。当然可能是我没找到更好的实现思路。
所以实现了 rego ,取 react + go 的意思。
话不多说,先上代码。
package main
import (
"fmt"
"github.com/erweixin/rego"
)
func App(c rego.C) rego.Node {
count := rego.Use(c, "count", 0)
rego.UseKey(c, func(key rego.Key, r rune) {
switch r {
case '+': count.Set(count.Val + 1)
case '-': count.Set(count.Val - 1)
case 'q': c.Quit()
}
})
return rego.VStack(
rego.Text("Rego Counter").Bold(),
rego.Text(fmt.Sprintf("Count: %d", count.Val)),
rego.Spacer(),
rego.Text("[+] 增加 [-] 减少 [q] 退出").Dim(),
)
}
func main() {
rego.Run(App)
}
运行效果:
Rego Counter
Count: 0
[+] 增加 [-] 减少 [q] 退出
仓库: https://github.com/erweixin/rego
对于多组件的使用可以参考: https://github.com/erweixin/rego/tree/main/examples/gallery
再贴一个 stream 组件的 demo 吧。
https://github.com/erweixin/rego/blob/main/examples/stream/stream_demo.gif
欢迎各位大佬试用、提 Issue 或 PR 。如果你也喜欢这种“在终端写 React”的思路,欢迎给个 Star 支持一下!👏
1
lumyx 1 天前
怎么到处都是 hooks 。不了解 go ,叠甲以下是个人观点,如果 hooks 是个好东西,官方组件肯定早就纳入麾下了。 最近研究了 下 flutter 这边的 hooks (说是为了解决逻辑复用,但逻辑复用有其他解法),完全是为了 hooks 而 hooks 。
|
2
cfu18 1 天前
支持一下
|
3
weixind OP @lumyx
这是 go 语言下的 TUI 的一个解决方案。你可以理解成如何用 go 写一个 "终端页面"。现在的生态下的方案大部分处于 MVC 的思路下。rego 是尝试引入类似 MVVM 的思路,包括比较方便的组件化。具体用不用 hooks 只是 API 的设计。和用 react 传统的 state 或者 vue 的 data 相比只不过是个人喜好。 |
4
guiyumin 15 小时 18 分钟前 via iPhone
Hook 就是把一坨放进一个专门的函数里
我也不知道好不好 可能是 react 是为了对抗复杂性搞出来的一个 workaround |