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 ...
随机推荐
- Android应用源码航空订票软件客户端
功能分类:其他 支持平台:Android 运行环境:Android 开发语言:Java 开发工具:Eclipse 源码大小:1.76MB 下载地址:http://w ...
- select * from (XXXXX)[字符]——写法解析
步骤:1.先执行括号里的语句:查询 select id from three ,将查询出来的数据作为一个结果集 取名为 a2.然后 再 select * from a 查询a ,将 结果集a 全部查询 ...
- Oracle-分配用户只读存储过程权限
系统新来了系统运维人员,要求创建数据库账号,只分配对表,视图,存储程序有只读权限 因为表和视图权限接触比较频繁,所以今天花点时间整理下关于存储过程的权限 关于ORACLE账号的权限问题,一般分为两种权 ...
- Canvas 实现钟表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 通过构造器配置Bean
public class Role { private Log id; private String roleName; private String note; public Role(String ...
- leetcode 1122. 数组的相对排序 (python)
1.题目描述 给你两个数组,arr1 和 arr2, arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中 ...
- Vue创建全局组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 自动爬取代理IP例子
import time import json import datetime import threading import requests from lxml import etree from ...
- Unity3D 可空值类型 Nullable
值类型的变量永远不会变null,因为值类型是其本身不会变成null.引用类型可变成null,内存会全部使用0来表示null,因为这种开销会降低,仅仅需要将一块内存清除. 表示一些空值的方案: 1.使用 ...
- Python学习之==>Excel操作
一.简介 使用Python读.写.修改excel分别需要用到xlrd.xlwt以及xlutils模块,这几个模块使用pip安装即可. 二.读excel import xlrd book = xlrd. ...