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. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  2. Oracle 字符串拼接会出现0自动忽略,解决方案

    解决方案 ,),'||num,num) from table_name 参考:https://blog.csdn.net/menghuannvxia/article/details/73089903

  3. Intellij Idea Spring Boot 热部署

    1. POM 文件添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  4. 解决CsvWriter:中文乱码、末尾行多一行空格(/r)、非第一列空字符串""显示null问题

    一:主要内容 解决CsvWriter存csv,csv文件打开后中文乱码问题 解决CsvWriter存csv,csv文件最后一行总是多一行空行的问题 解决CsvWriter存csv,csv文件不是第一列 ...

  5. POST上传多张图片配合Django接受多张图片

    POST上传多张图片配合Django接受多张图片 本地:POST发送文件,使用的是files参数,将本地的图片以二进制的方式发送给服务器. 在这里 files=[("img",op ...

  6. Vue 项目构建

    一.初始化项目 1.vue init webpack (fileName) 2.项目名称 3.项目描述 4.项目作者 5.是否依赖 .Vue 文件开发 第一个选项可以不依赖 .Vue 文件开发, 第二 ...

  7. 【c++进阶:c++ 顺序容器vector,string,deque,list,forward_list,array常用性质】

    常用5种顺序容器性质: https://blog.csdn.net/oil_you/article/details/82821833 关于deque https://www.cnblogs.com/L ...

  8. VS2010护眼界面(护眼绿)

    工具-->选项 RGB(204.232.207) “选择菜单[工具][导入和导出设置], 在弹出的“导入和导出设置向导”对话框中选择“导入选定的环境设置”, 然后根据自己的实际情况选择“是,保存 ...

  9. RandomAccessFile 文件读写中文乱码解决方案!

    RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么   使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 ...

  10. apache-httpd2.2编译安装

    1.下载源码包 wget http://mirrors.hust.edu.cn/apache/httpd-2.2.32.tar.gz2.解压源码包 tar -zxvf httpd-2.2.32.tar ...