react学习系列之深入jsx
Why JSX?
Transformvar Nav,Profile; // Input (JSX): var app = <Nav color="blue"><Profile>click</Profile></Nav>; // Output (JS): var app = React.createElement( Nav,{color:"blue"},React.createElement(Profile,null,"click") ); 也就是说,我们写一个XML标签,实质上就是在调用 ReactElement createElement( string/ReactClass type,[object props],[children ...] ) 通过上面的代码可以看出 HTML Tags vs. React Components
var myDivElement = <div className="foo" />; ReactDOM.render(myDivElement,document.getElementById('example')); 渲染React组件,声明变量采用首字母大写 var MyComponent = React.createClass({/*...*/}); var myElement = <MyComponent someProperty={true} />; ReactDOM.render(myElement,document.getElementById('example')); 语法
var arr = [ <h1>Hello world!</h1>,<h2>React is awesome</h2>,]; React.render( <div>{arr}</div>,document.getElementById('example') ); Attribute Expressions// Input (JSX): var person = <Person name={window.isLoggedIn ? window.name : ''} />; // Output (JS): var person = React.createElement( Person,{name: window.isLoggedIn ? window.name : ''} ); Child Expressions// Input (JSX): var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>; // Output (JS): var content = React.createElement( Container,window.isLoggedIn ? React.createElement(Nav) : React.createElement(Login) ); Boolean Attributes// These two are equivalent in JSX for disabling a button <input type="button" disabled />; <input type="button" disabled={true} />; // And these two are equivalent in JSX for not disabling a button <input type="button" />; <input type="button" disabled={false} />; 注释JSX 里添加注释很容易;它们只是 JS 表达式而已。你只需要在一个标签的子节点内(非最外层)小心地用 {} 包围要注释的部分。 var content = ( <Nav> {/* 一般注释,用 {} 包围 */} <Person /* 多 行 注释 */ name={window.isLoggedIn ? window.name : ''} // 行尾注释 /> </Nav> ); 由于JSX只是一种语法,因此JavaScript的关键字class,for等也不能出现在XML中,而要使用className,htmlFor代替,这和原生DOM在JavaScript中的创建也是一致的。 Spread Attributes如果你事先知道组件需要的全部 Props(属性),JSX 很容易地这样写: var component = <Component foo={x} bar={y} />; 如果你不知道要设置哪些 Props,那么现在最好不要设置它: var component = <Component />; component.props.foo = x; // bad component.props.bar = y; // also bad 这样是反模式,因为 React 不能帮你检查属性类型(propTypes)。这样即使你的 属性类型有错误也不能得到清晰的错误提示。 Props 应该被当作禁止修改的。修改 props 对象可能会导致预料之外的结果,所以最好不要去修改 props 对象。 var props = {}; props.foo = x; props.bar = y; var component = <Component {...props} />; 传入对象的属性会被复制到组件内。 它能被多次使用,也可以和其它属性一起用。注意顺序很重要,后面的会覆盖掉前面的。 var props = { foo: 'default' }; var component = <Component {...props} foo={'override'} />; console.log(component.props.foo); // 'override' JSX 陷阱JSX 与 HTML 非常相似,但是有些关键区别要注意。 内联样式在React中写行内样式时,要这样写,不能采用引号的书写方式 React.render( <div style={{color:'red'}}> xxxxx </div>,document.body ); HTML 实体React默认会进行HTML的转义,避免XSS攻击 <div>{'First · Second'}</div> 安全的做法是先找到 实体的 Unicode 编号 ,然后在 JavaScript 字符串里使用。 <div>{'First u00b7 Second'}</div> <div>{'First ' + String.fromCharCode(183) + ' Second'}</div> 还可以直接使用原生的HTML,但可以看出不推荐这种做法 <div dangerouslySetInnerHTML={{'{{'}}__html: 'First · Second'}} /> 自定义 HTML 属性如果往原生 HTML 元素里传入 HTML 规范里不存在的属性,React 不会显示它们。如果需要使用自定义属性,要加 data- 前缀。 <div data-custom-attribute="foo" /> 以 aria- 开头的 [网络无障碍] 属性可以正常使用。 <div aria-hidden={true} /> TIPS三元运算符代替IF...ELSE在JSX中是不可以直接在{}中加入if-else的,可以使用下面这种三元表达式: React.render(<div id={condition ? 'msg' : ''}>Hello World!</div>,mountNode); 在三元运算符满足不了的时候,React建议的方式是在JS代码中使用if表达式 var loginButton; if (loggedIn) { loginButton = <LogoutButton />; } else { loginButton = <LoginButton />; } return ( <nav> <Home /> {loginButton} </nav> ); Switch-Casereturn ( <section> <h1>Color</h1> <h3>Name</h3> <p>{this.state.color || "white"}</p> <h3>Hex</h3> <p> {(() => { switch (this.state.color) { case "red": return "#FF0000"; case "green": return "#00FF00"; case "blue": return "#0000FF"; default: return "#FFFFFF"; } })()} </p> </section> ); False in JSXReactDOM.render(<div id={false} />,mountNode); 渲染出 id="false" ReactDOM.render(<input value={false} />,mountNode); 渲染出字符串"false"作为input的value ReactDOM.render(<div>{false}</div>,mountNode); 渲染出无子元素 命名空间式组件用法如下 var Form = MyFormComponent; var App = ( <Form> <Form.Row> <Form.Label /> <Form.Input /> </Form.Row> </Form> ); var MyFormComponent = React.createClass({ ... }); MyFormComponent.Row = React.createClass({ ... }); MyFormComponent.Label = React.createClass({ ... }); MyFormComponent.Input = React.createClass({ ... }); 注意点如下: React.js的命名空间的组件 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |