vue学习 --- vue的响应式1

	<!--
 * @Description: 
 * @Version: 2.0
 * @Autor: Ricardo
 * @Date: 2020-09-21 15:39:58
 * @LastEditors: Seven
 * @LastEditTime: 2020-09-22 10:12:38
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div id="app">
        {{ msg }},
        {{ student.name }}
    </div>

    <!-- 渲染
        
        发生改变时 会重新在加载数据
        未使用 的 渲染页面 操作dom  会耗费性能 优化条件的减少dom的操作

        更改数据后  页面不会立即重新渲染页面 

        页面渲染的操作是异步执行
        同步执行栈,异步队列(宏任务 , 微任务  event loop事件环)
            异步队列 --执行顺序也就是  微任务 ---  》宏任务
    -->

    <script src="../vue.js"></script>
    <script type="text/javascript">
        // 需要暴露属性和方法  放在原型链上 构造函数的this  
        function Ceshi(config) {
            // const this={};
            // config= {data:{"键值对"}}

            this.data = config.data
            // return this


            for (let key in config.data) {
                this[data] = config.data[key]
            }

        }

        /*
            vue data在 vm对象的实例对象上  例如 vm.xxx 获取对象上的属性
            
            响应式  是 监控对象  实时监测
                监测数据变化  
                object={attrs {}}
                vue 中数据监测对象太多
                Object.defineProperty 数据劫持  解决数据监测  监听对象  
            
            -------$data  ------  _data-----  
            前者暴露给开发者  使用的数据
            后者 则是 vue内部使使用的数据   
            
            未经声明的属性 不会报错
            

            

        */

        const vm = new Vue({
            el: "#app",
            data: {
                msg: "插值的内容",
                student: {
                    name: "name1",
                    age: 12,

                }

            }
        });

        vm.msg = "已修改的name"


        const vh = new Vue({
            el: "#app",
            data: {
                msg: "插值的内容",
                student: {
                    name: "name1",
                    age: 12,

                }

            }
        });


        console.log(vm.msg);
        // 使用vm.$nextTick()
        vm.$nextTick(() => {
            // callback
            console.log(vh.$el.innerHTML);
        });

        // 使用Vue.nextTick(()=>{})

        Vue.nextTick(() => {
            console.log(vh.$el.innerHTML);
        });
        /*
            Vue.nextTick()
            内部函数 this指向window
        */

        Vue.nextTick(function () {
            console.log(this); // window
        });

        //  this.$nextTick(callback)

        vm.$nextTick(function () {
            console.log(this); // vm实例    
        });



        // this.$nextTick(callback)的实现
        /*
            异步执行任务我 分为  宏任务macro   和  微任务micro
                宏任务 执行时间慢,例如settimeout  
                微任务快例如promise  then()

                微任务在前,宏任务在后

        */

        // promise > timeout
        setTimeout(() => {
            console.log("timeout");
        }, 0);

        Promise.resolve().then(()=>{
            console.log("这是 promise ");
        });

        // 在nextTick的实现源码中,会先判断是否支持微任务,不支持后,才会执行宏任务
        if (typeof promise !== "undefined") {
            // 判断 浏览器引擎中 是否有promise 
            // IE 不支持 promise 
                const p = promise.resolve();
        }else if (typeof MutationObserver !== "undefined") {
            // 微任务   突变观察 监听文档的中的文字的变化,如果文字有变化会执行回调函数
        } else if(typeof setImmediate !=="undefined"){
            // 宏任务 
        } else{
             // 宏任务
                // 如果上面都不能执行,那么则会调用setTimeout
        }

    </script>
</body>

</html>
	```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值