vue: 深入及生命周期

在外部(js中或者其他vue实例中)改变vue实例中的内容

        <div id="app">
     <p>{{ title }}</p>
</div>
<div id="app2">
    <p>{{ title }}</p>
    <button @click = 'changeTitle'>change vm1 title</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
 const vm = new Vue({
     el : "#app",
     data : {
         title: "我是一个vue实例"
     }
 })

 setTimeout(() => {
 vm.title = "我通过timer改变!"
        }, 1000)

 const vm2 = new Vue({
     el : "#app2",
     data : {
         title: "我是一个vue实例2"
     },
     methods: {
         changeTitle: function() {
             vm.title = "变变变!"
         }
     }
 })
</script>
      

在以上代码中,把vue实例赋值给一个名字,在其他地方就可以通过该名字调用这个实例的内容,比如在setTimeout中调用,或者是在vm2中调用。

v2-98bf06a4f64ec07ef4c20101774c3124_b.jpg

Vue底层

我们打印一下vm2一个实例

        console.log(vm2)

      

经过处理之后返回了一个对象,对象当中包含我们定义的函数和变量

v2-e42c02bc0fc714f455a9e18d87e19574_b.jpg

vue实例中的this指向当前vue实例

        console.log(this === vm2)
      

返回true

底层数据绑定:

在vm2中点击改变vm中的数据原理:

通过set相对应得Object.defineProperty(vm, "title", { get(){}, set(){} })方法,监听数据,当数据改变对比虚拟DOM,虚拟dom比重排重绘消耗性能低。


Vue中的三个特殊属性:自带$或者_

$el:

存储vue对象,控制html代码

_data:

存储传过来的data,只是引用值

        const data = {
    title: "我是外面的data"
}

const vm2 = new Vue({
    el : "#app2",
    data: data, // 引用外面的data
    methods: {
        changeTitle: function() {
        this.title = "变变变!"
        vm.title = "变变变!"
        console.log(this === vm2)
        console.log( data === this._data )
    }}
})

      

$refs:{}

保存想获取的dom节点,通过这种方式操作dom节点(一般不使用该方式,都是通过数据方式)

        <!-- html代码 -->
<div id="app2">
    <p ref="myP">{{ title }}</p>
    <button @click = 'changeTitle'>change vm1 title</button>
</div>
      


        // js代码 
vm2.$refs.myP.innerText = "我想让你改变!"

      

v2-4f704f45952b58eed1e99e0c62a859b2_b.jpg


如果我们自己写的变量中是$开头,那么他们会在哪里?

它会存在_data中

        const data = {
    title: "我是外面的data",
    $name: "fanghuayong",
}

      

v2-35e88b7e9313fb9e088f0969b2957ef9_b.jpg


第二个底层:

虚拟dom怎么实现

虚拟dom:使用对象来表示dom是什么

通过js计算旧的dom对象和新的dom对象有什么不同,再改变,js运算比浏览器重排重绘快


生命周期:

v2-8d20682e8dbf2288a86d6099bf73f6ec_b.jpg
  1. new一个Vue实例,会初始化事件,触发beforCreate函数
  2. 初始化注入,触发created函数
  3. 编译模版
  4. 编译渲染后触发beforeMount函数
  5. 挂载vm.$el
  6. 调用mounted函数(编译完成)
  7. 点击触发Mounted函数,如果检测到虚拟dom不同的话触发updated函数(一直工作)
  8. vm.$destroy()方法可以让vue实例死亡,死亡触发beforeDestroy函数
  9. 解绑监听、组件等
  10. 解绑完触发destroyed函数把vue实例结束
        <div id="app">
        <p>{{ title }}</p>
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
    el : "#app",
    data : {
        title: "我是Vue",
    },
 beforeCreate: function() {
 // 完成初始化事件的时候触发
 console.log("beforeCreate")
    },
 created: function() {
 // 绑定完数据触发该函数
 console.log("created")
    },
 beforeMount: function() {
 console.log("beforeMount")
    },
 mounted: function() {
 console.log("mounted")
    },
})

      

v2-10aa409b9bd50ec16991af60fe4866b7_b.jpg

在beforeCreate之前获取不到data数据和methods的方法,在之后才绑定上的

        new Vue({
    el : "#app",
    data : {
        title: "我是Vue",
    },
 beforeCreate: function() {
 console.log(this.title)
    },
 created: function() {
 console.log(this.title)
    },
 beforeMount: function() {
 console.log("beforeMount")
    },
 mounted: function() {
 console.log("mounted")
    },
})

      

v2-c7fb85cb44a3ae8ba3133b113f959c2a_b.jpg

更新和卸载

更新

        <div id="app">
    <p>{{ title }}</p>
    <button @click = "title = '更新数据'">点击更新</button>
    <button @click = "$destroy()">卸载</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el : "#app",
        data : {
            title: "我是Vue",
        },
        beforeCreate: function() {
            console.log(this.title)
        },
        created: function() {
        console.log(this.title)
        },
       beforeMount: function() {
          console.log("beforeMount")
       },
       mounted: function() {
           console.log("mounted")
       },
      beforeUpdate: function() {
         console.log('beforeUpdate')
      },
      updated: function() {
          console.log('updated')
      },
      beforeDestroy: function() {
        console.log("beforeDestroy")
      },
      destroyed: function() {
        console.log("destroyed")
      }
})
      

点击更新的时候触发(更新前)beforeUpdate和updated函数

v2-467f4969c815eb61bf55b2e578786d69_b.jpg


卸载

点击卸载的时候触发beforeDestroy和destroyed函数

v2-eab8d3b9720a093351a0f5aa6eee6a45_b.jpg

v2-2317329ba9d0dcc38c36b63cc37a58fb_b.jpg

点击卸载后,再点更新,不会再触发任何函数,已经不再被vue控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值