mvvm实现一个简单的vue
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的更多相关文章
- 搭建Vue.js环境,建立一个简单的Vue项目
基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...
- 手把手教你从零写一个简单的 VUE
本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...
- 一个简单的 vue.js 实践教程
https://segmentfault.com/a/1190000006776243?utm_source=tuicool&utm_medium=referral 感觉需要改善的地方有: ( ...
- 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定
前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...
- 实现一个简单的Vue插件
我们先看官方文档对插件的描述 插件通常会为 Vue 添加全局功能.插件的范围没有限制--一般有下面几种: 1.添加全局方法或者属性,如: vue-custom-element 2.添加全局资源:指令/ ...
- 一个简单的Vue.js组件开发示例
//创建属于自己的vue组件库 (function(Vue, undefined) { Vue.component("my-component", { template: '< ...
- 记录一个简单的vue页面实现
<template> <div class="userView"> <!-- 页眉颜色统一 --> <div class="bu ...
- VSCode配置简单的vue项目
VSCode配置简单的vue项目 https://www.cnblogs.com/wnxyz8023/p/9989447.html 由于最近要使用的项目框架为前后端分离的,采用的是vue.js+web ...
- 使用VSCode配置简单的vue项目
由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...
随机推荐
- The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid
使用客户端链接MongoDb报错 The GuidRepresentation for the reader is CSharpLegacy, which requires the binary su ...
- SPOJ 913 Query on a tree II
spoj题面 Time limit 433 ms //spoj的时限都那么奇怪 Memory limit 1572864 kB //1.5个G,疯了 Code length Limit 15000 B ...
- Android系统关机或重启的几种实现方式
前阵子工作上遇到一些关于Android系统关机或重启的系统修改,于是,做了一些尝试,也搜集了一下资料,现在整理一下,做一些总结,方便学习或者日后工作的需要. 默认的SDK并没有提供应用开发者直接的An ...
- Mac item2常用快捷键
记录一下iterm 2 快捷键,用于备忘! 标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:co ...
- Jupiter Code Review Reference -- Jupiter代码审查工具使用参考
Jupiter Code Review Reference -- Jupiter代码审查工具使用参考 (修改版) 原创 2010年07月06日 10:43:00 标签: 审查 / reference ...
- OperationCenter Docker运行环境及其依赖启动脚本
1.Portainer docker rm -f portainer docker run -d -p : --name portainer --restart always portainer/po ...
- Vue知识整理10:条件渲染(v-if v-show)
在Vue中使用v-if等条件实现条件的判断来实现对象的显示. 也可以采用 v-show条件来实现对象的显示.
- RandomAccessFile 文件读写中文乱码解决方案!
RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么 使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 ...
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_07maven常用命令
以给的hellowordl的的代码为例. src/main/java下,这是主业务逻辑代码 里面的内容只有一个jsp的跳转 测试包下: 里面很简单的就输出了一句话 复制项目的目录 先cd进入复制的这个 ...
- python学习之文件读写操作
open函数 在使用文件之前,需要先打开,即使用open函数 如: files=open("文件路径","操作方式") 解释如下: (1.files:为文件对象 ...