key value vue 输出_手写Vue

1a1d83ff7b8788eea2b0345bc33dd13a.png

欢迎来到前端菜鸟逆袭架构师。

如果你也喜欢前端或从事前端工作的化,可以关注一下我的公众号

?点击上面的“前端菜鸟逆袭架构师”?,进入关注页面,点击一下就可以啦✌️

1 作者简介

  • 一只爱笑的前端菜鸟,梦想成为全栈架构师,为了改变世界?。
  • 欢迎扫码加我微信,让世界充满爱❤️
  • 99281bd24c090967229eee560a8059bc.png

手写vue

MVVM框架

d92afaf3990f6893ecc238d329b3ba9f.png

MVVM框架的三要素:数据响应式、模板引擎及其渲染

数据响应式:监听数据变化并在视图中更新:

  • Object.defineProperty() 

  • Proxy

模版引擎:提供描述视图的模版语法

  • 插值:{ {}}

  • 指令:v-bind,v-on,v-model,v-for,v-if

渲染:如何将模板转换为html

  • 模板 => vdom => dom

数据响应式原理

数据变更能够响应在视图中,就是数据响应式。vue2中利用 Object.defineProperty() 实现变更检测。

9da5e475f7293eed758f9dede5866aaf.png

写下代码

const obj = {}

function defineReactive(obj, key, val) {

          Object.defineProperty(obj, key, {
    

              get() {

              console.log(`get ${
    key}:${
    val}`);              return val						
            },           set(newVal) {
    					
              if (newVal !== val) {
                    console.log(`set ${
    key}:${
    newVal}`);                val = newVal						

                }
            }

          })

    }

    defineReactive(obj, 'foo', 'foo')

    obj.foo
    obj.foo = 'foooooooooooo'

执行上述脚本:node defineProperty.js

执行结果如下:

92750b5cbbb16fd37aea323512ece93a.png

结合一下视图,使上述程序与html联系起来

lang="en">

id="app">
  							
			

update函数是真正的做dom操作的,update执行完更新之后,希望当obj这个数据发生变化之后,是不是能驱动一下界面的更新。在vue中,不希望每次update函数需要自己写,所以有了编译器的诞生。那么,什么是编译器?就是在html中写一些特别的语法。执行一下编译器,编译器就会自动的生成一个更新函数。

遍历需要响应化的对象  

// 对象响应化:遍历每个key,定义getter、setter

function observe(obj) {

  //判断obj类型必须是对象

  if (typeof obj !== 'object' || obj == null) {
        return							
  }  Object.keys(obj).forEach(key => {
    						
    defineReactive(obj, key, obj[key])

})

}

const obj = { foo:'foo',bar:'bar',baz:{ a:1}}

observe(obj)

obj.foo
obj.foo = 'foooooooooooo'

obj.bar
obj.bar = 'barrrrrrrrrrr'

obj.baz.a = 10 // 嵌套对象no ok

执行脚本:node defineProperty.js 执行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值