React:JSX
- JSX是一种句法变换---每一个JSX节点都对应着一个JavaScript函数
- JSX既不提供也不需要运行时库
- JSX并没有改变或添加JavaScript的语义---它只是简单的函数调用而已。
- 运行使用熟悉的语法来定义HTML元素树。
- JSX执行更快,因为它在编译为JavaScript代码后进行了优化。
- 它是类型安全的,在编译过程中就能发现错误。
- 提供更加语义化且易懂的标签。
- 是原生的JavaScript
ReactDOM.render(
<h1>Hello,world!</h1>,
document,getElementById('example')
);
ReactDOM.render(
<div>
<h1>Hello</h1>
<p>一起学习吧</p>
</div>,
document.getElementById('example')
);
var Hello=React.createClass({
render:function(){
return (
<div className="item">Hello</div>
);
}
});
var World=React.createClass({
render:function(){
return (
<div>world</div>
);
}
});
ReactDOM.render(
<div>
<Hello/><World/>
</div>,
document.getElementById('example')
);
//结果:helloworld
var text='Hello world';
ReactDOM.render(
<div>{text}</div>,
document.getElementById('example')
);
//结果:Hello world
function dateToString(d){
return [
d.getFullYear(),
d.getMonth()+1,
d.getDate()
].join('-');
};
ReactDOM.render(
<div>{dateToString(new Date())}</div>,
document.getElementById('example')
);
//结果:2016-9-4
var text=['hello','world'];
ReactDOM.render(
<div>{text}</div>,
document.getElementById('example')
);
//结果:helloworld
var Divider=React.createClass({
render:function(){
return (
<div className="divider">
<h2>{this.props.children}</h2>
</div>
)
}
});
ReactDOM.render(
<Divider>Props</Divider>,
document.getElementById('example')
)
//渲染结果:
<div class="divider">
<h2>Props</h2>
</div>
<div id="id" class="className"></div>
var id='id';
var className='className';
<div id={id} className={className}></div>
<div className={this.getClassName()}></div>
- 使用三目运算符
- 设置一个变量并在属性中引用
- 将逻辑转化到函数中
- 使用&&运算符
render:function(){
return (
<div className={this.state.isActive?'active':''}></div>
)
}
getIsActive:function(){
return this.state.isActive?'active':''
}
render:function(){
return (
var isActive=this.getIsActive();
<div className={isActive}></div>
)
}
getIsActive:function(){
return this.state.isActive?'active':''
}
render:function(){
return (
<div className={this.getIsActive()}></div>
)
}
使用逻辑与(&&)运算符
在React中,null或false是不会输出任何内容的。
render:function(){
return <div className={this.state.isActive && 'active'}></div>
}
如果这个布尔值为true,那么后面的值将会输出。
非DOM属性
- key
- ref
- dangerousSetInnerHTML
键(key)
key是一个可选的唯一标识符。
引用(ref)
ref运行父组件在render方法之外保持对子组件的一个引用。
render:function(){
return (
<div> <input ref='myInput'/> </div>
)
}
当设置了ref后,我们就可以在组件的任何地方使用 this.refs.myInput 获取这个引用了。通过引用获取到的这个对象被称为 支持实例 。它并不是真的DOM,而是React在需要时用来创建DOM的一个描述对象。
我们可以使用 this.refs.myInput.getDOMNode() 访问真实的DOM节点。
事件
在所有浏览器中,事件名已经被规范化并统一用驼峰形式表示,例如,click变成了onClick,change变成了onChange。
handleClick:function(event){},
render:function(){
return <div onClick={this.handleClick}></div>
}
注意:React自动绑定了组件所有方法的作用域,我们永远不需要去手动绑定。
注释
在JSX语法中,有两种方式添加注释:
- 当作一个元素的子节点
- 内联在元素的属性中
<div>
{/*注释*/}
<p></p>
</div>
作为内联属性
<div>
<p
/*注释*/
></p>
</div>
特殊属性
由于JSX最后是转换为原生的JavaScript的,所以有一些关键词是不能使用的,例如:
用 htmlFor 代替 for
用 className 代替 class
样式
React把所有的内联样式都规范化为了驼峰形式,如果你使用过原生的JavaScript中的DOM的style属性,就会发现两者是一致的。
var styles={
borderColor:'#000',
borderRadius:'5'
}
React.createClass({
render:function(){
return (<div style={styles}></div>)
}
})
React 的 JSX 里约定分别使用首字母大、小写来区分本地组件的类和 HTML 标签。
如果往原生 HTML 元素里传入 HTML 规范里不存在的属性,React 不会显示它们。如果需要使用自定义属性,要加 data- 前缀。
<div data-custom-attribute="foo" />
以 aria- 开头的 [网络无障碍] 属性可以正常使用。
<div aria-hidden={true} />
题外话:
最近好像React的中文官网好像秀逗了,直接点击进去都是英文,如果需要查看中文版,可以这样:
英文:http://reactjs.cn/react/docs/getting-started.html
中文:http://reactjs.cn/react/docs/getting-started-zh-CN.html
就是加上-zh-CN
更多建议: