• React技术


    React

    简介

    Virtual DOM

    支持JSX语法

     

    测试程序

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Root extends React.Component{
      render(){
        return <div>Hello magedu</div>
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'))

     

     程序解释

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Root extends React.Component{
      render(){
        // return <div>Hello magedu</div>
        return React.createElement('div',null,'welcome to Magedu')
      }
    }
    
    // ReactDom.render(<Root />,document.getElementById('root'));
    ReactDom.render(React.createElement(Root),document.getElementById('root'));

      

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    
    class SubEle extends React.Component{
      render(){
        return <div>Sub content</div>
      } 
    }
    
    class Root extends React.Component{
      render(){
        return (
        <div>
          <h2>Welcome to magedu</h2>
          <b2 />
          <SubEle />
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

    JSX规范

    组件状态state**

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class SubEle extends React.Component{
      render(){
        return <div>Sub content</div>
      } 
    }
    
    class Root extends React.Component{
      //定义一个对象
      state = {
        p1:'magedu123',
        p2:'.com'
      } 
      render(){
        this.state.p1 = 'www.magedu';//可以更新
        // this.setState({p1:'www.cy'})//不可以对还在更新中的state使用setState
        return (
        <div>
          <h2>Welcome to {this.state.p1}{this.state.p2}</h2>
          <b2 />
          <SubEle />
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

    复杂状态例子

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script type="text/javascript">
            function  getEventTrigger(event) {
                x = event.target;   //从事件中获取元素
                alert("触发的元素的id是"+x.id)
            }
        </script>>
    </head>
    <body>
        <div id="t1" onmousedown="getEventTrigger(event)">
            点击这句话,会触发一个事件,并弹出一个警告框
        </div>>
    </body>
    </html>

    HTML DOM的JavaScript事件

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Toggle extends React.Component{
      state = {flag:true};//类中定义state
      handleClick(event){
        console.log(event.target.id);
        console.log(event.target === this);
        console.log(this);
        console.log(this.state);
        this.setState({flag: !this.state.flag})
      }
    
      render(){/*注意一定要绑定this,onClick要写成小驼峰 */
        return <div id='t1' onClick={this.handleClick.bind(this)}>
            点击这句话,会触发一个事件!{this.state.flag.toString()}
          </div>;
      } 
    }
    
    class Root extends React.Component{
      //定义一个对象
      state = {
        p1:'magedu123',
        p2:'.com'
      } 
      render(){
        // this.state.p1 = 'www.magedu';//可以更新
        // this.setState({p1:'www.cy'})//不可以对还在更新中的state使用setState
        setTimeout(() => this.setState({p1:'python.magedu'}),5000);
        return (
        <div>
          <h2>Welcome to {this.state.p1}{this.state.p2}</h2>
          <b2 />
          <Toggle />
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

     

    属性props**

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Toggle extends React.Component{
      state = {flag:true};//类中定义state
      handleClick(event){
        console.log(event.target.id);
        console.log(event.target === this);
        console.log(this);
        console.log(this.state);
        this.setState({flag: !this.state.flag})
      }
    
      render(){/*注意一定要绑定this,onClick要写成小驼峰 */
        return <div id='t1' onClick={this.handleClick.bind(this)}>
            点击这句话,会触发一个事件!{this.state.flag.toString()}<br />
            显示props<br />
            {this.props.name}:{this.props.parent.state.p1+this.props.parent.state.p2}<br />
            {this.props.children}
          </div>;
      } 
    }
    
    class Root extends React.Component{
      //定义一个对象
      state = {
        p1:'magedu',
        p2:'.com'
      } 
      render(){
        // this.state.p1 = 'www.magedu';//可以更新
        // this.setState({p1:'www.cy'})//不可以对还在更新中的state使用setState
        setTimeout(() => this.setState({p1:'python.magedu'}),5000);
        return (
        <div>
          <h2>Welcome to {this.state.p1}{this.state.p2}</h2>
          <b2 />
          <Toggle name="school" parent={this}>{/* 自定义两个属性通过props传给Toggle组件对象*/}
            <hr />{/*子元素通过props.children访问*/}
              <span>我是Toggle元素的子元素</span>
            </Toggle>
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

    构造器constructor

     

    class Toggle extends React.Component{
      constructor(props){
        super(props)  // 一定要调用super父类构造器,否则报错
        this.state = {flag:true};//类中定义state
    
      }
    ...
    
    class Root extends React.Component{
      //定义一个对象
      constructor(props){
        super(props)
        this.state = {p1:'magedu',p2:'.com'} 
      }
    ...

    组件的生命周期*

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Sub extends React.Component{
      constructor(props){
        console.log('Sub constructor')
        super(props)  // 一定要调用super父类构造器,否则报错
        this.state = {count:0};
    
      }
      handleClick(event){
        this.setState({count:this.state.count+1});
      }
    
      render(){
        console.log('Sub render');
        return <div id='sub' onClick={this.handleClick.bind(this)}>
            Sub's count = {this.state.count}
          </div>;
      } 
      componentWillMount(){
        //constructor之后,第一次render之前
        console.log('Sub componentWillMount');
      }
    
      componentDidMount(){
        //第一次render之后
        console.log('Sub componentDidMount')
    
      }
    
      componentWillUnmount(){
        //清理工作
        console.log('Sub componentWillUnmount')
      }
    }
    
    class Root extends React.Component{
      constructor(props){
        console.log('Root constructor')
        super(props)
        //定义一个对象
        this.state = {} ;
      }
      render(){
        return (
        <div>
          <Sub />
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

    浏览器控制台的输出如下:

    import React from 'react';
    import ReactDom from 'react-dom';
    
    class Sub extends React.Component{
      constructor(props){
        console.log('Sub constructor')
        super(props)  // 一定要调用super父类构造器,否则报错
        this.state = {count:0};
    
      }
      handleClick(event){
        this.setState({count:this.state.count+1});
      }
    
      render(){
        console.log('Sub render');
        return <div id='sub' onClick={this.handleClick.bind(this)}>
            Sub's count = {this.state.count}
          </div>;
      } 
      componentWillMount(){
        //constructor之后,第一次render之前
        console.log('Sub componentWillMount');
      }
    
      componentDidMount(){
        //第一次render之后
        console.log('Sub componentDidMount')
    
      }
      componentWillUnmount(){
        //清理工作
        console.log('Sub componentWillUnmount')
      }
    
      //新增内容
      componentWillReceiveProps(nextProps){
        //props变更时,接收到props,交给shouldComponentUpdate
        //props组件内只读,只能从外部改变
        console.log('Sub componentWillReceiveProps',this.state.count)
      }
    
      shouldComponentUpdate(nextProps,nextState){
        //是否组件更新,props或state方式改变时,返回布尔值,true才会更新
        console.log('Sub shouldComponentUpdate',this.state.count,nextState);
        return true//false将拦截更新
      }
    
      componentWillUpdate(nextProps,nextState){
        //同意更新后,真正更新前,在render之前调用
        console.log('Sub componentWillUpdate',this.state.count,nextState)
      }
    
      componentDidUpdate(prevProps,prevState){
        //同意更新后,真正更新后,在render之后调用
        console.log('Sub componentDidUpdate',this.state.count,prevState);
      }
    }
    
    class Root extends React.Component{
      constructor(props){
        console.log('Root constructor')
        super(props)
        //定义一个对象
        this.state = {} ;
      }
      render(){
        return (
        <div>
          <Sub />
        </div>);
      }
    }
    
    ReactDom.render(<Root />,document.getElementById('root'));

    无状态组件

    import React from 'react';
    import ReactDom from 'react-dom';
    
    function Root(props){
      return <div>
        {props.schoolName}
      </div>
    }
    
    ReactDom.render(<Root schoolName="magedu"/>,document.getElementById('root'));

    改写上面的代码

    import React from 'react';
    import ReactDom from 'react-dom';
    
    let Root= (props) =><div>{props.schoolName}</div>
    
    ReactDom.render(<Root schoolName="magedu"/>,document.getElementById('root'));

    高阶组件**

    let wrapper = (Component,props) => {
      return (
        <div>
        {props.schoolName}
        <hr />
        <Component />
        </div>
      );
    }
    
    let Root = props => <div>{props.schoolName}</div>

    import React from 'react';
    import ReactDom from 'react-dom';
    
    let wrapper = Component => {
      function _wrapper(props){
        return (
          <div>
          {props.schoolName}
          <hr />
          <Component />
          </div>
        );
      }
      return _wrapper
    }
    
    //创建一个无状态组件
    let Root = props => <div>Root</div>
    
    let NewCompnent = wrapper(Root) //返回一个包装后的无状态组件
    ReactDom.render(<NewCompnent schoolName="magedu"/>,document.getElementById('root'));

    let wrapper = Component => {
      props => {
        return (
          <div>
          {props.schoolName}
          <hr />
          <Component />
          </div>
        );
      }
    }

    let wrapper = Component => props =>
        (
          <div>
          {props.schoolName}
          <hr />
          <Component />
          </div>
        );

    装饰器

    import React from 'react';
    import ReactDom from 'react-dom';
    
    let wrapper = Component => props =>
        (
          <div>
          {props.schoolName}
          <hr />
          <Component />
          </div>
        );
      
    //创建类组件
    @wrapper
    class Root extends React.Component{
      render (){
        return <div>Root</div>
      }
    }
    
    ReactDom.render(<Root schoolName="magedu"/>,document.getElementById('root'));

      

    import React from 'react';
    import ReactDom from 'react-dom';
    
    let wrapper = Component => props =>
        (
          <div>
          {props.schoolName}
          <br />
          test123
          <hr />
          <Component {...props}/>
          </div>
        );
      
    
    @wrapper
    class Root extends React.Component{
      render (){
        return <div>{this.props.schoolName}</div>;
      }
    }
    
    ReactDom.render(<Root schoolName="magedu"/>,document.getElementById('root'));

    带参装饰器

     

    import React from 'react';
    import ReactDom from 'react-dom';
    
    let wrapper = id => Component => props =>
        (
          <div id={id}>
          {props.schoolName}
          <br />
          test123
          <hr />
          <Component {...props}/>
          </div>
        );
      
    @wrapper('wrapper')
    class Root extends React.Component{
      render (){
        return <div>{this.props.schoolName}</div>;
      }
    }
    
    ReactDom.render(<Root schoolName="magedu"/>,document.getElementById('root'));

    做一枚奔跑的老少年!
  • 相关阅读:
    windows启动应用程序
    nvm uninstall node versions failed
    FATAL ERROR: wasm code commit Allocation failed process out of memory
    C# 正则表达式大全 (转载)
    zabbix 6.0 使用zabbix agent 2自带模板监控 Redis 海口
    go出现错误:(type interface {}) to type string
    pythonsocketio实现websocket的连接与使用
    如何使用fiddler为手机设置代理
    Logstash—Filter模块csv
    QT事件鼠标事件、事件分发器
  • 原文地址:https://www.cnblogs.com/xiaoshayu520ly/p/11374174.html
Copyright © 2020-2023  润新知