React不支持IE6、IE7
React是什么?
用于构建用户界面的JAVASCRIPT库,是MVC中的V(视图)。
React特点:
1. 声明式设计
2. 减少与DOM的交互,高效
3. JSX - JSX是JavaScript语法的扩展。React 开发不一定使用JSX,但建议使用它
4. 构建组件,方便应用在大项目中
5. 单向响应的数据流
一个实例:
1 //把Hello, world输入到#example中 2 ReactDOM.render( 3 <h1>Hello, world</h1>, 4 document.getElementById('example') 5 );
React的安装:
react.min.js - React 的核心库
react-dom.min.js - 提供与 DOM 相关的功能
browser.min.js - 用于将 JSX 语法转为 JavaScript 语法
通过 npm 使用 React
参考:http://www.runoob.com/react/react-install.html
webstorm不支持babel的解决办法:
把引入的script库browser换成JSXTransformer,然后把type类型改为:text/jsx ,最后再把JavaScript版本修改为JSX Harmony就ok了。
JSX 就是 JavaScript
React 组件
React State 状态
getInitialState: 定义初始状态
handleClick: 程序自定义方法
render:
this.setState 修改状态值
this.state 当前状态值
React props (小道具)
state 可改变,容器组件里用的比较多
props 是不可变的
props:在容器里提取属性,比如:this.props.name 提取name的属性值
getDefaultProps() 设置默认 props 值
props 验证(不管用)
propTypes
React.PropTypes
React 组件 API
setState 设置状态 this.setState(fn/key: value) 最重要
replaceState 替换状态
setProps 设置属性
replaceProps 替换属性
forceUpdate 强制更新 尽量避免使用
getDOMNode 获取DOM节点
isMounted 判断组件挂载状态
组件API查询网址:
http://itbilu.com/javascript/react/EkACBdqKe.html
React 组件的生命周期
三个状态:
1. Mounting 已插入真实DOM
2. Updating 正在被重新渲染
3. Unmounting 已移出真实DOM
生命周期方法:
componentWillMount 渲染前调用
componentDidMount 第一次渲染调用,只在客户端,可以通过 this.getDOMNode() 进行访问,
如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。
......
官方文档:
http://facebook.github.io/react/docs/component-specs.html#lifecycle-methods
React Ajax
React 表单与事件
this.refs 获取组件的引用
代码1:
1 var i = 1; 2 3 // react 自动添加单位px 4 var myStyle = { 5 fontSize: 20, 6 color: 'orange' 7 }; 8 9 var arr = [ 10 <h1>数组元素1</h1>, 11 <h2>数组元素2</h2> 12 ]; 13 14 // react 组件 15 var MyReactComponent = React.createClass({ 16 render: function () { 17 return <h1>我是react组件,属性name的值:{this.props.name}</h1>; 18 } 19 }); // MyReactComponent 是组件名,组件名要求大写开头,否则会报错 20 21 ReactDOM.render( 22 <div> 23 <h1>使用表达式</h1> 24 <h2>{1 + 1}</h2> 25 <p>{i = 1 ? 'true' : 'false'}</p> 26 <p data-myattribute="some_value">这是一个不错的JavaScript库</p> 27 <p style = {myStyle}>样式</p> 28 {/* 注释 */} 29 {/* JSX支持在模板中添加数组,数组会自动展开 */} 30 <div>{arr}</div> 31 {/* react 组件,直接在标签里引入组件名,组件类只能包含一个顶层标签,否则也会报错 */} 32 <MyReactComponent name='lqc_react' /> 33 </div>, 34 document.getElementById('example') 35 );
代码2:
1 /** 2 * 编写一个符合组件 3 * 要求:1.有大标题 4 * 2.有链接,链接点击进入百度首页 5 */ 6 7 var Name = React.createClass({ 8 render: function () { 9 return <h1>{this.props.name}</h1> 10 } 11 }); 12 13 var Link = React.createClass({ 14 render: function () { 15 return <a target='_blank' href={this.props.link}>{this.props.link}</a> 16 } 17 }); 18 19 var WebSite = React.createClass({ 20 render: function () { 21 return (<div> 22 <Name name={this.props.name} /> 23 <Link link={this.props.link} /> 24 </div>); 25 } 26 }); 27 28 ReactDOM.render( 29 <WebSite name='百度' link='http://www.baidu.com' />, 30 document.getElementById('example') 31 );
代码3:
1 // 自定义 react 功能组件 2 var Liked = React.createClass({ 3 // 设置默认状态,getInitialState() 是系统规定函数 4 getInitialState: function () { 5 return {liked: false}; 6 }, 7 // 自定义函数 8 handleClick: function () { 9 this.setState({liked: !this.state.liked}); 10 }, 11 render: function () { 12 var text = this.state.liked ? '喜欢' : '不喜欢'; 13 14 return (<p onClick = {this.handleClick}> 15 <b>{text}</b> 16 点击喜欢或不喜欢切换状态 17 </p>); 18 } 19 }); 20 21 // 渲染到 HTML DOM 22 ReactDOM.render( 23 <Liked />, 24 document.getElementById('example') 25 );
代码4:
1 props: 2 // 使用 props 3 // 编写组件 4 var HelloProps = React.createClass({ 5 // getDefaultProps() 设置默认 props 值 6 getDefaultProps: function () { 7 return { 8 name: 'default' 9 } 10 }, 11 render: function () { 12 return (<p>名字为:{this.props.name}</p>); 13 } 14 }); 15 16 /** 17 * 渲染到 HTML DOM 18 */ 19 ReactDOM.render( 20 <HelloProps name = 'realityName' />, 21 document.getElementById('example') 22 );
代码区:
1 /****************************************/ 2 /** 3 * 利用 state 和 props 建立一个 web 站点 4 */ 5 var WebSite = React.createClass({ 6 getInitialState: function () { 7 return { 8 name: '百度', 9 site: 'http://www.baidu.com' 10 }; 11 }, 12 render: function () { 13 return (<div> 14 <Name name = {this.state.name} /> 15 <Site site = {this.state.site} /> 16 </div>); 17 } 18 }); 19 20 var Name = React.createClass({ 21 render: function () { 22 return (<h1>{this.props.name}</h1>); 23 } 24 }); 25 26 var Site = React.createClass({ 27 render: function () { 28 return (<a href = {this.props.site}>{this.props.site}</a>); 29 } 30 }); 31 32 33 ReactDOM.render( 34 <WebSite />, 35 document.getElementById('example') 36 ); 37 38 /**************************************************/ 39 40 /** 41 * props 验证 42 * @type {string} 43 */ 44 var title = '标题'; 45 var title = 123; 46 47 var MyComponent = React.createClass({ 48 propTypes: { 49 title: React.PropTypes.string.isRequired 50 }, 51 render: function () { 52 return (<div>{this.props.title}</div>); 53 } 54 }); 55 56 ReactDOM.render( 57 <MyComponent title = {title} />, 58 document.getElementById('example') 59 ); 60 61 62 /*****************************************************/ 63 64 // 设置点击次数 65 var Counter = React.createClass({ 66 getInitialState: function () { 67 return { 68 count :0 69 } 70 }, 71 handleClick: function () { 72 // 传入当前状态 state 73 this.setState(function (state) { 74 // 以键值对的方式重新赋值 75 return {count: state.count + 1}; 76 }); 77 }, 78 render: function () { 79 // 属性的方式调用函数不需要加括号 80 return (<div> 81 <p onClick = {this.handleClick}>点击我</p> 82 <p> 83 您点击的次数为:{this.state.count} 84 </p> 85 </div>); 86 } 87 }); 88 89 ReactDOM.render( 90 <Counter />, 91 document.getElementById('example') 92 ); 93 94 /*************************************************/ 95 96 /** 97 * React Ajax 获取 GitHub 用户最新 gist 共享描述 98 */ 99 100 101 var Gist = React.createClass({ 102 getInitialState: function () { 103 return { 104 username: '', 105 lastGistUrl: '' 106 } 107 }, 108 // 获取数据 109 componentDidMount: function () { 110 this.serverRequset = $.get(this.props.site, function (result) { 111 var getGist = result[0]; 112 console.log(getGist); 113 this.setState({ 114 username: getGist.id, 115 lastGistUrl: getGist.url 116 }); 117 console.log(this); 118 }.bind(this)); 119 }, 120 //取消未完成的请求 121 componentWillUnmount: function () { 122 this.serverRequset.abort(); 123 }, 124 render: function () { 125 return (<div> 126 <p>用户名:{this.state.username}</p> 127 <p>密码:{this.state.lastGistUrl}</p> 128 </div>); 129 } 130 }); 131 132 ReactDOM.render( 133 <Gist site = 'https://api.github.com/users/octocat/gists' />, 134 document.getElementById('example') 135 ); 136 137 /************************************************************/ 138 139 /** 140 * 输入框更新 state 141 */ 142 143 var Message = React.createClass({ 144 getInitialState: function () { 145 return { 146 value: 'hello message' 147 }; 148 }, 149 handleChange: function (event) { 150 this.setState({ 151 value: event.target.value 152 }); 153 }, 154 render: function () { 155 return ( 156 <div> 157 <input type='text' onChange={this.handleChange} value={this.state.value} /> 158 <p>{this.state.value}</p> 159 </div> 160 ); 161 } 162 }); 163 164 ReactDOM.render( 165 <Message />, 166 document.getElementById('example') 167 ); 168 169 170 /***********************************************************************/ 171 /** 172 * 子组件上使用表单 173 */ 174 var Content = React.createClass({ 175 render: function () { 176 return (<div> 177 <input type = "text" value = {this.props.myData} onChange = {this.props.updateValue} /> 178 <h4>{this.props.myTips}</h4> 179 </div>); 180 } 181 }); 182 183 var FormChange = React.createClass({ 184 getInitialState: function () { 185 return { 186 value: 'hello message' 187 } 188 }, 189 handleChange: function (event) { 190 this.setState({ 191 value: event.target.value 192 }); 193 }, 194 render: function () { 195 return (<Content updateValue = {this.handleChange} myData = {this.state.value} myTips = {this.state.value} />); 196 } 197 }); 198 199 ReactDOM.render( 200 <FormChange />, 201 document.getElementById('example') 202 ); 203 204 /*******************************************************************/ 205 206 /** 207 * 点我改变文字内容 208 */ 209 var Content = React.createClass({ 210 render: function () { 211 return (<div> 212 <button onClick = {this.props.changeData}>点我改变文字内容</button> 213 <b>{this.props.myData}</b> 214 </div>); 215 } 216 }); 217 218 var ChangeText = React.createClass({ 219 getInitialState: function () { 220 return { 221 value: '默认值' 222 }; 223 }, 224 handleClick: function (event) { 225 this.setState({value : '百度'}); 226 }, 227 render: function () { 228 return (<Content myData = {this.state.value} changeData = {this.handleClick} />); 229 } 230 }); 231 232 ReactDOM.render( 233 <ChangeText />, 234 document.getElementById('example') 235 ); 236 237 /*****************************************************/ 238 239 /** 240 * 点击按钮触发输入框获得焦点 241 * this.refs 获取组件的引用 242 * 使用 this 来获取当前的 react 组件 243 */ 244 245 var MyComponent = React.createClass({ 246 handleClick: function () { 247 this.refs.myInput.focus(); 248 }, 249 render: function () { 250 return ( 251 <div> 252 <button onClick = {this.handleClick}>点击我,输入框获得焦点</button> 253 <input type = "text" 254 ref = "myInput" 255 /> 256 </div> 257 ); 258 } 259 }); 260 261 ReactDOM.render( 262 <MyComponent />, 263 document.getElementById('example') 264 );