React 的骨架 JSX<转>

为什么需要JSX
JSX 是 Facebook 团队提出的一个语法方案,可以在 JavaScript 的代码直接中使用 HTML 标签来编写 JavaScript 对象。其使用的是 XML-like
语法,这种语法方案需要通过 JSXTransformer
来进行编译转换成真实可用的 JavaScript 代码(React 官方已经推荐使用 babel
来代替)。
React 是基于组件的开发思想,React 认为一个组件可以是一个完全独立的没有任何其他依赖的模块文件。一个组件中可以有自己的样式(Inline Style)和结构(JSX编写的HTML)。
在 React 和 JSX 之前,一个组件如果要包含 HTML 结构将面临如下几个问题:

  1. 组件的 HTML 直接写在页面中,那么组件的结构和行为是分离的;

  2. 组件的 HTML 直接用字符串的形势插入到 JavaScript 代码中,那么就会出现一大段的字符串拼接,开发人员需要很小心的确保字符串拼接时没有因为少了一个符号而导致整个代码无法运行;

  3. 使用 MVC
    分层的思想,引入模板引擎,那么该如何引入模板文件的片段呢;

JSX 很好的解决了这些问题。
基本语法
使用 JSX 来创建一个 HTML 标签,首字母小写:
<pre>
var link = <a href="xxx">Hello World!</a>
</pre>
相当于调用了 React.createElement
方法:
<pre>
var link = React.createElement('a', {href: 'xxx'}, 'Hello World!')
</pre>
使用 JSX 来创建一个 Component,首字母大写:
<pre>
var HelloWorld = <HelloWorld foo="bar"></HelloWorld>
</pre>
首字母的大小写有严格的区分,这样 JSX 可以很简单的通过区分首字母是小写还是大写来判断转换的是 HTML 标签还是自定义的 Component。
JSX 标签的标签都需要有完整的结束符号,否则编译会报错。
<pre>
<div></div>
<input type="text"/>
</pre>
变量和逻辑
JSX 中可以通过 {xxx}
来插入一个 JavaScript 变量:
<pre>
var name = 'xiao ming';
<a href="xxx">Hello {name}!</a>
</pre>
没错,HTML 语法就是这样和 JavaScript 语法无缝的结合!
如果要在 JSX 中插入一段 JavaScript 代码,那么一次只能插入一个一次就能执行完的语句。
<pre>
var link = <a href="xxx">Hello {if (conditions) {'xiao ming'}}!</a>
</pre>
上面的代码编译后会是这样的:
<pre>
var link = React.createElement( 'a', {href: 'xxx'}, if (conditions) {'xiao ming'})
</pre>
编译后可以看到明显存在语法错误,可以使用三元运算符来将条件判断语句简化成一个语句:
<pre>
var link = <a href="xxx">Hello {conditions ? 'xiao ming' : ''}!</a>
</pre>
多行语句和根节点
无论你的 JSX 代码有多长,每一段代码都只能有一个根节点,否则编译通不过,因为 React 需要确保一个组件只能有一个根节点。
<pre>
// 错误的写法
var btnBox = (
<button>Click me</button>
<p>hello world!</p>
);

// 正确的写法
var btnBox = (
<div>
<button>Click me</button>
<p>hello world!</p>
</div>
);
</pre>
如果想在 JSX 中添加注释,需要使用多行注释的语法并确保其包裹在 {} 中。
<pre>
<div>
<h3> title </h3>
{/*<p>text</p>/*}
</div>
</pre>
关键字冲突
因为 JSX 是直接将 HTML 写在 JavaScript 代码中,如果在 HTML 中有的属性中有 JavaScript 的关键字,必须进行转换,转换规则和在 JavaScript 中使用 DOM 的 property 一样。如 class 需转换成className,for 要转换成 htmlFor,还有其他的关键字这里不做一一列举。

false in JSX
false 在 JSX 中,会有不同的作用。
<pre>
<div id={false}>
<input type="text" name="name" value={false} />
<button type="button" name="button" disabled={false}>hello</button>
<p>{false}</p>
</div>
</pre>
id={false} 和 value={false} 都换转换成字符串 false,disabled={false} 是设置 disabled属性为 false,<p>{false}</p> 表示该 p 标签没有子元素

Inline Style
上面提到过 React 希望一个组件中可以是独立的,可以将样式直接通过 JavaScript 的对象插入到 JSX 中,这样就可以给一个组件定义样式了。
<pre>
var paraStyle = {
color: '#fff',
fontSize: '14px'
};
var para = (
<p style={paraStyle}></p>
);
</pre>
在定义样式的时候,对象的 key 就是样式的属性,属性中如果有中划线,需将其换成驼峰式value 就是对应的属性值。对于一些复杂的伪类选择器,以及其他的一些高级的 CSS 特性,有相应的库可以对其支持。
将样式通过内联的形式写在组件内部,虽然有违分离原则,但是其确实解决了因为分离带来的组件独立性的问题,虽然是反模式化的,但确确实实解决了一个痛点。

命名空间
JSX 中还可以支持组件的命名空间,可以让组件的层次更清晰,更语义化。
<pre>
var Form = React.createClass({ ... });
Form.Row = React.createClass({ ... });
Form.Label = React.createClass({ ... });
Form.Input = React.createClass({ ... });
var App = (
<Form>
<Form.Row>
<Form.Label />
<Form.Input />
</Form.Row>
</Form>
);
</pre>
代码风格建议
为了代码有更好的可读性,无论是单行语句还是多行语句,都建议使用 () 来包裹 JSX 语句。在JSX 中插入 JavaScript 语句的时候尽量不要嵌套太长的三目运算符,JSX 本身就是为了开发更简便和更好的维护性。如果把 JSX 也写成一坨一坨可读性很差的代码,实在太不应该了。
原载于:雨夜带刀’s Blog本文链接:http://stylechen.com/react-jsx.html
如需转载请以链接形式注明原载或原文地址。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容