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 ...
随机推荐
- sh_07_continue
sh_07_continue i = 0 while i < 10: # continue 某一条件满足时,不执行后续重复的代码 # i == 3 if i == 3: # 注意:在循环中,如果 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角色 client:调用资源服务器API的应用 O ...
- [CSP-S模拟测试]:邻面合并(状压DP)
题目背景 $NEWorld$作为一个$3D$游戏,对渲染(图形绘制)的效率要求极高.当玩家扩大视野范围时,可见的方块面数量将会迅速增多,以至于大量的顶点处理很快就成为了图形管线中的瓶颈.乔猫想了想,决 ...
- 一个时序图描述从用户在浏览器地址栏输入url并按回车,到浏览器显示相关内容的各个过程
其实考察的就是一次HTTP请求所经过的过程和Spring或者SpringMVC怎么调用dispatcherServlet的过程
- python面向对象之设计模式
概念: 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计 ...
- vue注
1.vue-cli3创建运行项目: vue-cli3可视化创建项目: vue ui vue-cli3创建项目:vue create elementUI(elementUI为项目名称) vue-cli3 ...
- 第四周总结 & 实验报告(二)
第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...
- ubuntu16虚拟机迁移/移动/复制后无法上网
修改grub配置 如果没有网卡,需要配置 sudo vi /etc/default/grub 将 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LI ...
- idea中git回退本地仓库版本
场景:代码commit到本地仓库,还没有push到远程仓库,这时要回退代码. 介绍下Reset Head中三种Reset Type类型: 1.Mixed(默认):它回退到某个版本,本地会保留源码,回退 ...
- application.events 识别组合键 参考。
https://blog.csdn.net/chinayu2007/article/details/43761277 在窗体上放上ApplicationEvents控件,在OnMessage消息中加入 ...