React JSX语法说明
####什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代码里直接写起了XML标签,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,当然你想直接使用纯Javascript代码写也是可以的,只是利用JSX,组件的结构和组件之间的关系看上去更加清晰。 var MyComponent = React.createClass({/*...*/}); var myElement = <MyComponent someProperty={true} />; React.render(myElement,document.body); 一个XML标签,比如 比如: var Nav = React.createClass({/*...*/}); var app = <Nav color="blue"><Profile>click</Profile></Nav>; 会被转化为: var Nav = React.createClass({/*...*/}); var app = React.createElement( Nav,{color:"blue"},React.createElement(Profile,null,"click") ); 那么也就是说,我们写一个XML标签,实质上就是在调用 ReactElement createElement( string/ReactClass type,[object props],[children ...] ) 这个方法的第一个参数可以是一个字符串,表示是一个HTML标准内的元素,或者是一个 ####JSX转化器 要把带有JSX语法的代码转化为纯Javascript代码,有多种方式,对于内联与HTML中的代码或者是未经过转化的外部文件,在 npm install -g react-tools 并使用命令行工具转化即可(具体用法可以参考 jsx src/ build/ 如果使用自动化工具,比如 ####使用HTML标签 要创建一个HTML标准中存在的元素,直接像写HTML代码一样即可: var myDivElement = <div className="foo" />; React.render(myDivElement,document.body); 不过需要注意的是 还有一点是,在创建HTML标准内的元素时,JSX转化器会丢弃那些非标准的属性,如果一定要添加自定义属性,那么需要在这些自定义属性之前添加 <div data-custom-attribute="foo" /> ####命名空间式组件 比如开发组件的时候,一个组件有多个子组件,你希望这些子组件可以作为其父组件的属性,那么可以像这样用: 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({ ... }); 而创建子元素可以直接交给JSX转化器: var App = ( React.createElement(Form,React.createElement(Form.Row,React.createElement(Form.Label,null),React.createElement(Form.Input,null) ) ) ); 该功能需要0.11及以上版本 ####Javascript表达式 在JSX语法中写Javascript表达式只需要用 // 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) ); 不过要注意的是,JSX语法只是语法糖,它的背后是调用 // This JSX: <div id={if (condition) { 'msg' }}>Hello World!</div> // Is transformed to this JS: React.createElement("div",{id: if (condition) { 'msg' }},"Hello World!"); 可以从转化后的Javascript代码中看出明显的语法错误,所以要不用三目运算符,要不就这样写: if (condition) <div id='msg'>Hello World!</div> else <div>Hello World!</div> ####传播属性(Spread Attributes) 在JSX中,可以使用 var props = { foo: x,bar: y }; var component = <Component { ...props } />; 这样就相当于: var component = <Component foo={x} bar={y} /> 它也可以和普通的XML属性混合使用,需要同名属性,后者将覆盖前者: var props = { foo: 'default' }; var component = <Component {...props} foo={'override'} />; console.log(component.props.foo); // 'override' ####参考资料(可能无法直接打开链接)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |