说实话,我是被innerHTML等方式搞的受不了了才开始研究模板引擎的。。。。。。。。
现在市面上有许多的模板框架,像EasyTemplate,Angular什么的真的很多,为了选择一个适合自己的框架,我也是煞费苦心啊。
Angular确实是一个跨时代的产品,但是我是真的不适应她的语法,总觉得自己写的很别扭,无意之中发现了React,发现这货很是对我的胃口啊。好了,废话不多说,直接上料。
1.安装
React官网,我自己的开发环境是windos,只说一说地址就好了。
2.helloWorld
好吧,这是惯例QAQ
在这之前,我们看看目录结构
下面是React的HTML模板
<!DOCTYPE html> <html> <head> <script src="react/build/react.js"></script> <script src="react/build/JSXTransformer.js"></script> </head> <body> <div id="example"></div> <script type="text/jsx"> var name = "World"; React.render( <p>hello {name}</p>,document.getElementById("example") ); </script> </body> </html>
以上的代码就是一个最简单的React应用了,其中react.js是React的基本文件,JSXTransformer.js是一个JSX语法翻译器(我是这么叫的。。。)或者叫做解析器(JSX是一个javascript语法糖,有兴趣的自行百度)。这两个文件必须先行引入,因为必须将我们系的JSX翻译成源生的JavaScript。特别提示:在讲JSX翻译成JS的时候特别的费时,建议在上线之前直接翻译。
以上的代码,是HTML和JavaScript混合在一起的写法,当然React也支持原生的JS语法,如下
<!DOCTYPE html> <html> <head> <script src="react/build/react.js"></script> <script src="react/build/JSXTransformer.js"></script> </head> <body> <div id="example"></div> <script type="text/jsx"> var p = React.createElement('p',null,'hello World'); React.render(p,document.getElementById('example')); </script> </body> </html>
个人比较推荐JSX的写法,因为看起来比较爽,写起来简单而且并不需要那么多的回调。。。。
组件
React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类,如下
JS代码 /** * reactJS 组件类 */ var H = React.createClass({ render: function () { return <p className="className">{this.props.name} hello world</p>; } }); React.render( <H name="ReactJS" />,document.getElementById("example") ); HTML代码: <!DOCTYPE html> <html> <head> <script src="react/build/react.js"></script> <script src="react/build/JSXTransformer.js"></script> </head> <body> <div id="example"></div> <script type="text/jsx" src="test.js"> </script> </body> </html>
在写组件的过程中,我发现组件的命名首字母必须大写,我不知道这是什么原因,求哪位大神指导一些,不胜感激。。
在构建模板的时候,class和for属性必须写成className和htmlFor,因为class和for是JavaScript的保留字。
下面,来一发时间注册。React的时间注册类似于原生的onclick等方式
/** * reactJS 组件类 */ var H = React.createClass({ click: function () { alert("click") },over: function () { alert("over") },render: function () { var c = "click",o = "over"; return ( <div> <p onClick={this.click}>{c}</p> <p onMouSEOver={this.over}>{o}</p> </div> ); } }); React.render( <H name="ReactJS" />,document.getElementById("example") );
在注册完成之后,查看DOM节点,发现依旧使用的是addEventListener方式。
支持行内样式书写,就是直接在dom的style后面赋值即可
var divStyle = { color: 'white',backgroundColor: 'red',WebkitTransition: 'all',// note the capital 'W' here msTransition: 'all' // 'ms' is the only lowercase vendor prefix }; React.render( <div style={divStyle}>Hello World!</div>,document.getElementById("example"));
关于if else,首先我以为它可以这样。。。
/** * reactJS 组件类 */ var H = React.createClass({ render: function () { var d = false; return ( <div> if (d) { <p>123</p> } else { <p>321</p> } </div> ); } }); React.render( <H name="ReactJS" />,document.getElementById("example") );
然而这一切并没有卵用!
看看官方文档。。。人家是这么写的。
var loginButton; if (loggedIn) { loginButton = <logoutButton />; } else { loginButton = <LoginButton />; } return ( <nav> <Home /> {loginButton} </nav> )
我自己试了试
/** * reactJS 组件类 */ var H = React.createClass({ render: function () { var d = false; var val; if (d) { val = <div><p>123</p></div>; } else { val = <div><p>321</p></div>; } return val; } }); React.render( <H name="ReactJS" />,document.getElementById("example") );
这个还是有卵用的。
看样子哈,这个JSX中XML语法内是不可以夹杂javascript语法的,不知道对不对,我再查查看。。。。
在官方文档中,这个也是不允许的
// This JSX: <div id={if (condition) { 'msg' }}>Hello World!</div> // Is transformed to this JS: React.createElement("div",{id: if (condition) { 'msg' }},"Hello World!");
在这里要么使用3元表达式,要么老老实实的拆成两段写。
原文链接:https://www.f2er.com/react/307881.html