下面这里是我自己写的一个小型的vue,原理就是proxy:

//Proxy天生没有prototype,因此要加上,不然extends会报错
Proxy.prototype = Proxy.prototype || Object.prototype class myVue extends Proxy {
constructor(options) {
let data = options.data || {} super(data, {
get(target, name, proxy) {
if(name in target) {
return target[name]
} else {
throw new Error(`不存在data'${name}'`)
}
},
set(target, name, value, proxy) {
target[name] = value
_container.render()
}
})
// 不能够在constructor里面设置data的值,因此公共变量只能在constructor里面定义,通过函数调用传递
// this.$el = document.querySelector(options.el) //data被类本身代理,而其他options经过初步处理后我们保存在一个变量对象_container中
let _container = {}
window.onload = function() {
_container.data = data
_container.el = document.querySelector(options.el)
_container.oldEl = document.querySelector(options.el).cloneNode(true)
_container.methods = options.methods || {}
//特殊地我们需要一个重新渲染el的内部方法也要存在_container里面
//绑定_container本身是为了render函数能够使用存在_container里面的options的内容
_container.render = render.bind(_container)
_container.render()
}
}
//get只能get到data对象里面的值,所以在内部定义的函数也没办法用
// zzz(){
// alert(123)
// }
} function render() {
let _computer = (e) => {
let val = ''
with(this.data){
val = eval(e)
}
return val
} //先把dom上的替换成“备份”
this.el.parentNode.replaceChild(this.oldEl, this.el);
//"备份"切换到this.el上等待被渲染
this.el = this.oldEl
//再复制一份留“备份”
this.oldEl = this.oldEl.cloneNode(true) //处理花括号
this.el.innerHTML = this.el.innerHTML.replace(/\{\{[^\{\}]+\}\}/, (str) =>{
let e = str.substring(2,str.length-2)
return _computer(e)
}) //处理:属性
let nodes = this.el.getElementsByTagName('*')
Array.from(nodes).forEach(node => {
Array.from(node.attributes).forEach(attr => {
if(attr.nodeName.startsWith(':')){
node.setAttribute(attr.nodeName.substring(1),_computer(attr.value))
node.removeAttribute(attr.nodeName)
} else if (attr.nodeName.startsWith('@')) {
if(!this.methods[attr.value]) {
throw new Error(`methods里面没有方法'${attr.value}'`)
}
node.addEventListener(attr.nodeName.substring(1),function(){
this.methods[attr.value]()
}.bind(this),false)
node.removeAttribute(attr.nodeName)
}
})
})
}

对应调用的HTML:

<!DOCTYPE html>
<html>
<head>
<title>myVue</title>
<script src="my-vue.js"></script>
<script>
let vm = new myVue({
el: '#app',
data: {
aaa: 123,
bbb: '你好啊,张啊咩'
},
methods:{
sayHello() {
alert('hello')
}
}
})
console.log(vm.aaa)
</script>
</head>
<body>
<div id="app">
{{aaa}}
<span :title="bbb" @click="sayHello">
hahaha
</span>
</div>
</body>
</html>

自己写的一个Vue的更多相关文章

  1. 如何写好一个vue组件,老夫的一年经验全在这了【转】 v-bind="$attrs" 和 v-on="$listeners"

    如何写好一个vue组件,老夫的一年经验全在这了 一个适用性良好的组件,一种是可配置项很多,另一种就是容易覆写,从而扩展功能 Vue 组件的 API 来自三部分——prop.事件和插槽: prop 允许 ...

  2. VUE -- 如何快速的写出一个Vue的icon组件?

    伴随着Vue的诞生,它似乎就被人寄予厚望,不仅仅是因为其轻量级的MVVM设计方式,而且其实现了组件化开发模式,所以越来越多的人会拿Vue和AngularJS.React Native做比较.具体关于它 ...

  3. 写了一个vue+antdv的后台管理模板

    1,项目简介 写在前面===>这是一个vue+antdv的后台管理模板 项目地址: https://github.com/BaiFangZi/vue-antd-manage 1.1,概述 ​ 最 ...

  4. 写一个vue组件

    写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件 ...

  5. 如何优雅的写一个Vue 的弹框

    写Vue或者是react 都会遇见弹框的问题.也尝试了多种办法来写弹框,一直都不太满意,今天特地看了一下 Element UI 的源码,模仿着写了一个简易版. 大概有一下几个问题: 1.弹框的层级问题 ...

  6. vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交

    vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象 ...

  7. 用vue.js写的一个瀑布流的组件

    用vue.js写的一个瀑布流的组件:https://segmentfault.com/a/1190000010741319 https://www.jianshu.com/p/db3cadc03402

  8. 使用 vue 仿写的一个购物商城

    在学习了 vue 之后,决定做一个小练习,仿写了一个有关购物商城的小项目.下面就对项目做一个简单的介绍. 项目源码: github 项目的目录结构 -assets 与项目有关的静态资源,包括 css, ...

  9. 一个 Vue + Node + MongoDB 博客系统

    源码 耗时半载(半个月)的大项目终于完成了.这是一个博客系统,使用 Vue 做前端框架,Node + express 做后端,数据库使用的是 MongoDB.实现了用户注册.用户登录.博客管理(文章的 ...

随机推荐

  1. TMS320VC5509片内ADC采集

    1. ADC采集比较简单,内部的10位的ADC,AIN0-AIN3的输入,主要是用的CSL的库函数#include <csl_adc.h> ; Uint16 samplestoraage[ ...

  2. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI

    目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...

  3. R绘图 第四篇:绘制箱图(ggplot2)

    箱线图通过绘制观测数据的五数总括,即最小值.下四分位数.中位数.上四分位数以及最大值,描述了变量值的分布情况.箱线图能够显示出离群点(outlier),离群点也叫做异常值,通过箱线图能够很容易识别出数 ...

  4. 13、通过Docker-compose快速搭建Wordpress

    一.compose定义 以下定义摘自docker官网:https://docs.docker.com/compose/overview/ Compose is a tool for defining ...

  5. stl源码剖析 详细学习笔记 算法(3)

    //---------------------------15/03/30---------------------------- //min_element template<class Fo ...

  6. lambda表达式,map函数

    lambda只是一个表达式,不需要定义函数,故也是匿名函数,用法为:lambda 参数:表达式. x=5 list1=[2,3,4] list2=[10,20,30] s=lambda x:x**3 ...

  7. Alpha Version Release Of Teamwork: Appendix 1 BUG BASH

    在为期一周的发布周中,我们将app本身最后的细节完善,功能代码到位,UI不断改进和优化,团队在开始准备发布之前,对整个APP进行了一次BUG检查,每个人都部署了app在自己的android设备上进行测 ...

  8. 2-Fifteenth Scrum Meeting-20151215

    任务安排 成员 今日完成 明日任务 闫昊 修复bug  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码  编写与服务器交互的代码 史烨轩 获取视频url   余帆 修复bug  本地路径的 ...

  9. Linux内核分析(第四周)

    扒开系统调用的三层皮(上) 一.用户态.内核态.中断 (上周课件有学习到) 1.地址空间是一个显著的标志(是逻辑地址,不是物理地址) 2.CPU每条指令的读取都是通过cs:eip这两个寄存器:0xc0 ...

  10. [CB]Intel 2018架构日详解:新CPU&新GPU齐公布 牙膏时代有望明年结束

    Intel 2018架构日详解:新CPU&新GPU齐公布 牙膏时代有望明年结束 北京时间12月12日晚,Intel在圣克拉拉举办了架构日活动.在五个小时的演讲中,Intel揭开了2021年CP ...