React 入门基础
快速开始
因为 React 开发涉及 JSX 语法和ES6/7新语法还有开发环境和正式环境打包等等工作。建议新手可以使用 Facebook 官方推出的 create-react-app快速开始学习基础知识和代码实践。等到实际项目开发时可以再深入的进行 webpack 定制化开发。
//全局安装
npm install -g create-react-app
//创建项目
create-react-app my-app
cd my-app
//运行
npm start
//测试
npm test
//打包
npm run build
局限性(不支持功能)
Server rendering. 服务器端渲染
Some experimental syntax extensions (e.g. decorators).一些实验性的语法(例如:修饰器)
CSS Modules.
LESS or Sass.
Hot reloading of components.热更新 本人自己开发的支持 redux hot reloading 项目react-started
实际使用项目简介 official-tutorial
改项目就是使用create-react-app创建的一个项目。主要实现了官方文档 实际代码react-tutorial代码使用 ES5 Classes 方式来进行实现,可以进行一个比较。其中省略了服务器端数据请求的逻辑。
三种组件类型
React.createClass
import React, { Component } from 'react'
var TickTock = React.createClass({
//类属性和方法的设置
statics: {
customMethod: function(foo) {
return foo === 'bar';
}
value: 0
},
//初始化 state 值
getInitialState: function() {
return {seconds: 0};
},
//定义 props 参数类型
propTypes: {
name: React.PropTypes.string
},
//设置 props 默认值
getDefaultProps: function() {
return {
name: 'Mary'
};
},
componentDidMount: function() {
this.setInterval(this.tick, 1000); // Call a method on the mixin
},
tick: function() {
this.setState({seconds: this.state.seconds + 1});
},
render: function() {
return (
<p>
React has been running for {this.state.seconds} seconds.
</p>
);
}
});
ES6 Classes export class Name extends React.Component
import React, { Component, PropTypes } from 'react'
export default class App extends Component{
//静态方法
static customMethod(foo){
return foo === 'bar';
}
constructor(){
super()
//初始化 state 值
this.state = {
data: []
}
}
handleCommentSubmit(comment) {
this.setState({
data: [...this.state.data, comment]
})
}
componentDidMount() {
setTimeout(()=>{
this.setState({
data: data
})
}, 3000)
}
render() {
return (
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data} />
<CommentForm onCommentSubmit={this.handleCommentSubmit.bind(this)} />
</div>
);
}
}
//定义 props 参数类型
App.propTypes = {
name: PropTypes.string
};
//设置 props 默认值
App.defaultProps = {
name: 'Mary'
};
//类属性
App.value = 1
纯函数(pure funciton) stateless-functions
适用于无 state 的组件
function Greeting(props) {
return <h1>Hello, {props.name}</h1>;
}
或者 ES6 箭头函数
const Greeting = (props) => (
<h1>Hello, {props.name}</h1>
);
ReactDOM.render(
<Greeting name="Sebastian" />,
document.getElementById('example')
);
参考链接:
自己总结的小知识点
className 和 style
render(){
return (
<div className="demo-class" style={{
height: "100px",
width: "100px",
fontSize: "12px"
}}>
</div>
)
}
render(){
const styleObj = {
height: "100px",
width: "100px",
fontSize: "12px"
}
return (
<div className="demo-class" style={styleObj}>
</div>
)
}
JXS 注释
render(){
return (
<div>
{/* 这里面的内容都是注释 */}
</div>
)
}
DOM 操作
export default class image extends Component {
constructor(props) {
super(props)
}
componentDidMount(){
//获取组件根 html DOM 元素对象
let dom = findDOMNode(this)
}
render() {
retrun <img/>
}
}
export default class Demo extends Component {
constructor(props) {
super(props)
}
componentDidMount(){
//这是该组件的根 DOM 对象
console.info(this.refs.comRootDom);
this._input.focus();
}
render() {
retrun (
<div ref="comRootDom">
{/* ref 还支持函数形式,函数输入参数为 DOM 对象 */}
<TextInput ref={(input) => this._input = input} />
</div>
)
}
}
修改组件 state
要想修改 this.state 必须通过 this.setState 函数进行设置
constructor(){
super()
this.state = {
data: [],
counter: 0,
other: 1
}
}
onClick(){
//以下代码只会改版 this.state.counter 而不会影响 this.state.other 和 this.state.data
this.setState({counter: this.state.counter + 1;
}
render(){
<div className="commentBox">
<h1>Comments</h1>
<span>other {this.state.other}</span>
<span onClick={
//bind 是 bind 函数在 ECMA-262 第五版才被加入(即ES5) 语法中函数的新方法用于绑定函数作用域的
this.onClick.bind(this)
}>counter = {this.state.counter}</span>
<CommentList data={this.state.data} />
<CommentForm onCommentSubmit={this.handleCommentSubmit.bind(this)} />
</div>
}
JSX 语法不支持 IF-ELSE 使用三元运算符或者使用变量独立处理
JSX 中使用三元运算符
render(){
return (
<div>
{
this.state.isShow ? <span>show Text</span> : ""
}
</div>
)
}
使用变量独立处理
render(){
let content = "";
if(this.state.isShow){
content = <span>show Text</span>
}
return (
<div>
{content}
</div>
)
}
生命周期
对于生命周期的理解很重要,生命周期贯彻 react 组件的整个使用过程
网络图片未找到出处,如有侵权请联系我删除该图片
Mounting: componentWillMount
可以在这个函数中发情数据请求,此时进行 setState() render() 将只执行一次
Mounting: componentDidMount
第一次 render() 执行后,此时可以读取对真实DOM进行相关操作
Updating: componentWillReceiveProps(nextProps)
当组件 props 修改(即父组件传递参数变化),在第一次 render() 过程中不执行此函数
变量 | 说明 |
---|---|
this.props | 老的 props |
nextProps | 新的 props |
Updating: shouldComponentUpdate(nextProps, nextState)
如果配置该函数的话必须明确的返回 true 或者 false ,返回决定了本次变化是否引起组件重绘(及执行 render())。
在此函数中可以进行逻辑性的判断来减少组件重绘的次数
Updating: componentWillUpdate(nextProps, nextState)
请不要在此函数中执行修改 state 的逻辑(即调用 setState 函数),如有需要请在 componentWillReceiveProps 中进行修改设置
Updating: componentDidUpdate(prevProps, prevState)
完成组件更新(即完成本次更新重绘 render() 执行之后),此时可以进行 DOM 操作
Unmounting: componentWillUnmount
组件被销毁时调用,已经进行各种销毁逻辑
render()
必须返回唯一包裹组件
render(){
retrun (
<div>
</div>
)
}
// good
render(){
retrun (
<div>
</div>
{/* */}
)
}
// error
render(){
retrun (
<div>
</div>
<div>
</div>
)
}
// error
参考链接:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。