初识vue及vue响应式原理

前端框架和Vue简介

为什么要有框架?

C/S架构软件 → B/S架构软件

大约2012年之前,client 客户端 / server软件,安装exe软件

大约2012年之后,browser 浏览器 / server软件
在这里插入图片描述
在这里插入图片描述

所以前端框架应运而生。

Vue这样的框架,最最擅长的就是B端的开发,生而为开发B/S架构软件。

框架发展历史

2009年,Angular诞生,Google开发的,国内用的非常非常少;

2012年,React诞生,Facebook开发的,国内20%市场份额;

2014年,Vue诞生,尤雨溪开发的,国内80%市场份额。

Vue简介

Vue作者:尤雨溪
Vue官网:http://cn.vuejs.org
在这里插入图片描述

Vue是一个渐进式的前端开发框架。

  • 渐进式(Progressive):循序渐进,可大可小,可繁可简,随意取用。

  • 框架(framework):有自己的世界观、方法论,独特的API、语法、使用技巧。基于javascript脚本语言,进行一系列的封装,制定了一系列的规范,开发人员遵循规范,帮助我们提高开发效率。框架更大,Angular是框架、React是框架、Vue是框架。库、包(library)更小,jQuery是库、swiper是库。

Vue框架编程风格:

  • 数据驱动:数据变化了,视图自动变化。我们必须要花精力操作DOM,不需要花精力考虑视图如何更改,只需要关注数据。数据变化了,Vue会帮我们完成视图的变化。比如有一个数组,我们写了循环创建了li标签,当数组中多了一项,新的li标签自动创建。

  • 声明式

    原来的DOM编程叫做命令式:

    **.起立()
    

    Vue叫做声明式:

    <** 起立="a==5" 睡觉="a % 2 == 1" />
    <button @click="a=5">让**起立</button>
    

​ 声明式就是把这个HTML元素对数据有什么反应,明明白白的声明到HTML标签身上,一目了然。

  • 组件化:分页条、日期范围条、弹出层等等都可以被大量复用,所以就要封装为组件。

Vue版本

  • Vue2(目前主流,2023年年底就不维护了)
  • Vue3(2023年开始会逐步取代Vue2,它的语法兼容Vue2)

初体验vue

在这里插入图片描述

最震撼人心的不是语法,而是声明式、数据驱动的编程风格。

数据驱动指的是:只关心数据,不关心视图。Vue帮我们自动更新视图。

Vue学习的五个模块

在这里插入图片描述

Vue从设计角度来讲,虽然能够涵盖这张图上所有的东西,但是你并不需要一上手就把所有东西全用上,都是可选的。

声明式渲染和组件系统是Vue的核心库所包含内容。

而路由(Vue-Router)、状态管理(Vuex或者pinia)、构建工具(webpack/vite)都有专门解决方案。这些解决方案相互独立,我们可以在核心的基础上任意选用其他的部件(以插件形势使用),不一定要全部整合在一起。

Vue全家桶:Vue、Vue-Router、Vuex(或者pinia)、webpack(或者vite)、vue-lazyload……

MVVM模式

  • Model:数据模型,指的是后端传递的数据。

  • View:视图,将Model的数据以某种方式展示出来。

  • ViewModel:视图模型,数据的双向绑定(当Model中的数据发生改变时View就感知到,当View中的数据发生变化时Model也能感知到),是MVVM模式的核心。ViewModel 层把 Model 层和 View 层的数据同步自动化了,解决了 MVP 框架中数据同步比较麻烦的问题,不仅减轻了 ViewModel 层的压力,同时使得数据处理更加方便——只需告诉 View 层展示的数据是 Model 层中的哪一部分即可。

在这里插入图片描述

响应式原理

vue2的defineProperty

当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter

这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。

// 如何知道一个对象的属性值发生变化了?
// JavaScript提供了原生的能力,数据劫持
// 方法1:Object.defineProperty()。就是Vue2的底层原理。
// 方法2:Proxy代理,ES6新增的技术。就是Vue3的底层原理。

// 现在演示方法1:Object.defineProperty()
let obj = {
    a: 123
};

// 让a变为响应式的
defineReactive(obj, 'a');

// 让数据变为响应式
function defineReactive(obj, keyname) {
    let temp = obj[keyname];
    // 数据劫持
    Object.defineProperty(obj, 'a', {
        // getter
        get: function() {
            console.log('试图读取');
            return temp;
        },
        // setter
        set: function(v){
            console.log('试图设置');
            temp = v;
        }
    });
}

vue3的Proxy

vue 3是通过proxy直接代理整个对象来实现的,而不是像Object.defineProperty针对某个属性。所以,只需做一层代理就可以监听同级结构下的所有属性变化,包括新增属性和删除属性。

// 现在演示Proxy代理,是Vue3的底层
let obj = {
    a: 123
};

obj2 = new Proxy(obj, {
    // getter
    get(target, keyname) {
        console.log('getter');
        return target[keyname];
    },
    // setter
    set(target, keyname, v) {
        console.log('setter');
        target[keyname] = v;
    }
});

Proxy非常好用,可以直接侦测到对象的所有属性、属性的属性变化。但是Object.defineProperty()是不行的。小思考题:递归实现Object.defineProperty()。能够检测所有属性变化、属性的属性的变化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值