zoukankan      html  css  js  c++  java
  • 10 组件的生命周期

    需求: 自定义组件
            1. 让指定的文本做显示/隐藏的渐变动画
            2. 切换持续时间为2S
            3. 点击按钮从界面中移除组件界面
     
    第一步:初始化定义静态组件,并渲染组件标签
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <title>Document</title>
     7     <script src="../js/react.development.js"></script>
     8     <script src="../js/react-dom.development.js"></script>
     9     <script src="../js/prop-types.js"></script>
    10     <script src="../js/babel.min.js"></script>
    11 </head>
    12 <body>
    13     <div id="test"></div>
    14 </body>
    15 </html>
    16 <script type="text/babel">
    17  
    18     class LiftCycle extends React.Component{
    19        
    20         render(){
    21             return(
    22                 <div>
    23                     <h1>{this.props.msg}</h1>
    24                     <button>移除组件</button>
    25                 </div>
    26             )
    27         }
    28     }
    29     ReactDOM.render(<LiftCycle msg="好好学习,天天向上"/>,document.getElementById("test"));
    30 </script>

     第二步:做动画,让文本的 opacity 值不断改变

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <title>Document</title>
     7     <script src="../js/react.development.js"></script>
     8     <script src="../js/react-dom.development.js"></script>
     9     <script src="../js/prop-types.js"></script>
    10     <script src="../js/babel.min.js"></script>
    11 </head>
    12 <body>
    13     <div id="test"></div>
    14 </body>
    15 </html>
    16 <script type="text/babel">
    17  
    18     class LiftCycle extends React.Component{
    19         constructor(props){
    20             super(props);
    21             this.state={
    22                 opacity:1,
    23             }
    24         }
    25 
    26         componentDidMount(){ ////在此方法中启动定时器/绑定监听/发送ajax请求
    27             let {opacity}=this.state;//注意用let不能用const
    28             setInterval(function(){
    29                 opacity-=0.1;
    30                 if(opacity<=0){  //<=0
    31                     opacity=1;
    32                 }
    33                 this.setState({ opacity });
    34             }.bind(this),200);//2s内从0到1的改变,每改变0.1需要200ms,bind(this)是把定时器这个函数绑定到组价对象上
    35             
    36         }
    37        
    38         render(){
    39             const {opacity}=this.state;
    40             return(
    41                 <div>
    42                     <h1 style={{opacity}}>{this.props.msg}</h1>
    43                     <button>移除组件</button>
    44                 </div>
    45             )
    46         }
    47     
    48     }
    49     ReactDOM.render(<LiftCycle msg="好好学习,天天向上"/>,document.getElementById("test"));
    50 </script>

    第三步:点击按钮移除组件,使用 React.unmountComponentAtNode() 方法

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <title>Document</title>
     7     <script src="../js/react.development.js"></script>
     8     <script src="../js/react-dom.development.js"></script>
     9     <script src="../js/prop-types.js"></script>
    10     <script src="../js/babel.min.js"></script>
    11 </head>
    12 <body>
    13     <div id="test"></div>
    14 </body>
    15 </html>
    16 <script type="text/babel">
    17  
    18     class LiftCycle extends React.Component{
    19         constructor(props){
    20             super(props);
    21             this.state={
    22                 opacity:1,
    23             }
    24             this.remove=this.remove.bind(this);
    25         }
    26 
    27         componentDidMount(){ ////在此方法中启动定时器/绑定监听/发送ajax请求
    28             let {opacity}=this.state;//注意用let不能用const
    29             setInterval(function(){
    30                 console.log("定时器执行.....");
    31                 opacity-=0.1;
    32                 if(opacity<=0){  //<=0
    33                     opacity=1;
    34                 }
    35                 this.setState({ opacity });
    36             }.bind(this),200);////2s内从0到1的改变,每改变0.1需要200ms,bind(this)是把定时器这个函数绑定到组价对象上
    37             
    38         }
    39 
    40         remove(){
    41             ReactDOM.unmountComponentAtNode(document.getElementById("test"));
    42         }
    43        
    44         render(){
    45             const {opacity}=this.state;
    46             return(
    47                 <div>
    48                     <h1 style={{opacity}}>{this.props.msg}</h1>
    49                     <button onClick={this.remove}>移除组件</button>
    50                 </div>
    51             )
    52         }
    53     
    54     }
    55     ReactDOM.render(<LiftCycle msg="好好学习,天天向上"/>,document.getElementById("test"));
    56 </script>

    但是有一个问题,点击按钮移除组件对象之后,定时器仍然是开启的,没有关闭,所以我们需要关闭定时器。使用componentWillUnmount() 方法

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <title>Document</title>
     7     <script src="../js/react.development.js"></script>
     8     <script src="../js/react-dom.development.js"></script>
     9     <script src="../js/prop-types.js"></script>
    10     <script src="../js/babel.min.js"></script>
    11 </head>
    12 <body>
    13     <div id="test"></div>
    14 </body>
    15 </html>
    16 <script type="text/babel">
    17  
    18     class LiftCycle extends React.Component{
    19         constructor(props){
    20             super(props);
    21             this.state={
    22                 opacity:1,
    23             }
    24             this.remove=this.remove.bind(this);
    25         }
    26 
    27         componentDidMount(){ ////在此方法中启动定时器/绑定监听/发送ajax请求
    28             let {opacity}=this.state;//注意用let不能用const
    29             this.timer=setInterval(function(){ //使用this.timer是为了把定时器保存到当前组件对象中,以方便清楚定时器的行为可以读取定时器的id
    30                 console.log("定时器执行.....");
    31                 opacity-=0.1;
    32                 if(opacity<=0){  //<=0
    33                     opacity=1;
    34                 }
    35                 this.setState({ opacity });
    36             }.bind(this),200);////2s内从0到1的改变,每改变0.1需要200ms,bind(this)是把定时器这个函数绑定到组价对象上
    37             
    38         }
    39 
    40         remove(){ //点击按钮,移除LifeCycle组件
    41             ReactDOM.unmountComponentAtNode(document.getElementById("test"));
    42         }
    43 
    44         componentWillUnmount(){ //清除定时器/解除监听
    45             clearInterval(this.timer);
    46         }
    47        
    48         render(){
    49             const {opacity}=this.state;
    50             return(
    51                 <div>
    52                     <h1 style={{opacity}}>{this.props.msg}</h1>
    53                     <button onClick={this.remove}>移除组件</button>
    54                 </div>
    55             )
    56         }
    57     
    58     }
    59     ReactDOM.render(<LiftCycle msg="好好学习,天天向上"/>,document.getElementById("test"));
    60 </script>
  • 相关阅读:
    JAVA常见面试题之Forward和Redirect的区别
    [转载]vm文件
    [转载]vm文件
    [转载]心灵丨愿你早一点发现,你才是自己最重要的粉丝
    [转载]心灵丨愿你早一点发现,你才是自己最重要的粉丝
    iBatis整理——Spring环境下批处理实现
    iBatis整理——Spring环境下批处理实现
    SAP HANA 三大特点
    在解决方案中搜索 文件的位置
    我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12488078.html
Copyright © 2011-2022 走看看