React学习:生命周期、过滤器、event、axios-学习笔记

React学习:生命周期、过滤器、event、axios-学习笔记

生命周期

在这里插入图片描述
组件的生命周期可分成三个状态:

  • Mounting:已插入真实 DOM(挂载)
  • Updating:正在被重新渲染(更新)
  • Unmounting:已移出真实 DOM(卸载)
    Mounting
    componentWillMount() 组件将要挂载
    componentDidMount() 组件完成挂载
    Updating
    componentWillReceiveProps() 组件将要接收prop,这个方法在初始化render时不会被调用。
    shouldComponentUpdate() 返回一个布尔值,在组件接收到新的props或者state时被调用。在初始化时不被调用,减少重复渲染 可以在你确认不需要更新组件时使用。
    componentWillUpdate() 在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
    render() 渲染
    componentDidUpdate() 在组件完成更新后立即调用。在初始化时不会被调用。Unmounting
    componentWillUnmount() 在组件从 DOM 中移除的时候立刻被调用
    Error Handling
    componentDidCatch() 错误处理
<!DOCTYPE html>
<html>
  <head>
    <title>生命周期</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
     
    <script type="text/babel">
      class Hello extends React.Component{
        constructor() {
          super();
          this.state = {
            data: 0
          };
        };
        setNum(){
          this.setState({data:++this.state.data})  
        }

        render () {
          console.log('1-hello---render');
          return (
            <div>
              <button onClick={() => this.setNum()}>ADD</button>
              <p>{this.state.data}</p>
              <Num myNum={this.state.data}/>
            </div>
          );
        }
      };
      class Num extends React.Component{
        componentWillMount(){
          console.log('2-组件将要挂载');
        };
        componentDidMount () {
          console.log('4-组件完成挂载');
        };
//        shouldComponentUpdate(nextProps,nextState){
//            console.log('在组件接收到新的props或者state时被调用');
            // if(条件){
            //   return false;
            // }else {
            //   return true;
            // }
//        }
        componentWillUpdate()  {
          console.log('组件将要更新-在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。');
        };
        
        componentDidUpdate(){
          console.log('在组件完成更新后立即调用。在初始化时不会被调用');
        }
        render () {
          console.log('3-num---render');
          return (
            <div>
              <p>{this.props.myNum}</p>
            </div>
          );
        }
      };

      ReactDOM.render(
        <Hello/>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <title>生命周期2</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script type="text/javascript" src="js/babel.min.js"></script>
  </head>
  <body>
    <div id="my"></div>

    <script type="text/babel">
    window.onload = function(){
      //父组件
        class ParentList extends React.Component{
          constructor(){
            super();
            this.state = {
              name:'老张',
              age:50
            }
          };
          handleChange(e){
            this.setState({age:e.target.value})
          }
          handleParent(child){
            //alert(child);
            this.setState({age:child})
          }
          render(){
            console.log('1-render')
            return (
              <div>
                <h1>我是父组件</h1>
                <p>姓名:{this.state.name}</p>
                <p>年龄:{this.state.age}</p>
                <input type="text" value={this.state.age} onChange={(event)=>this.handleChange(event)} />
                <ChildList {...this.state} handleParent={this.handleParent.bind(this)}/>
              </div>
            )
          }
        };
        // 子组件
        class ChildList extends React.Component{
          constructor(props){
            super();
            this.state = {
              name:'小张',
              //age:props.age
              age:20
            }
          };
          componentWillMount(){
            console.log('2-组件将要挂载');
          };
          componentDidMount () {
            console.log('4-组件完成挂载');
          };
          componentWillReceiveProps(nextProps){
              console.log('update1-组件将要接收prop,这个方法在初始化render时不会被调用。');
          }
          shouldComponentUpdate(nextProps,nextState){
              console.log('update2-在组件接收到新的props或者state时被调用');
              //在render函数调用前判断 如果 state中的值不变  通过return false阻止render调用
              if(nextProps.age == this.state.age){  //nextProps  获取最新props的值
                return true  //满足了条件  才会执行组件更新钩子函数
              }else {
                return false  //false阻止render调用
              }
          }
          componentWillUpdate()  {
            console.log('update3-组件将要更新-在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。');
          };
          componentDidUpdate(){
            console.log('update5-在组件完成更新后立即调用。在初始化时不会被调用');
          }
          handleChange(e){
            this.setState({age:e.target.value});
            this.props.handleParent(e.target.value);
          }
          render(){
            console.log('3-render====update4-render')
            return (
              <div>
                <h1>我是子组件</h1>
                <p>爸爸的姓名:{this.props.name}</p>
                <p>爸爸的年龄:{this.props.age}</p>
                <p>我的年龄:{this.state.age}</p>
                <input type="text" value={this.state.age} onChange={(event)=>this.handleChange(event)} />
              </div>
            )
          }
        };
        ReactDOM.render(
          <div>
            <ParentList></ParentList>
          </div>,
          document.getElementById("my")
        );
    }

    </script>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <title>生命周期3</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
     
    <script type="text/babel">
      class Hello extends React.Component{
        constructor() {
          super();
          this.timer = null; //定时器
          this.state = {
            opacity: 1
          };
        };
        componentDidMount () {
          console.log('4-组件完成挂载');
          this.timer = setInterval(()=>{
            var a = this.state.opacity;
            a-=0.05;
            if(a<0.1){
              a = 1;
            };
            this.setState({opacity:a})
          },200)
        };
        componentWillUnMount(){
            console.log('销毁');
            clearInterval(this.timer);
          }
        render () {
          return (
            <div>
              <h1 style={{opacity:this.state.opacity}}>hello world</h1>
            </div>
          );
        }
      };
      ReactDOM.render(
        <Hello/>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

过滤器

<!DOCTYPE html>
<html>
  <head>
    <title>过滤器filter</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
     
    <script type="text/babel">
      class Hello extends React.Component{
        constructor() {
          super();
          this.state = {
            date: 1595426683
          };
        };
        getDate(date){
          var d=new Date(date*1000);
          return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();
        }
        render () {
          return (
            <div>
              <h1>北京时间:{this.getDate(this.state.date)}</h1>
            </div>
          );
        }
      };

      ReactDOM.render(
        <Hello/>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <title>过滤器</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
    <style>
      .lists {
        color:#f60;
      }
    </style>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      class HelloMessage extends React.Component{
        constructor() {
          super();
          this.state = {
            value: ''
          };
        };
        getDate(data){
			var d = new Date(data*1000);
			return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();
		}

        action(item){
          if(item>25){
            return '到了结婚年龄喽'
          }else {
            return '还年轻着呢'
          }
        }; 
        action2(item){
          switch(item){
                case "1":
                  return "启动";
                case "2":
                  return "离线";
                case "3":
                  return "连接";
                default:
                  return item;
              }
        }
        // 输入的内容长度大于多少出现省略号
        toShortShow(data,n){
				if(!data) return;
				if(data.length >= n){
					var s = data.substr(0,n);
					return s+'...';
				}else {
					return data;
				}
        }
        handleChange(event){
          this.setState({value:event.target.value})
        };
        render(){
          const user = {
            name:'lili',
            age:22,
            n:'1'
          };
          return (
            <div>
		      <h1>北京时间:{this.getDate('1595426683')}</h1>
              <h1 className="lists">hello,{this.action(user.age)}</h1>
              <h1 className="lists">hello,{this.action2(user.n)}</h1>
              <input type="text"  value={this.state.value} onChange={(event)=>this.handleChange(event)}/>
              <h1>{this.toShortShow(this.state.value,5)}</h1>
            </div>
          )
        }
      };
      ReactDOM.render(
        <HelloMessage/>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

webapp小例子:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>webapp首页</title>
    <link rel="stylesheet" type="text/css" href="css/common.css">
    <link rel="stylesheet" href="font/iconfont.css">
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script type="text/javascript" src="js/babel.min.js"></script>
<body>
<!--页面容器-->
  <div class="index-content" id="my"></div>

  <script type="text/babel">
    window.onload = function(){
        class App extends React.Component{
            render () {
                return (
                    <div>
                        <Banner />
                        <Category />
                    </div>
                );
            }
        };
        class Banner extends React.Component{
            constructor() {
                super();
                this.timer = null; 
                this.state = {
                    n:0, //初始化
                    img:['img/1.jpg','img/2.jpg','img/3.jpg','img/4.jpg','img/5.jpg'],
                };
            };
            componentDidMount () {   //挂载完成
                this.autoPlay();
            };
            autoPlay(){
                this.timer = setInterval(()=>{
                    this.play();
                },2000)
            };
            play(){
                let {n,img} = this.state;
                n++;
                if(n==img.length){
                    n = 0;
                };
                this.setState({
                    n    //n:n
                })
            };
            componentWillUnMount(){ //销毁
                console.log('销毁');
                clearInterval(this.timer);
            }
            render () {
                let {n,img} = this.state;
                var imgList = img.map((item,i)=>{
                        return <img key={i} src={item} style={{display:(i==n)?'block':'none'}}/> 
                    });
                var liList = img.map((item,i)=>{
                    return <li key={i} className={i==n?"selected":""}></li> 
                });
                return (
                    <div className="banner">
                        {imgList}
                         <div className="banner-circle">
                            <ul>
                                {liList}  
                            </ul> 
                        </div>
                    </div>
                );
            }
        };

        class Category extends React.Component{
            constructor() {
                super();
                this.state = {
                    lists:[
                        {title:'在线咨询1',icon:'icon-shenghuo',color:'#f60'},
                        {title:'在线咨询2',icon:'icon-shenghuo',color:'#49dacf'},
                        {title:'在线咨询3',icon:'icon-jiaoyu',color:'#fa6900'},
                        {title:'在线咨询4',icon:'icon-shenghuo',color:'#49dacf'},
                        {title:'在线咨询5',icon:'icon-jiajujiafang',color:'#f60'},
                        {title:'在线咨询6',icon:'icon-shenghuo',color:'#49dacf'},
                        {title:'在线咨询7',icon:'icon-11',color:'#f00'}
                    ]
                };
            };
            render () {
                let {lists} = this.state;
                var _list = lists.map((item,i)=>{
                    return (
                        <div className="category" key={i}>
                            <i className={[`iconfont ${item.icon}`]} style={{background:item.color}}></i>
                            <label>{item.title}</label>
                        </div>
                    )
                })
                return (
                    <div className="index-category">
                        {_list}
                    </div>
                );
            }
        };

        ReactDOM.render(
            <App />,
            document.getElementById("my")
        )
    }
  </script>
</body>
</html>

common.js

*{
    margin:0;
    padding:0;
}
ul {
    list-style-type:none;
}
body {
    font-size: 14px;
    background: #fff;
    overflow-y:scroll;
    overflow-x:hidden;
}
html,body {
    max-width:720px;
    height:100%;
    margin:0 auto;
} 


/*index*/
.index-content .banner {
    position: relative;
}
.index-content .banner .banner-circle {
    position: absolute;
    bottom: 5px;
    left: 0;
    right: 0;
    color: #fff;
}
.index-content .banner .banner-circle li{
    display:inline-block;
    background: rgba(0,0,0,.3);
    border-radius: 50%;
    padding:7px;
    margin:2px;
}
.index-content .banner .banner-circle ul {
    text-align: center;
}
.index-content .banner .banner-circle .selected {
    background: #f60;
}
.index-content .banner img {
    width: 100%;
    margin: 0;
    padding: 0;
}
/*index-category*/

.index-content .index-category .category {
    width: 33.3%;
    float:left;
    padding: 17px 0;
    text-align:center;
    border-bottom: 1px solid #f0f0f0;
}
.index-content .index-category .category .iconfont {
    font-size: 40px;
    display:inline-block;
    padding: 10%;
    border-radius: 50%;
    color:#fff;
    border: 3px solid #f9f9f9;
    box-shadow: 0px 0px 6px rgba(0,0,0,.5);
}
.index-content .index-category .category .iconfont{
    background: #49dacf;
}

.index-content .index-category .category label {
    display: block;
    padding: 5px 0;
    color: #999;
}
/*index-category end*/

字体图标可见下文有提到iconfont:
https://blog.csdn.net/hhhmonkey/article/details/118657708

event - 和原生JavaScript写法一样的

<!DOCTYPE html>
<html>
  <head>
    <title>event</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    
    <script type="text/babel">
      
      class TabList extends React.Component{
        constructor() {
          super();
        };
        setParent(e) {
          console.log('parent');
        };
        setChild(e) {
          console.log('child');
          e.stopPropagation();   //阻止冒泡
        };
        setOpen(e) {
          console.log('open');
          e.stopPropagation();   //阻止冒泡
          e.preventDefault() ;   //取消事件默 认行为
        }

        render () {
          return(
            <div onClick={(event) => this.setParent(event)}>parent
              <button onClick={(event) => this.setChild(event)}>child</button>
              <a href="www.baidu.com" onClick={(event) => this.setOpen(event)}>open</a>
            </div>
          )
        }
      };

      ReactDOM.render(
        <TabList />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

axios

<!DOCTYPE html>
<html>
  <head>
    <title>ajax</title>
    <meta charset="UTF-8" />
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
    <script src="js/axios.js"></script>
  </head>
  <body>
    <div id="example"></div>
    
    <script type="text/babel">
      class TabList extends React.Component{
        constructor() {
          super();
          this.state = {
            result:[],
            name:'',
            select:'red'
          };
        };
        componentDidMount () {
         // this.handleChange();
        };
        handleChange(){
          axios({
				method:'get',
				url:'http://localhost:3333/get_table'
		  }).then(response=>{
				if(response.data.code=='200'){
                   this.setState({result:response.data.result})
                }
		  }).catch(function(error){
				console.log(error);
		  })
        }
        handleChange2(e){
          var name = e.target.name;
          this.setState({
            [name]:e.target.value
          })
        }
        submit(){
          var {name,select} = this.state;
          axios({
			  method:'post',
              url:'http://localhost:3333/form_register',
              data:JSON.stringify({name:name,select:select})
		  }).then(response=>{
			  if(response.data.code=='200'){
              	console.log('ok')
          	  }
		  }).catch(function(error){
			  console.log(error);
		  })
        }
        render () {
          let color = ['red','blue','green'];
          return(
            <div>
              <button onClick={(event)=>this.handleChange(event)}>click</button>
              <ul>
                {
                  this.state.result.map(function(item,index){
                    return <li key={index}>{item.name}-{item.city}</li>
                  })
                }
              </ul>

              <div>
                name:<input type='text' name='name' value={this.state.name} 
                          onChange={(event)=>this.handleChange2(event)} />
                color:
                <select name='select' value={this.state.select}  
                      onChange={(event)=>this.handleChange2(event)} >
                      {
                        color.map((item,index)=>{
                          return <option key={index}>{item}</option>
                        })
                      }
                </select>
                <button onClick={()=>this.submit()}>提交</button>
              </div>
              
            </div>
          )
        }
      };

      ReactDOM.render(
        <TabList />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值