[关闭]
@brizer 2016-02-14T20:14:54.000000Z 字数 3069 阅读 1180

React Up&Running第四章 JSX


前言

前面的章节都是在没有使用JSX的基础上来完成的,现在来学习JSX。关于JSX的基本语法我在前面写过,这里就不再重复了。主要记录下之前不了解的地方,比如说{}的用法,JSX和HTML的区别,还有表单控件的一些细节问题。


{ }

空格

先来说说{}的用法吧。{ }中可以存放表达式,也可以直接存放变量的值。
比如下面的JSX:

  1. <h1>
  2. {1} plus {2} is {3}
  3. </h1>

转化为HTML后变成:

  1. <h1>
  2. <span>1</span><span> plus </span><span>2</span><span> is </span><span>3</span>
  3. </h1>

而如果我们采用JSX的多行写法:

  1. <h1>
  2. {1}
  3. plus
  4. {2}
  5. is
  6. {3}
  7. </h1>

则结果为:

  1. <h1>
  2. <span>1</span><span>plus</span><span>2</span><span>is</span><span>3</span>
  3. </h1>

和前面的区别在于空格没有了。

符号

再来说说符号,看看下面的JSX:

  1. <h2>
  2. More info &raquo;
  3. </h2>

$raquo会转化为>>,而如果我们使用{ }将其包裹起来,这会按照原样输出:

  1. <h2>
  2. {"More info &raquo;"}
  3. </h2>

JSX和HTML区别

官方文档中关于这一块提到的不多,这里正好做个补充。

class和for

当我们在JSX中给组件设置class和for时要转换成className和htmlFor,因为这两个是javascript的保留关键字:

  1. // NO-NO!
  2. var em = <em class="important" />;
  3. var label = <label for="thatInput" />;
  4. // OK
  5. var em = <em className="important" />;
  6. var label = <label htmlFor="thatInput" />;

styles

当我们给标签赋予样式时,需要注意通过对象的方式赋予:

  1. NO-NO!
  2. var em = <em style="font-size: 2em; line-height: 1.6" />;
  3. // OK
  4. var styles = {
  5. fontSize: '2em',
  6. lineHeight: '1.6'
  7. };
  8. var em = <em style={styles} />;
  9. // inline is also OK
  10. // note the double {{}} - one for dynamic value in JSX, one for JS object
  11. var em = <em style={{fontSize: '2em', lineHeight: '1.6'}} />;

标签闭合

在html中有时候我们可以不用闭合标签,因为浏览器会帮助我们来识别,而在JSX中必须闭合:

  1. // NO-NO, unclosed tags, though fine in HTML
  2. var gimmeabreak = <br>;
  3. var list = <ul><li>item</ul>;
  4. var meta = <meta charset="utf-8">;
  5. // OK
  6. var gimmeabreak = <br />;
  7. var list = <ul><li>item</li></ul>;
  8. var meta = <meta charSet="utf-8" />;
  9. // or
  10. var meta = <meta charSet="utf-8"></meta>;

驼峰

JSX中默认都是以驼峰命名方式来识别的,打个比方,onclick必须是onClick才有效:

  1. // NO-NO!
  2. var a = <a onclick="reticulateSplines()" />;
  3. // OK
  4. var a = <a onClick={reticulateSplines} />;

表单

接下来说说表单,表单我在前面也提到过,主要是value和defaultValue的区别,还有onChange事件,这里就不再多提,还是写些学到的新东西。

textarea中的值

不同表示方式下,不同的显示,看看如下代码:

  1. function log(event) {
  2. console.log(event.target.value);
  3. console.log(event.target.defaultValue);
  4. }
  5. React.render(
  6. <textarea defaultValue="hello\nworld" onChange={log} />,
  7. document.getElementById('app1')
  8. );
  9. React.render(
  10. <textarea defaultValue={"hello\nworld"} onChange={log} />,
  11. document.getElementById('app2')
  12. );
  13. React.render(
  14. <textarea onChange={log}>hello
  15. world
  16. </textarea>,
  17. document.getElementById('app3')
  18. );
  19. React.render(
  20. <textarea onChange={log}>{"hello\n\
  21. world"}
  22. </textarea>,
  23. document.getElementById('app4')
  24. );

效果如下:

select的值

对于select的值来说,html中我们要选中需要设置selected:

  1. <!-- old school HTML -->
  2. <select>
  3. <option value="stay">Should I stay</option>
  4. <option value="move" selected>or should I go</option>
  5. </select>

但是在JSX中,我们通过defaultValue来设置:

  1. // React/JSX
  2. <select defaultValue="move">
  3. <option value="stay">Should I stay</option>
  4. <option value="move">or should I go</option>
  5. </select>

如果多选也是类似:

  1. <select defaultValue={["stay", "move"]} multiple={true}>
  2. <option value="stay">Should I stay</option>
  3. <option value="move">or should I go</option>
  4. <option value="trouble">If I stay it will be trouble</option>
  5. </select>

当然了,我们也可以通过value而不是defaultValue来设置,这样就变得灵活一些:

  1. var MySelect = React.createClass({
  2. getInitialState: function() {
  3. return {value: 'move'};
  4. },
  5. _onChange: function(event) {
  6. this.setState({value: event.target.value});
  7. },
  8. render: function() {
  9. return (
  10. <select value={this.state.value} onChange={this._onChange}>
  11. <option value="stay">Should I stay</option>
  12. <option value="move">or should I go</option>
  13. <option value="trouble">If I stay it will be trouble</option>
  14. </select>
  15. );
  16. }
  17. });
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注