【vue】响应式数据实现原理2

响应式数据的实现挺简单的,简单模拟一下。

<script>
    const data = {
        foo:"hello",
        bar:"world"
    }
    const vm = Object.create(null);
    vm._data = data;

    const keys = Object.keys(data);
    keys.forEach(key => {
        Object.defineProperty(vm,key,{
            configurable:true,
            enumerable:true,
            get(){
                return vm._data[key];
            },
            set(val){
                vm._data[key] = val;
            }
        });
    })

    console.log(data.foo,vm.foo);

    data.foo = 'good';
    console.log(data.foo,vm.foo);
    vm.foo = "nice";
    console.log(data.foo,vm.foo);
</script>

在这里插入图片描述

//index.js
import Vue from "vue";
import Helloworld from "./src/helloworld.vue";

const data = {
    foo:"hello",
    bar:"world"
}
const vm = new Vue({
    render:(h) => h(Helloworld),
    data:data
}).$mount("#root");

console.log(vm.$data == data);//返回true
console.log(vm.$el);//<ul>...<ul>

vm.$watch("foo",function(newValue,oldValue){
    console.log(newValue,oldValue);//输出 "excellent" "hello"
});
vm.foo = "excellent";
  • vm.$data
    data指向同一引用,所以vm.$data===data返回true
  • vm.$el
    vue实例挂载的DOM
  • vm.$watch()
    vm.$watch("foo",fn),即监控vm.foo,一旦有变化,就会触发函数fn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值