vue.js之生命周期,防止闪烁,计算属性的使用,vue实例简单方法和循环重复数据

摘要:今天学习一下vue的生命周期,如何防止闪烁(也就是用户看得到花括号),计算属性的使用,vue实例简单方法,以及当有重复数据时如何循环

一、vue的生命周期:熟悉它的生命周期可以让开发更好的进行。

  钩子函数:

  created    :实例已经创建   
  beforeCompile:编译之前
  compiled :编译之后
  ready:插入到文档中
  beforedestroy :销毁之前
  destroyed:销毁之后
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>生存周期</title>
    <script src="vue.js"></script>
    <script src="vue-resource.js"></script>
    <script>
        window.onload=function () {
           var vm= new Vue({
                el:'#box',
                data:{
                    msg:'well'
                },
                created:function () {
                    alert('实例已创建')
                },
                beforeCompile:function () {
                    alert('编译之前')
                },
                compiled:function () {
                    alert('编译之后')
                },
                ready:function(){
                    alert('插入到文档中');
                },
                beforeDestroy:function(){
                    alert('销毁之前');
                },
                destroyed:function(){
                    alert('销毁之后');
                }
            });
            /*点击页面销毁vue对象*/
            document.onclick=function(){
                vm.$destroy();
            };
        }
    </script>
</head>
<body>
    <div id="box">
        {{msg}}
    </div>
</body>
</html>

 

 运行结果:弹出编译前,实例已创建,编译之前,编译之后,插入到文档中,然后页面显示msg的内容,最后点击页面的任何位置vue对象销毁

为了更好地理解这个过程,可以参照下面的这个图片进行了解

 

二、如何解决用户看到花括号的问题:页面加载时出现vuejs变量名

  例如:当加载如下代码时

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>

    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            var vm= new Vue({
                el:"#box",
                data:{
                    a:1
                },
                computed:{
                    b:function () {
                        return this.a+1;
                    }
                }
            });
            document.onclick=function () {
                vm.a=101;
            }
        }
    </script>
</head>
<body>
<div id="box">
    a=>{{a}}
    <br>
    b=>{{b}}
</div>
</body>
</html>

 

可能会闪现

a=>{{a}}
b=>{{b}}
所以有以下几种方法来解决这个问题

1、v-cloak 防止闪烁,用于 比较大段落

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>防止闪烁</title>
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            var vm= new Vue({
                el:"#box",
                data:{
                    a:1
                },
                computed:{
                    b:function () {
                        return this.a+1;
                    }
                }
            });
            document.onclick=function () {
                vm.a=101;
            }
        }
    </script>
</head>
<body>
<div id="box" v-cloak>
    a=>{{a}}
    <br>
    b=>{{b}}
</div>
</body>
</html>

原理:这段 CSS 的含义是,包含 v-cloak (cloak n. 披风,斗篷;vt. 遮盖,掩盖) 属性的 html 标签在页面初始化时会被隐藏。在 vuejs instance ready 之后,v-cloak 属性会被自动去除,也就是对应的标签会变为可见。

2、v-text方法

  2.1当没有html标签的情况

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            new Vue({
                el:"#box",
                data:{
                    msg:'welcome'
                }
            })
        }
    </script>
</head>
<body>
    <div id="box">
        <!--这种写法在网速比较慢的时候会看的见花括号-->
        <span>{{msg}}</span>
        <!--这种写法网速再慢也看不见花括号-->
        <span v-text="msg"></span>
    </div>
</body>
</html>

 

2.2当有html标签的时候:v-text不起作用了,{{{}}}有作用
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            new Vue({
                el:"#box",
                data:{
                    msg:'<strong>welcome</strong>'
                }
            })
        }
    </script>
</head>
<body>
<div id="box">
    <span>{{{msg}}}</span>
    <span v-text="msg"></span>
</div>
</body>
</html>
运行结果:

3、v-thml方法:解决到上面2.2的问题

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            new Vue({
                el:"#box",
                data:{
                    msg:'<strong>welcome</strong>'
                }
            })
        }
    </script>
</head>
<body>
<div id="box">
    <span>{{{msg}}}</span>
    <span v-html="msg"></span>
</div>
</body>
</html>

 

运行结果:


三、计算属性的使用

1、基本用法: 说明-〉b看起来像是一个函数名其实是一个属性,
computed里面可以放置一些业务逻辑代码,一定记得return;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
           var vm= new Vue({
                el:"#box",
                data:{
                    a:1
                },
                computed:{
                    b:function () {          //默认调用get
                        return this.a+1;
                    }
                }
            });
            document.onclick=function () {
               vm.a=101;
            }
        }
    </script>
</head>
<body>
<div id="box">
    a=>{{a}}
    <br>
    b=>{{b}}
</div>
</body>
</html>

 

 运行结果:当a改变的时候b也跟着变化
点击页面之前:

点击页面之后:

2、计算属性的get和set方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            var vm= new Vue({
                el:"#box",
                data:{
                    a:1
                },
                computed:{
                    b:{
                        get:function() {                //将a的值加2后赋给b
                            return this.a+2;
                        },
                        set:function(val){
                            alert(val)
                            this.a=val;           
                        }

                    }
                }
            });
            document.onclick=function () {      //点击页面之后将vue实例对象vm的b设置为101,调用set()函数
                vm.b=101;
            }
        }
    </script>
</head>
<body>
<div id="box">
    a=>{{a}}
    <br>
    b=>{{b}}
</div>
</body>
</html>

 

 运行结果:
点击页面之前:

点击页面之后:

弹出101,并且页面变为

四、vue实例简单方法

1、vm.$el  ->  就是元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue实例简单方法</title>
    <script src="vue.js"></script>
    <script >
        window.onload=function () {
            var vm=new Vue({
                el:"#box",
                data:{
                    a:1
                }
            });
            console.log(vm.$el);
            vm.$el.style.background='red'
        }
    </script>
</head>
<body>
    <div id="box">
        {{a}}
    </div>
</body>
</html>

 

 运行结果:

2、vm.$data -> 就是data

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue实例简单方法2</title>
    <script src="vue.js"></script>
    <script >
        window.onload=function () {
            var vm=new Vue({
                el:"#box",
                data:{
                    a:1
                }
            });
            console.log(vm.$data);
            console.log(vm.$data.a);
        }
    </script>
</head>
<body>
<div id="box">
    {{a}}
</div>
</body>
</html>

 

 运行结果:

3、vm.$mount -> 手动挂载vue程序


<!DOCTYPE ht<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue实例简单方法3</title>
    <script src="vue.js"></script>
    <script >
        window.onload=function () {
//普通写法
var vm=new Vue({                        //跟以前相比这里少了el,所以需要后面手动挂载 data:{ a:1 } }); vm.$mount("#box"); //手动挂载
     
//链式写法  
      // var vm=new Vue({

        //  data:{
           a:1
        //  }
         // }).$mount("#box");//手动挂载

} </script> </head> <body> <div id="box"> <span v-text="a"></span> </div> </body> </html>

 

4、vm.$options -> 获取自定义属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue实例简单方法3</title>
    <script src="vue.js"></script>
    <script >
        window.onload=function () {
            var vm=new Vue({
                aa:11,       //自定义属性
                show:function () {          //自定义方法
                    alert(1)
                },
                data:{
                    a:1
                }
            }).$mount("#box");
            vm.$options.show();             //调用自定义方法
            console.log(vm.$options.aa);        //访问自定义属性
        }
    </script>
</head>
<body>
<div id="box">
    <span v-text="a"></span>
</div>
</body>
</html>

 运行结果:

弹出1,并且控制台输出11

 

 

5、vm.$log(); -> 查看现在数据的状态

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>智能社——http://www.zhinengshe.com</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <style>

    </style>
    <script src="vue.js"></script>
    <script>

    </script>
</head>
<body>
    <div id="box">
        <span v-text="a"></span>
    </div>
    <script>

        var vm=new Vue({
            data:{
                a:1,
                b:2
            }
        }).$mount('#box');

        console.log(vm.$log());
    </script>
</body>
</html>

 

 运行结果:

 

五、循环--数据重复: 当数据重复的时候,vue不会将其加载进来形成新的节点,为了解决这个没问题 vue提供了track-by="索引"这个属性,这个属性还能提高性能

下面代码将演示如何使用它

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>循环-重复数据</title>
    <script src="vue.js"></script>
    <script>
        window.onload=function () {
            new Vue({
                el:"#box",
                data:{
                    arr:['apple','pine','orange']
                },
                methods:{
                    add:function () {
                        this.arr.push('tomato')
                    }
                }
            })
        }
    </script>
</head>
<body>
    <div id="box">
        <input type="button" value="按钮" @click="add()">
        <ul>
            <li v-for="value in arr" track-by="$index">
                {{value}}
            </li>
        </ul>
    </div>
</body>
</html>

 

运行结果:点击按钮,tomato被显示在页面而且可以添加多次,如果没有track-by="索引"这个属性将只能添加一次

 

 

 

 

 

 

 

 



















































posted @ 2017-12-19 22:11  傅杰  阅读(1321)  评论(0编辑  收藏  举报