zoukankan      html  css  js  c++  java
  • JavaScript库 — — React

    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 );
  • 相关阅读:
    DNS原理和智能DNS及CDN
    jvm介绍及其优化
    Java Socket网络编程
    TCP/IP协议详解
    单点登录系统
    Kibana安装及使用
    【Golang】Golang Context上下文包
    常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)介绍和实现
    java数据持久层框架MyBatis
    MySQL数据库设计三范式
  • 原文地址:https://www.cnblogs.com/lqcdsns/p/5556258.html
Copyright © 2011-2022 走看看