React(一)

作者: osoLife | 来源:发表于2017-06-26 06:48 被阅读0次

    特点

    • 声明式设计
    • 高效
    • 灵活
    • JSX
    • 组件
    • 单向数据流

    第一个实例

    <!--React的核心库-->
    <script src="https://cdn.bootcss.com/react/15.6.1/react.js"></script>
    <!--提供与DOM相关的功能-->
    <script src="https://cdn.bootcss.com/react/15.6.1/react-dom.js"></script>
    <!--将ES6代码转换为ES5代码-->
    <script src="https://cdn.bootcss.com/babel-standalone/6.25.0/babel.js"></script>
    
    <div id="box"></div>
    <!--如果需要使用JSX,则<script>标签的type属性需要设置为text/babel-->
    <script type="text/babel">
         // render方法用于将模板转化为HTML语言,并插入指定的DOM节点
         ReactDOM.render(
              // 将h1标题插入id="box"的节点中
              <h1>hello react</h1>,
              document.getElementById('box')  
         );
    </script>
    

    JSX

    <div id="box"></div>
    <script type="text/babel">
         ReactDOM.render(
             <div>
                  <h1>hello world</h1>
                  <h2>hello react</h2>
                  {/*添加自定义属性需要使用data-前缀*/}
                  <p data-myattribute="somevalue">
                      my name is osoLife,i love react
                  </p>
             </div>,
             document.getElementById('box')
         );
    </script>
    

    JS表达式

    <div id="box"></div>  
    <script type="text/babel">
         ReactDOM.render(
             <div>
                 {/*表达式写在{}中*/}
                 <h1>{1+1}</h1>
             </div>,
             document.getElementById('box')
         );
    </script>
    
    <!--在JSX中不能使用if else语句,但可以使用三元运算来替代-->
    

    样式

    <div id="box"></div>  
    <script type="text/babel">
         var myStyle={
             fontSize:50,
             color:'#ccc'
         };
    
         ReactDOM.render(
             <h1 style={myStyle}>React推荐使用内联样式</h1>,
             document.getElementById('box')
         );
    </script>
    

    数组

    <!--JSX允许在模板中插入数组,数组会自动展开所有成员-->
    <div id="box"></div>  
    <script type="text/babel">
         var arr=[
             <h1>hello world</h1>,
             <p>hello react</p>            
         ];
    
         ReactDOM.render(
             <div>{arr}</div>,
             document.getElementById('box')
         );
    </script>
    

    HTML标签&React组件

    <!--要渲染HTML标签,只需在JSX里使用小写字母的标签名-->
    <div id="box"></div>  
    <script type="text/babel">
         // 在添加属性时,class属性需要写成className,for属性需要写成htmlFor,这是因为class和for是JS的保留字
         var myDivElement=<div className="example" />;
         ReactDOM.render(
             myDivElement,
             document.getElementById('box')
         );
    </script>
    
    <!--要渲染React组件,只需创建一个大写字母开头的本地变量-->
    

    组件

    <!--将代码封装成一个组件,然后像插入HTML标签一样在网页中插入这个组件-->
    <!--弃用的写法:ES5-->
    <div id="box"></div>
    <script type="text/babel">
         // 创建一个名为HelloReact的组件
         var HelloReact=React.createClass({
             render:function () {
                 return <h1>hello react</h1>;
             }
         });
    
         ReactDOM.render(
             <HelloReact />,
             document.getElementById('box')
         );
    </script>
    
    <div id="box"></div>
    <script type="text/babel">
         // 通过this.props对象向组件中传递参数
         var HelloReact=React.createClass({
             render:function () {
                  return <h1>hello {this.props.name}</h1>;
             }
          });
    
          ReactDOM.render(
             <HelloReact name="react" />,
             document.getElementById('box')
          );
    </script>
    
    <!--推荐的写法:ES6-->
    <div id="box"></div>
    <script type="text/babel">       
         class HelloReact extends React.Component {
              // 所有的组件类都必须有自己的render方法用于输出组件
              render() {
                  return <h1>hello {this.props.name}</h1>;
              }
         }
    
         ReactDOM.render(
              <HelloReact name="react" />,
              document.getElementById('box')
         );
    </script>
    

    复合组件

    <div id="box"></div>
    <script type="text/babel">       
         class WebSite extends React.Component {
              render() {
                  return (
                      <div>
                          <Name name={this.props.name} />
                          <Link site={this.props.site} />
                      </div>
                  );
              }
         }
    
         class Name extends React.Component {
              render() {
                  return (
                      <h1>{this.props.name}</h1>
                  );
              }
          }
    
          class Link extends React.Component {
              render() {
                  return (
                     <a href={this.props.site}>
                           {this.props.site}
                     </a>
                  );
              }
          }
    
          ReactDOM.render(
              <WebSite name="百度" site="https://www.baidu.com"/>,
              document.getElementById('box')
          );
    </script>
    

    State(状态)

    <!--方法一-->
    <div id="box"></div>
    <script type="text/babel">    
         class MyButton extends React.Component {
               constructor(props) {
                    super(props);
                    this.handleClick=this.handleClick.bind(this);
                    this.state={
                        liked:false
                    }
               }
    
               handleClick(e) {
                    this.setState({liked:!this.state.liked});
               }
    
               render() {
                    var text=this.state.liked?'喜欢':'不喜欢';
                    return (
                        <p onClick={this.handleClick}>
                            你<b>{text}</b>我
                        </p>
                    );
               }
         }
    
         ReactDOM.render(
              <MyButton />,
              document.getElementById('box')
         );
    </script>
    
    <!--方法二-->
    <div id="box"></div>
    <script type="text/babel">       
          class MyButton extends React.Component {
                state = {
                    liked:false
                }
    
                constructor(props) {
                    super(props);
                    this.handleClick=this.handleClick.bind(this);
                }
    
                handleClick(e) {
                    this.setState({liked:!this.state.liked});
                }
    
                render() {
                    var text=this.state.liked?'喜欢':'不喜欢';
                    return (
                        <p onClick={this.handleClick}>
                            你<b>{text}</b>我
                        </p>
                    );
                }
          }
    
          ReactDOM.render(
              <MyButton />,
              document.getElementById('box')
          );
    </script>
    

    Props

    <!--可以把props看成是组件的配置属性,在调用这个组件时传入不同的属性来定制显示这个组件-->
    <!--state和props主要的区别在于props是不可变的,而state可以根据与用户交互来改变,有些组件需要定义state来更新和修改数据,而子组件只能通过props来传递数据。-->
    <div id="box"></div>
    <script type="text/babel">       
        class HelloReact extends React.Component {
            render() {
                return <h1>Hello {this.props.name}</h1>;
            }
        }
    
        ReactDOM.render(
             <HelloReact name="React" />,
             document.getElementById('box')
        );  
    </script>       
    

    默认Props

    <!--方法一-->
    <div id="box"></div>
    <script type="text/babel">       
        class HelloReact extends React.Component {
            render() {
                return <h1>Hello {this.props.name}</h1>;
            }
    
            // 组件内部使用static
            static defaultProps={
                name:'React'
            }
        }
            
        ReactDOM.render(
             <HelloReact />,
             document.getElementById('box')
        );             
    </script>
    
    <!--方法二-->
    <div id="box"></div>
    <script type="text/babel">       
        class HelloReact extends React.Component {
            render() {
                return <h1>Hello {this.props.name}</h1>;
            }
        }
    
        // 组件外部
        HelloReact.defaultProps={           
            name:'React'
        }
    
        ReactDOM.render(
            <HelloReact />,
            document.getElementById('box')
        );             
    </script>
    

    State和Props

    <!--在父组件中设置state,并通过在父组件上使用props将其传递到子组件上-->
    <div id="box"></div>
    <script type="text/babel">  
         class WebSite extends React.Component {
             constructor(props) {
                // 调用super()将props传递给React.Component
                super(props);
                // 初始化state的工作要在constructor中完成
                this.state={
                    name:'百度',
                    site:'https://www.baidu.com'
                };
             }
    
             render() {
                  return (
                      <div>
                        <Name name={this.state.name} />
                        <Link site={this.state.site} />
                      </div>
                  );
             }
         }
          
         class Name extends React.Component {
              render() {
                  return (
                      <h1>{this.props.name}</h1>
                  );
              }
          }
    
         class Link extends React.Component {
              render() {
                  return (
                    <a href={this.props.site}>
                        {this.props.site}
                    </a>
                  );
              }
          }
    
         ReactDOM.render(
              <WebSite />,
              document.getElementById('box')
         );
    </script>
    

    Props验证

    <div id="box"></div>
    <script type="text/babel">  
        var title="Hello React";
        class HelloReact extends React.Component {
              render() {
                  return <h1>{this.props.title}</h1>; 
              }
         }
    
         HelloReact.propTypes={
              title:React.PropTypes.string.isRequired
         }
    
         ReactDOM.render(
              <HelloReact title={title} />,
              document.getElementById('box') 
         );
    </script>
    <!--props-types的独立与react.PropTypes的弃用-->
    <!--由于ES6类中只允许定义方法并不允许定义类属性,所以propTypes、getDefaultTypes、displayName还有contextType等组件属性都要放到类外面来赋值。-->
    

    组件API

    • 设置状态:setState
    • 替换状态:replaceState
    • 设置属性:setProps
    • 替换属性:replaceProps
    • 强制更新:forceUpdate
    • 获取DOM节点:findDOMNode
    • 判断组件挂载状态:isMounted

    setState(设置状态)

    <div id="box"></div>
    <script type="text/babel"> 
         class Counter extends React.Component {
              constructor() {
                  super();
                  this.state={
                      clickCount:0
                  };
                  this.handleClick=this.handleClick.bind(this);
               }
    
               handleClick() {
                  this.setState(
                      function (state) {
                          return {
                              clickCount:state.clickCount+1
                          }
                      }
                  );
               }
    
               render() {
                    return (
                        <h2 onClick={this.handleClick}>点我!点击次数为:{this.state.clickCount}</h2> 
                    );
               }
         }
    
         ReactDOM.render(
               <Counter />,
               document.getElementById('box')
         )
    </script>  
    

    组件生命周期

    三个状态:
    Mounting:已插入真实DOM
    Updating:正在被重新渲染
    Unmounting:已移出真实DOM
    
    方法:
    componentWillMount
    componentDidMount
    componentWillReceiveProps
    shouldComponentUpdate
    componentWillUpdate
    componentDidUpdate
    componentWillUnmount
    

    componentDidMount示例

    <!--通过componentDidMount方法设置一个定时器,每隔100毫秒重新设置组件的透明度,并重新渲染-->
    <div id="box"></div>
    <script type="text/babel"> 
         class HelloReact extends React.Component {
             constructor() {
                 super();
                 this.state={
                     opacity:1
                 };
             }
    
             componentDidMount() {
                 this.timer=setInterval(function () {
                      var opacity=this.state.opacity;
                      opacity-=.05;
                      if(opacity<0.1){
                          opacity=1;
                      }
                      this.setState({
                          opacity:opacity
                      });
                 }.bind(this),100);
             }
    
             render() {
                 return(
                     <div style={{opacity:this.state.opacity}}>
                          Hello {this.props.name}
                     </div>
                 )
             }
         }
    
         ReactDOM.render (
              <HelloReact name="osoLife" />,
              document.getElementById('box')
         );
    </script> 
    
    <!--初始化state,setNewNumber用于更新state。所有生命周期在Content组件中-->
    <div id="box"></div>
    <script type="text/babel"> 
         class Button extends React.Component {
             constructor() {
                 super();
                 this.state={
                     data:0
                 };
                 this.setNewNumber=this.setNewNumber.bind(this);
             }
    
             setNewNumber() {
                 this.setState({
                    data:this.state.data+1
                 });
             }
    
             render() {
                 return(
                     <div>
                        <button onClick={this.setNewNumber}>increament</button>
                        <Content myNumber={this.state.data}></Content>
                     </div>
                 )
             }
         }
    
         class Content extends React.Component {
             componentWillMount() {
                 console.log('Component Will Mount');
             }
    
             componentDidMount() {
                 console.log('Component Did Mount');
             }
    
             componentWillReceiveProps(newProps) {
                 console.log('Component Will Receive Props');
             }
    
             shouldComponentUpdate(newProps,newState) {
                 return true;
             }
    
             componentWillUpdate(nextProps,nextState) {
                 console.log('Component Will Update');
             }
    
             componentDidUpdate(prevProps,prevState) {
                 console.log('Component Did Update');
             }
    
             componentWillUnmount() {
                 console.log('Component Will Unmount');
             }
    
             render() {
                 return (
                     <div>
                        <h3>{this.props.myNumber}</h3>
                     </div>
                 );
             }
         }
    
         ReactDOM.render(
            <Button />,
            document.getElementById('box')
         )
    </script> 
    

    AJAX(待续)

    表单与事件

    <div id="box"></div>
    <script type="text/babel"> 
         class HelloReact extends React.Component {
            constructor() {
                super();
                this.state={
                    value:'hello osoLife'
                };
                this.handleChange=this.handleChange.bind(this);
            }
    
            handleChange(event) {
                this.setState({
                    value:event.target.value
                });
            }
    
            render() {
                var value=this.state.value;
                return (
                    <div>
                        <input type="text" value={value} onChange={this.handleChange} />
                        <h4>{value}</h4>
                    </div>
                );
            }
        }
    
        ReactDOM.render(
            <HelloReact />,
            document.getElementById('box')
        )
    </script>  
    
    <div id="box"></div>
    <script type="text/babel"> 
         class Content extends React.Component {
             render() {
                 return (
                     <div>
                         <input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp} />
                         <h4>{this.props.myDataProp}</h4>
                     </div>
                 );
             }
         }
    
         class HelloReact extends React.Component {
             constructor() {
                 super();
                 this.state={
                     value:'hello osoLife'
                 };
                 this.handleChange=this.handleChange.bind(this);
             }
    
             handleChange(event) {
                 this.setState({
                      value:event.target.value
                 });
             }
    
             render() {
                 var value=this.state.value;
                 return (
                     <div>
                         <Content myDataProp={value} updateStateProp={this.handleChange}>
                         </Content>
                     </div>
                 );
             }
         }
    
         ReactDOM.render(
             <HelloReact />,
             document.getElementById('box')
         );
    </script>  
    

    事件

    <div id="box"></div>
    <script type="text/babel"> 
         class HelloReact extends React.Component {
            constructor() {
                super();
                this.state={
                    value:'hello world'
                };
                this.handleClick=this.handleClick.bind(this);
            }
    
            handleClick() {
                this.setState({
                    value:'hello osoLife'
                });
            }
    
            render() {
                var value=this.state.value;
                return (
                   <div>
                      <button onClick={this.handleClick}>click me</button>
                      <h4>{value}</h4>
                   </div>
                );
            }
        }
    
        ReactDOM.render(
            <HelloReact />,
            document.getElementById('box')
        );
    </script> 
    
    <div id="box"></div>
    <script type="text/babel"> 
         class Content extends React.Component {
             render() {
                 return (
                     <div>
                         <button onClick={this.props.updateStateProp}>click me</button>
                         <h4>{this.props.myDataProp}</h4>
                     </div>
                 );
             }
         }
    
         class HelloReact extends React.Component {
             constructor() {
                 super();
                 this.state={
                     value:'hello osoLife'
                 };
                 this.handleClick=this.handleClick.bind(this);
             }
    
             handleClick() {
                 this.setState({
                     value:'hello world'
                 });
             }
    
             render() {
                 var value=this.state.value;
                 return (
                     <div>
                         <Content myDataProp={value} updateStateProp={this.handleClick}>                       
                         </Content>
                     </div>
                 );
             }
         }
            
         ReactDOM.render(
             <HelloReact />,
             document.getElementById('box')
         );
    </script> 
    

    Refs

    <!--React支持一种非常特殊的属性Ref,可以用来绑定到render()输出的任何组件上。在其它代码中,通过this.refs获取支撑实例-->
    <div id="box"></div>
    <script type="text/babel"> 
         class MyComponent extends React.Component {
             constructor() {
                 super();
                 this.handleClick=this.handleClick.bind(this);
             }
    
             handleClick() {
                 this.refs.myInput.focus();
             }
    
             render() {
                 return (
                     <div>
                         <input type="text" ref="myInput" />
                         <button onClick={this.handleClick}>点击输入框获得焦点</button>
                     </div>
                 );
             }
         }
    
         ReactDOM.render(
             <MyComponent />,
             document.getElementById('box')
         );
    </script>  
    

    结束语

    如果喜欢本文,记得点赞并加关注哟。

    相关文章

      网友评论

        本文标题:React(一)

        本文链接:https://www.haomeiwen.com/subject/zgddcxtx.html