靖鑫 2017-03-06 4807浏览量
React开创了新的避免手动操作DOM方式——
JSX
,它不仅仅是一套库,而是一套标准。
React现如今已经成为前端开发者的首选技术了,它天生携带着组件化的理念,并且拥有极强的生态,如Redux
,Flux
等数据管理工具,Material-UI
,MUI
,Ant.Design
等UI组件,对于一个全新的控制台系统,在脚手架的辅助下,我们可以花费很少的时间就能投入到业务开发中。
对于无线端,React
也能够很好的支持,但是对于一些运营活动页面来说,大部分情况下使用kimi
是可以应付的,这些活动页具有如下特点:
但是对于以下特点的活动页,使用kimi
就有些力不从心了。
对于上述活动页而言,其已经可以看作一个完整的中型Application
了,如果仅仅使用kimi
,则因为状态多,交互多而存在代码质量不好把控,在操作DOM上花费额外精力,造成项目Delay的风险,由此可见,对于这类活动页,我们有必要使用一些库来帮我们解决问题了,React
自己天然一套全家桶,携带了PropType
,Children
,Synthetic Events
(合成事件),这些对于Web
应用来说,依然是可以的,但是对于活动页来说,还是有些重了,于是要搬出Preact
了,接下来简单地对它有一个了解。
Preact
是以React
为标准实现的一套库。API
几乎一致,迁移起来很方便。Webpack
,Babel
的配置文件。React
的思想,来避免你手动操作DOM
。React
,Vue
都快,非常适合移动端。参考
下面是它的一个简单示例,你会发现几乎和React
一模一样,只是引入的文件发生了改变,也就是说对于现有的一个页面,我们可以用Preact
重构掉原先的DOM操作。
import {h,render} from 'preact';
render((
<div>
<h1>Hello World</h1>
<button onClick={function(){console.log('hi')}}> Click Me </button>
</div>
),document.body);
JSX
在开发React
时,我们都会去写JSX
而不去写原生的React API,回顾一下,我们看一下JSX
会被Babel
翻译成什么。
// 这是一段React示例代码
class Demo extends React.Component {
render(){return (
<div className="active">
<ul></ul>
</div>
)}
}
//经过Babel转译后
_createClass(Demo, [{
key: "render",
value: function render() {
return React.createElement(
"div",
{ className: "active" },
React.createElement(
"ul",
null
)
);
}
}]);
我们看到处理DOM的API为React.createElement
,在Preact
里,它使用了hyperscript
来代替React.createElement
这个方法,所以你需要告诉Babel
使用h
去处理。
{
"plugins": [
["transform-react-jsx", { "pragma":"h" }]
]
}
甚至你也可以这么做。
import { h } from 'preact'
const React = {
createElement:h
}
Preact
只是简单地对事件做了一层处理,我们看它的源码便可知晓,我们在JSX
里写的onClick
其实最终形成了addEventListener('click')
,由于其只是原生的事件绑定,这样给予我们的灵活度更高,移动端头疼的300ms延时和点击穿透问题也可以迎刃而解(fastclick)。
else if ('o' === name[0] && 'n' === name[1]) {
var l = node._listeners || (node._listeners = {});
name = toLowerCase(name.substring(2));
if (value) {
if (!l[name]) node.addEventListener(name, eventProxy);
} else if (l[name]) node.removeEventListener(name, eventProxy);
l[name] = value;
}
在前端有许多中模板渲染方案,如jade(pug)
,mustache
,ejs
,我们也可以使用JSX
用来渲染,相比前面几种,JSX
写法简单,非常容易。举个例子:如果我们要根据后端返回的一段奖品列表渲染一个列表,用ejs
可能会是下面这样:
<ul>
<% lotteries.forEach(function(lottery){ %>
<% include lottery/show %>
<% }) %>
</ul>
但是使用Preact
,我们可以只使用render
方法,结合JSX
语法,来作为我们渲染HTML的工具。
let content = lotteries.map(lottery=>(
<li>{lottery.prizeName}</li>
))
let List = (
<ul>
{content}
</ul>
)
let html = render(<List/>); // DOM Object
let htmlString = html.outerHTML // String
// do anythingÏ
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧