八、vue.js生命周期

一、Vue生命周期

vue实例中从创建到销毁的过程,称之为生命周期,共有八个阶段。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue的生命周期</title>
<script type="text/javascript" src="js/vue.min.js"></script>
<script type="text/javascript">
window.onload = function(){
    new Vue({

        el:'#itany',
        data:{
            msg:'你好啊'
        },
        methods:{
            update(){
                this.msg='欢迎';
            },
            destroy(){
                this.$destroy();
            }
        },
        beforeCreate(){
            alert('组件实例刚刚创建,还未进行数据的观测和事件的配置');
        },
        create(){
            alert('组件实例已经创建完成,并且已经进行数据的观测和事件配置');
        },
        beforeMount(){
            alert('模板编译之前,还没有挂载');
        },
        mounted(){
            alert('模板编译之后,已经挂载,此时才会渲染页面,才能看到页面上数据的展示');
        },
        beforeUpdate(){
            alert('组件数据更新之前');
        },
        updated(){
            alert('组件更新之后');
        },
        beforeDestroy(){
            alert('组件销毁之前');
        },
        destroyed(){
            alert('组件销毁之后');
        }
    })
}
</script>
  </head>
  <body>
<div id="itany">
    {{msg}}
<button @click="update">点击</button>
<button @click="destroy">点击销毁</button>
</div>
</body>
</html>

二、 计算属性

1.基本用法

    计算属性也是用来存储数据的,但是有以下几个特点。
       a.数据可以进行逻辑处理操作的
       b.可以对计算属性中的数据进行监视 

2.计算属性 vs 方法

    将计算属性的get函数定义为一个方法也可以实现类似的功能
    区别:
       a.计算属性是基于它的依赖进行更新的,只有在相关依赖发生改变时才能更新变化
        b.计算属性是缓存的,只有相关依赖没有改变,多次访问计算属性得到的值是之前缓存的计算结果,不会多次执行。

3.get和set

    计算属性由两部分组成,get和set,分别用来获取计算属性和设置计算属性;
    默认只有get,如果需要set,要自己添加。
    <!DOCTYPE html>
    <html lang="en">
    <head>
<meta charset="UTF-8">
<title>计算属性</title>
<script type="text/javascript" src="js/vue.min.js"></script>
    </head>
    <body>
<div id="itany">
    {{msg}}
    <br>
    {{msg2}}
    <br>
    <!-- 对数据进行处理再显示 -->
    {{msg.split('').reverse().join('')}}
    <br>
    {{msg3}}
    <br>
    <button @click="changemsg">修改msg值</button>
    <br>
    {{num1}}
    <br>
    num2:
    {{num2}}
    <br>
    {{getnum2()}}

    <br>
    <button onclick="a()">测试</button>
    <br>
    <button @click="change()">修改计算属性</button>
</div>
    </body>
    </html>
     <script type="text/javascript">
    var vm = new Vue({
        el:'#itany',
        data:{
            msg:'weloome to itany',
            num1:7
        },
        computed:{
            msg2:function(){
                return '欢迎来到北京'
            },
            msg3:function(){
                return this.msg.split('').reverse().join('');
            },
            // num2:function(){
            //  console.log(new Date());
            //  return this.num1-1;
            // }
            num2:{
                get:function(){
                    console.log(new Date());
                    return this.num1-1;
                },
                set:function(val){  
                    // console.log('修改值');
                    this.num1 = 1111;
                }
            }
        },
        methods:{
            changemsg(){
                // this.msg = 'i love you';
                this.num1 = 666;
            },
            getnum2(){
                console.log(new Date());
                return this.num1-1;
            },
            change(){
                this.num2=11;
            }
        }
    })
function a(){
    setInterval(function(){
        // console.log(vm.num2);
        console.log(vm.getnum2())
    },1000)
}
</script>

三、vue实例的属性和方法

1.属性

   vm.$el
   vm.$date
   vm.$options

2.方法

  vm.$mount();
  vm.$destroy();
  vm.$nextTick();
  <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="js/vue.min.js"></script>
</head>
<body>
<div id="itany">
    {{msg}}
    <h2 ref="hh">标题:{{name}}</h2>
    <h2 ref="hello">你好1</h2>
    <h2 ref="world">你好2</h2>
</div>

<script type="text/javascript">
// var vm = new Vue({
//  // el:'#itany',
//  // name:'tom',
//  // age:24,
//  // show:function(){
//  //  console.log('show');
//  // },
//  data:{
//      msg:'welcome to itany'
//  }
// })
// 属性
// vm.属性名 获取data中的属性
// console.log(vm.msg);
// vm.$el 获取vue实例关联的选择器
// console.log(vm.$el); 是DOM对象
// vm.$el.style.color='red';
// vm.$data //获取数据对象data
// console.log(vm.$data.msg);
// vm.$options //

// console.log(vm.$options.name);
// console.log(vm.$options.age);
// vm.$options.show();

// vm.$refs  //获取页面中所有添加属性的元素

// console.log(vm.$refs.hello);
// console.log(vm.$refs.world);
// vm.$refs.hello.style.color = 'red';

// 方法
// vm.$mount //手动的挂载vue实例
// vm.$mount('#itany');
var vm = new Vue({
    data:{
        msg:'11',
        name:'tom'
    }
}).$mount('#itany');

// vm.$destroy() 销毁实例的
// vm.$destroy();
// console.log(vm.msg);

//vm.nextTick()  在DOM更新完成之后 再执行回调函数 一般在修改数据之后使用该方法,以便获取更新后的DOM
// 修改数据
vm.name = "222333";
// DOM还没更新完 view实现响应式并不是数据发生改变之后 dom立即变化 需要按照一定的策略进行dom更新
// console.log(vm.$refs.hh.textContent);
// console.log(vm.$refs.hello);
vm.$nextTick(function(){
    // DOM更新完成了 更新完成后 执行此代码
    console.log(vm.$refs.hh.textContent);
})
</script>
</body>
</html>
  vm.$set();
  vm.$delete();
  <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="js/vue.min.js"></script>
</head>
<body>
<div id="itany">
    <button @click="doUpdate">修改属性</button>
    <button @click="doAdd">添加属性</button>
    <button @click="doDelete()">删除属性</button>
    <div>{{user.name}}</div>
    <div>{{user.age}}</div>
</div>
<script type="text/javascript">
var vm = new Vue({
    el:'#itany',
    data:{
        user:{
            id:'1001',
            name:"tom",
            age:'1'
        }
    },
    methods:{
        doUpdate(){
            this.user.name='tom1';
        },
        doAdd(){
            // this.user.age = 25;
            //通过普通方式为对象添加属性时vue无法实时的监视的
            // this.$set(this.user,'age',18);
            //通过vue实例的$set方法为对象添加属性,可以实时的监视
            // Vue.set(this.user,'age',28);
            //全局的写法
            if(this.user.age){
                ++this.user.age;
            }else{
                Vue.set(this.user,'age',46);
            }
            console.log(this.user);
        },
        doDelete(){
            if(this.user.age){
                //delete.this.user.age;//无效
                Vue.delete(this.user,'age');
            }else{

            }
        }
    }
})
</script>
</body>
</html>
  vm.$watch();
  <!DOCTYPE html>
  <html lang="en">
  <head>
<meta charset="UTF-8">
<title>监视数据的变化,使用$watch</title>
<script type="text/javascript" src="js/vue.min.js"></script>
<script type="text/javascript">
window.onload = function(){
    var vm = new Vue({
        el:'#itany',
        data:{
            name:'tom',
            age:'23',
            user:{
                id:'1001',
                name:'uu'
            }
        },
        // 方式2 使用vue实例提供的watch方法
        watch:{
            age:(newVal,oldVal) => {
                    console.log('name被修改了old:'+oldVal);
                    console.log('name被修改了new:'+newVal);
            },
            user:{
                handler:(newVal,oldVal)=>{
                    console.log('user被修改了old:'+oldVal.name);
                    console.log('user被修改了new:'+newVal.name);
                },
                deep:true //深度监视 //当对象的属性发生变化时候 也会监视
            }
        }

    })
    //方式1:使用vue实例提供的$watch()方法
    // vm.$watch('name',function(newVal,oldVal){
    //  console.log('name被修改了old:'+oldVal);
    //  console.log('name被修改了new:'+newVal);
    // })
}
</script>
    </head>
    <body>
<div id="itany">
    <input type="text" name="" v-model="name">
    <h1>{{name}}</h1>
    <br>
    <input type="text" name="" v-model="age">
    <h1>{{age}}</h1>
    <br>
    <input type="text" name="" v-model="user.name">
    {{user.name}}
</div>
  </body>
  </html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,043评论 0 29
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 还记得自己是谁吗? 是那个人见人爱,花见花开的你? 还是那个无坚不摧,无所不能的你? 还是那个满嘴谎言,说三道四的...
    普通的女子阅读 279评论 0 2
  • 牛仔单品可以说是一年四季都可以穿,大概也是所有人衣柜里必备的。如果冬天藏了一季,春天到了赶紧穿着它出来晒晒春光。牛...
    拍范阅读 149评论 0 1
  • 做梦梦见想去上厕所,结果被两个人追杀,进入了一个时空混乱的地方,什么时代的人都有,后来逃出来,跑在路上,遇到击剑队...
    王大闲人阅读 309评论 0 0