大概一个月前看到一个 v 友发贴 ( https://v2ex.com/t/750181 ), 我第一次了解到 Mithril.js 这个框架,看了一下觉得不错,就打算用来改写自己一个小网站的前端页面。
但使用过程中遇到一个小 bug 解决不了,也可能是我使用不当,具体原因不重要,总之结果是我烦了并且突然灵光一闪想到用 jQuery 也能像 Mithril 一样写网页,就试一了下,一试发现真的可以。
基于 jQuery, 再加上以下两个小函数,就是全部代码了。后面我会给出具体的使用示例。
// 函数名 m 来源于 Mithril, 也可以理解为 make 的简称,用来创建一个元素。 function m(name) { if (jQuery.type(name) == 'string') { return $(document.createElement(name)); } return name.view(); } // 函数名 cc 意思是 create a component, 用来创建一个简单的组件。 function cc(name, id, elements) { if (!id) id = '' + Math.round(Math.random() * 100000000); const vnode = m(name).attr('id', id); if (elements) vnode.append(elements); return {id: '#'+id, raw_id: id, view: () => vnode}; }
Mithril 创建一个 component 是这样:
const Hello = { view: () => m("div", [ m("h1", {class: "title"}, "My first app"), m("button", "A button"), ]) }
而使用这个框架(以下简称 mj.js )创建一个 component 有两种方法,一是这样:
const Hello = { view: () => m('div').append([ m('h1').attr({class: 'title'}).text('My first app'), m('button').text('A button'), ]) }
也可以这样:
const Hello = cc('div', 'hello', [ m('h1').attr({class: 'title'}).text('My first app'), m('button').text('A button'), ]);
可见,与 Mithril 的写法非常相似,同时又完全是 jQuery 的基本操作,只要会写 jq, 就完全没有学习难度。
本框架虽然没啥技术含量,但真的好用,特别适合小项目,尤其是如果用过 Mithril.js 或习惯使用 jQuery, 可零学习成本获得一种前端解决方案,多一个选项。比其他框架易学,比 HTML + jQuery 的老办法更容易组织代码。
再补充一个例子: mj.js + bootstrap 搭配使用方法 https://github.com/ahui2016/localtags/blob/main/public/home.html
![]() | 1 tadebao 2021-03-04 10:22:18 +08:00 妙啊 |
![]() | 2 tikazyq 2021-03-04 10:27:25 +08:00 ![]() 妈妈不好了,对面那口棺材跳尸了!它似乎还在喊 “前端兴,JQ 王”! |
![]() | 3 Austin2035 2021-03-04 10:29:39 +08:00 Jquery! 永远滴神! |
![]() | 4 Austin2035 2021-03-04 10:30:06 +08:00 @lookcos jQuery |
![]() | 5 Sunyanzi 2021-03-04 10:44:34 +08:00 刚巧路过看到 ... 我觉得如果只是这样的话何必用到 jQuery ... 我自己在用的有类似功能的代码如下 ... 也写了和你一样的示例 ... i.imgur.com/tY6tJYm.png 优势是纯原生无任何依赖且使用时的语法更简单 ... 劣势是实现的代码超过十行了 ... 名字的话 ... 既然你叫 m 那我叫 m2 好了 ... 一个不太成熟的小玩具供参考 ... |
![]() | 6 gaoryrt 2021-03-04 10:51:44 +08:00 |
7 SuperMild OP @Sunyanzi jQuery 方便呀,后续组件需要发生变化的时候,addClass, css, show, hide 等等一大堆函数用起来太舒服了,原生 js 要多打很多字母。 |
8 SuperMild OP @gaoryrt 虽然类似,但侧重点不同,你的工具生成 html 比我的方便、强大,但似乎不关心生成后的操作,而我的组件可以拥有自己的 method, 组件这宰也可以互相交流。 |
9 SuperMild OP 组件这宰 -> 组件之间 |
![]() | 10 oott123 2021-03-04 11:47:55 +08:00 关于“生成元素”这个话题,我喜欢使用 crel : https://www.npmjs.com/package/crel 当然这和楼主分享的并非一回事,只是顺便推荐~ |
12 ai277014717 2021-03-04 13:58:26 +08:00 隐藏着 id 冲突的 bug 。 |
![]() | 13 brookepe 2021-03-04 14:06:30 +08:00 @SuperMild 按照你的思路 我加上了一些自己的想法 希望能给个 star {gayhub}/brooke1220/jquery.template |
14 SuperMild OP @ai277014717 id 问题可根据实际情况改用更小冲突的方法 |
![]() | 18 charten 2021-03-05 14:34:27 +08:00 我也再写一个类似的,只不过我就直接用 jsx 写然后用 babel 转,比如 const Hello = { view:()=><div><h1 class="title">My first app</h1><button>A button</button></div> } |