vue,基于mvvm模式下的一个前端框架

  mvvm模式下简单的实现数据代理,数据劫持

  1.是用Object.defineProperty 实现数据代理

  2.使用发布订阅者模式,配合 Object.defineProperty,实现数据劫持

    数据劫持包括依赖收集和依赖促发

  (只考虑最简单的方式,并且没有包括具体的依赖收集,我模拟的依赖收集,依赖收集得是在模板解析的时候,需要使用正则匹配出vue的一般指令和表达式)

/* 实现一个简易的vue */
class myvue {
constructor (option) {
let _self = this
this._data = option.data
this.proxydata(_self)
/* 使用发布订阅者模式实现数据劫持 */
this.Datahijacking(_self) /* 实现一下模拟依赖收集 */
/* 本身模板解析时,会使用正则去匹配表达式和一般指令
匹配成功的表示是和一般指令都会调用以此数据劫持上的get方法
*/
/* 假知我们传入的就是name 和 age */
this._data.name;
this._data.name;
this._data.name;
this._data.age;
this._data.age;
/* 上面代表模板解析的时候一共调用的三次name 和 两次age */
}
/* 实现vue对_data数据的代理 */
proxydata(_self) {
/* 遍历传入的data的所有属性 */
Object.keys(_self._data).forEach(key=>{
Object.defineProperty(_self,key,{
configurable:true,
enumerable: true,
get () {
return _self._data[key]
},
set (val) {
_self._data[key] = val
}
})
})
}
/* 对_data数据劫持 */
Datahijacking(_self) {
Object.keys(_self._data).forEach(key=>{
let value = _self._data[key]
var dep = new Dep();
Object.defineProperty(_self._data,key,{
configurable:true,
enumerable: true,
get () {
dep.addsubs(dep.id,new watch(key))
return value
},
set (val) {
dep.notify(val)
}
})
})
}
} var uid = 0;
class Dep {
constructor () {
this.id = uid++;
this.handlers = []
}
/* 依赖添加 */
addsubs (id,fn) {
if(!this.handlers[id]) {
this.handlers[id] = []
}
this.handlers[id].push(fn)
}
/* 依赖促发 */
notify (val) {
if(this.handlers) {
this.handlers[this.id].forEach(fn=>{
fn.update(val);
})
}
}
}
/* 具体订阅者 */
class watch {
constructor (name) {
this.name = name
}
update (val) {
/* 模拟试图更新 */
console.log('视图更新了'+val)
}
} let vm = new myvue({data:{
name: 'czklove',
age: '17'
}})
console.log(vm) vm.name = 'czklovel11'

mvvm实现一个简单的vue的更多相关文章

  1. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

  2. 手把手教你从零写一个简单的 VUE

    本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...

  3. 一个简单的 vue.js 实践教程

    https://segmentfault.com/a/1190000006776243?utm_source=tuicool&utm_medium=referral 感觉需要改善的地方有: ( ...

  4. 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定

    前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...

  5. 实现一个简单的Vue插件

    我们先看官方文档对插件的描述 插件通常会为 Vue 添加全局功能.插件的范围没有限制--一般有下面几种: 1.添加全局方法或者属性,如: vue-custom-element 2.添加全局资源:指令/ ...

  6. 一个简单的Vue.js组件开发示例

    //创建属于自己的vue组件库 (function(Vue, undefined) { Vue.component("my-component", { template: '< ...

  7. 记录一个简单的vue页面实现

    <template> <div class="userView"> <!-- 页眉颜色统一 --> <div class="bu ...

  8. VSCode配置简单的vue项目

    VSCode配置简单的vue项目 https://www.cnblogs.com/wnxyz8023/p/9989447.html 由于最近要使用的项目框架为前后端分离的,采用的是vue.js+web ...

  9. 使用VSCode配置简单的vue项目

    由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...

随机推荐

  1. 序列式容器————forward_list

    单链表的形式存储元素.forward_list 的模板定义在头文件 forward_list 中.fdrward_list 和 list 最主要的区别是:它不能反向遍历元素:只能从头到尾遍历. for ...

  2. vue 使用 vue-awesome-swiper (基础版)

    1.0 安装 vue-awesome-swiper(稳定版本 2.6.7) npm install vue-awesome-swiper@2.6.7 --save 2.0 引入配置(全局使用) 2.1 ...

  3. python3学习笔记(三):注释和字符串

    一.注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. # 打印圆的周长: print(2* pi* r) 在python 中用井号(#)表示注释.井号(#) ...

  4. 使用http-server在本地搭建一个HTTP服务器

    安装http-server 在控制台中输入 npm install http-server -g 进行全局安装 共享资源 进入需要共享资源的目录,比如 D:\,然后在控制台中输入 http-serve ...

  5. angular 的跨域处理

    angular 的跨域处理,由于不并不支持跨域处理,所以我们对他也是无可奈何,angular 的跨域处理,需要我们在服务器上进行处理,把请求的数据改成 * ,也就是,谁都可以请求数据: angular ...

  6. bootstrap 讲解(中)

    bootstrap:常用于后台开发,如学生管理系统,虽然稍显笨重,但也是一个开发的利器 推荐下载 3.3.7 版本 也可下载最新版4.3.1 (最新版在手机端不起效果) 且依赖 jQuery 的封装库 ...

  7. virt-manager 使用 shh 远程访问配置方法

    1.下载安装 Xming+Xshell  或者 Xming+putty,启动Xming服务 Xming下载地址 2.XMing的配置:打开XLaunch,记住Display Number,现在这里是0 ...

  8. SQLAlcvchem

    一.安装(稳定版的1.2.17) 二.一般使用(切记切记不要使用模块的名字作为项目名字,否则会出现玄学解决不了的问题------坑) #.导入SQLALchemy from sqlalchemy.ex ...

  9. PushConsumer 消费消息

    CLUSTERING 模式下,消费者会订阅 retry topic // DefaultMQPushConsumerImpl#copySubscription private void copySub ...

  10. java中? extends T 和? super T解析

    转:https://blog.csdn.net/qq_25337221/article/details/81669630 PECS原则 最后看一下什么是PECS(Producer Extends Co ...