这里只写出完善环境下的初始化命令,具体的环境搭建可参考 React JSX | 菜鸟教程
cnpm install -g create-react-app
create-react-app my-app
cd my-app/
npm start
my-app/
README.md - 自述文件
node_modules/ - node模块(存放npm install 的组件)
package.json - 包管理文件(管理npm的安装包)
.gitignore - git忽略文件
public/- 存放了项目的启动页面及依赖文件
favicon.ico - 网页标题logo
index.html - 网页首页
src/ - 页面各种资源
App.css - app页面css
App.js - App页面组件及js
App.test.js - 测试文件,删除没有影响(存疑)
index.css - 启动页样式
index.js - 启动页组件
logo.svg - Logo
registerServiceWorker.js - 用于在生产环境中为用户在本地创建一个service worker 来缓存资源到本地,提升应用的访问速度
JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析。
JSX本身就和XML语法类似,可以定义属性以及子元素。唯一特殊的是可以用大括号来加入JavaScript表达式,如:
var person = window.isLoggedIn ? window.name : ''} />;
一般每个组件都定义了一组属性(props,properties的简写)接收输入参数,这些属性通过XML标记的属性来指定。大括号中的语法就是纯JavaScript表达式,返回值会赋予组件的对应属性,因此可以使用任何JavaScript变量或者函数调用。上述代码经过JSX编译后会得到:
var person = React.createElement(
Person,
{name: window.isLoggedIn ? window.name : ''}
);
子元素也是类似,既可以在{}内写入xml,又可以在xml中插入{}形式的js,如此不断递归使用,如:
var node = (
<div className="container">
{
person ? <span>Welcome back, <b>{person.firstName} {person.lastName}b>!span>
: <span>Please log inspan>
}
div>
);
如果需要展现一组子节点,只需表达式返回一个JavaScript数组,数组的每个元素都是一个React组件,如:
var ul = (
<ul class="unstyled">
{lis}
ul>
);
其中lis就是有多个“li”元素的数组。
和原生HTML定义事件的唯一区别就是JSX采用驼峰写法来描述事件名称,大括号中仍然是标准的JavaScript表达式,返回一个事件处理函数。在JSX中你不需要关心什么时机去移除事件绑定,因为React会在对应的真实DOM节点移除时就自动解除了事件绑定。
<button onClick={this.checkAndSubmit.bind(this)}>Submitbutton>
React并不会真正的绑定事件到每一个具体的元素上,而是采用事件代理的模式:在根节点document上为每种事件添加唯一的Listener,然后通过事件的target找到真实的触发元素。这样从触发元素到顶层节点之间的所有节点如果有绑定这个事件,React都会触发对应的事件处理函数。这就是所谓的React模拟事件系统。
在JSX中使用样式,不像常规的那样需要个一个单独的CSS文件,而是通过style属性来定义,但和真实DOM不同的是,属性值不能是字符串而必须为对象,如:
<div style={{color: '#ff0000', fontSize: '14px'}}>Hello World.div>
其中双大括号具有不同的含义,外层大括号为JSX的语法,内层大括号为JS代码,为了代码更直观,也可以先把JS赋值给一个对象,然后传进去,如:
var style = {
color: '#ff0000',
fontSize: '14px'
};
var node = HelloWorld.;
在JSX中可以使用所有的的样式,基本上属性名的转换规范就是将其写成驼峰写法,例如“background-color”变为“backgroundColor”, “font-size”变为“fontSize”,这和标准的JavaScript操作DOM样式的API是一致的。
在JSX中,我们不仅可以使用React自带div, input…这些虚拟DOM元素,还可以自定义组件。组件定义之后,也都可以利用XML语法去声明,而能够使用的XML Tag就是在当前JavaScript上下文的变量名,这一点非常好用,你不必再去考虑某个Tag是如何对应到相应的组件实现。例如React官方教程中的例子:
class HelloWorld extends React.Component{
render() {
return (
Hello, "text" placeholder="Your name here" />!
It is {this.props.date.toTimeString()}
);
}
};
setInterval(function() {
React.render(
new Date()} />,
document.getElementById('example')
);
}, 500);
其中声明了一个名为HelloWorld的组件,那么就可以在XML中使用,这个Tag就是JavaScript变量名,我们可以用任意变量名:
var MyHelloWorld = HelloWorld;
React.render( , …);
而且还可以引入命名空间
var sampleNameSpace = {
MyHelloWorld: HelloWorld
};
React.render(.MyHelloWorld />, …);
在组件内部添加html代码,并将html代码渲染到页面上。React默认会进行HTML的转义,但有些特殊情况会转义的不够准确,如使用 
添加空格时,这时可以使用dangerouslySetInnerHTML
进行转义:
<div dangerouslySetInnerHTML={{__html: '<h3>hahhah</h3>'}}>div>
dangerouslySetInnerHTML
必须是一个对象,所以也可以赋值给对象,使代码更加直观:
function createMarkup() {
return {__html: 'First Second'};
}
function MyComponent() {
return <div dangerouslySetInnerHTML={createMarkup()}>div>;
}
ReactDOM.render(
Hello, world!{/*在标签内*/}
,
// 在标签外
document.getElementById('example')
);
这一篇应该就够了
React Native 中组件的生命周期
参考:
React JSX | 菜鸟教程
深入浅出React(三):理解JSX和组件