接触了不少声明式 UI 的框架,Flutter 封装好的 widget 数量多,但是自己封装要写很多模版 state 代码,嵌套也不好看; Swift UI 好看易用,modifier 很强大,但又缺少一些灵活性; React 写起来很舒服,但是又带来了许多额外的概念,jsx 的语法还需要额外编译,都不能尽善尽美。 于是我写了一个小 demo,试图将这几个框架的优点结合起来,暂时将其命名为 Mox 。 先上一段代码:
const app = State((state) => () => {
const times = state(0);
return Flex(
Div(times.value),
Div("click me")
.on("click",times.setValue(o=>o+1))
.flexFlow("column")
});
new Mox().Render("app", app);
(缝合怪石锤了) 大致的想法就是通过函数参数组合子组件,通过 modifier(.styles()、.on()等)组合样式、props 和事件,再搭配几个高级组件如 State 、Element 等获取响应式变量和 dom 元素。不得不说 js 实在是太灵活了,本来打算用 TS 写的,写着写着就停不下来了。 因为目前只是 demo,所以没有考虑 render 的性能和父子组件通信的问题,reRender 函数直接就整个全部重新渲染了😂
现在看起来代码还很凌乱,因为可用的 modifier 还只有几个,等到抽成组件之后应该会好很多。
这样写的优势就在于整个项目只需要写 js 就行了,引入一个 scrip 文件就可以直接开始模块式开发,也不需要记多余的概念,modifier 都是几个 css 属性和 html 属性,最大的好处是可以直接展示和控制 css,直观的看出一个组件的作用,坏处可能是没有编辑器支持容易写错属性名称吧。
各位 V 友们有啥看法呢?放上 github 链接: https://github.com/Mox-js/Mox-js 目前这个 demo 连玩具都算不上,如果反响不好就全当练习虚拟 DOM 吧,又要去看 react 源码了...
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.