首页 > 技术文章 > vue----生命周期

SRH151219 2019-02-17 10:10 原文

生命周期
  一个组件从创建到销毁的这个过程就叫做生命周期
1.beforeCreate创建前---------------加载动画loading
beforeCreate当初始化的时候读取生命周期函数,
1.不能进行调用属性 2.不能访问到属性和方法
2.created创建后--------------(ajax的请求,接收非父子组件传的值)
created:当beforeCreate初始化完毕以后,会执行created。
当执行created的时候会,

1.
在created中可以访问到数据(属性)和方法了

2.将vm身上所有的属性和方法并遍历挂载到vue的实例身上,
3.同时,给data中的每一个属性都添加一个getter和setter方法,实现数据的双向绑定
 
4.属性有getter方法和setter方法才可以进行双向绑定(当属性值发生改变时,凡是关联到该属性的值都会发生改变) 
3.beforeMount挂载前
1.将读取到所有的虚拟DOM,和数据进行结合

2.但是没有生产真正的DOm结构,这里面是只能访问到虚拟DOM的
4.mounted:挂载完成,---------------插件进行实例化
1.虚拟DOM和数据结合完成后生成真正的DOM结构,可访问到真实DOM
2.可以使用refs进行dom的操作,通过this.$refs.值 来获取真实的dom结构。
3.使用一些插件进行实例化的时候我们都可以在mounted里面进行操作 例如 swiper better
-scroll
5.beforeUpdate:修改前
1.当数据进行修改的时候会执行beforeUpdate,

2.但是数据不会立马进行更新,而是数据和模板进行相结合的状态,访问到的dom是更新之前的dom结构 3.重新渲染虚拟 dom,并通过 diff 算法对比 vnode 节点差异更新真实 dom (
virtual DOM re-render and patch)
(一个页面,先进行 对比,只对需要更新的部分进行更新)
6.updated修改后----------------(瀑布流,计算加载图片后,页面的高度)
1.数据和模板结合完毕生成新的DOM结构
7.beforeDestroy销毁前-----做事件的解绑,移除监听等工作
1.销毁前是可以访问到数据和方法,可以访问到当前dom的元素
8.destroyed销毁后
1.不能访问到真实dom元素了,但能访问到数据,把vm与DOM之间的关联全部断开
 
<script>
    var vm = new Vue({
        el:"#app",
        //创建前
        beforeCreate(){
            console.log("beforeCreated………………");
            console.log(this.message);//undefined 访问不到属性
            // this.handleClick();//报错  访问不到方法
        },
        //创建后
        created(){
            console.log("created…………");
            console.log(this.message);//访问到属性
            this.handleClick();//访问到方法
        },
        data:{
          message:"文本"  //message有set和get方法
        },
        methods:{
            handleClick(){
                console.log("这是个方法");
            }
        }
    })
    vm.age=32;//age没有get 和 set 方法,不能实现双向
    console.log(vm);
</script>

 

操作虚拟dom
 
<!-- ref的值必须唯一 -->
        <div ref="box">{{message}}</div>
 
console.log(this.$refs);//{},点击里面有box
 console.log(this.$refs.box);//输出虚拟dom'
挂载前,挂载后
<body>
 
    <div id="app">
        <!-- ref的值必须唯一 -->
        <div ref="box">{{message}}</div>
    </div>
</body>
</html>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        beforeCreate(){
            console.log("beforeCreated………………");
            console.log(this.message);
        },
        //创建后
        created(){
            console.log("created…………");
            console.log(this.message);
            this.handleClick();
        },
        data:{
          message:"文本"
        },
        methods:{
            handleClick(){
                console.log("这是个方法");
            }
        },
        beforeMount(){
            console.log("beforeMount…………");
            //$refs访问虚拟dom节点
            console.log(this.$refs);//{},点击里面有box
            console.log(this.$refs.box);//undefined,挂载前,访问不到虚拟dom
            
        },
        mounted(){
            console.log(this.$refs);//{box}
            console.log(this.$refs.box);//<div>文本</div>访问到虚拟dom
        }
    })
 
</script>

 

销毁前   销毁后
 
<body>
 
    <div id="app">
        <!-- ref的值必须唯一 -->
        <div ref="box">{{message}}</div>
        <div ref="box">{{message}}</div>
        <div ref="box">{{message}}</div>
        <div ref="box">{{message}}</div>
    </div>
 
    <!-- 在app外 -->
    <button onclick="destroy()">销毁</button>
</body>
</html>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
          message:"文本"
        },
        beforeDestroy(){
            // alert
            console.log("beforeDestroy…………");
            console.log(this.$refs);
            console.log(this.$refs.box);//<div>box</div>可访问到bom元素
        },
        destroyed(){
            console.log("destroyed…………");
            console.log(this.$refs);
            console.log(this.$refs.box);//undefined访问不到bom元素
        }
    })
 
    function destroy(){
        alert(1);
        // vm的一个方法,销毁
        vm.$destroy();
    }
 
</script>
 
vm的方法  $destroy
 
 
修改前,修改后
 
<body>
 
    <div id="app">
        <!-- ref的值必须唯一 -->
        <div ref="box">{{message}}</div>
        <button @click="handleClick()"> 点击修改</button>
    </div>
</body>
</html>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        
        data:{
          message:"文本"
        },
        methods:{
            handleClick(){
                this.message = "我是修改的数据";
            }
        },
        beforeUpdate(){
            alert(1);
            console.log("boforeUpdate…………");
            console.log(app.innerHTML);
        },
        updated(){
            console.log("updated…………")
            console.log(app.innerHTML);
        }
    })
 
</script>

推荐阅读