>[warning]vue类的实现
****
还记得Vue应该怎么使用吧? 看最下面代码
代码如下:
~~~
<script>
// 1. 修改观察者, 接收参数
function Watcher(vm, cb, exp) {
this.vm = vm; // 虚拟DOM对象(vue实例对象)
this.cb = cb; // 对应执行的function方法体
this.exp = exp; // 监听哪个属性
this.value = this.get(); // 调用一下下面的get方法, 把watcher对象提交到Dep订阅者中
}
Watcher.prototype = {
// 2. 修改update方法, 触发后把新值回调给new Watcher的地方
update: function() {
// 拿到vue的data中的key对应的value
let value = this.vm.data[this.exp];
// 获取原有的value值
let oldVal = this.value;
if (value !== oldVal) {
// 把新值更新一下
this.value = value;
// 值不同, 则调用Watcher执行, 把新的值传过去
this.cb.call(this.vm, value);
}
},
get: function() {
Dep.target = this;
// 强制执行Object.defineProperty里的get方法, 把观察者添加到Dep订阅者数组中
let value = this.vm.data[this.exp];
Dep.target = null;
return value;
}
};
// 3. 定义Vue类, 接收参数和监听的key (注意暂时这里只能接收一个key)
function Vue (options, exp){
// 获取data对象
this.data = options.data();
// 获取el根节点
let el = document.querySelector(options['el']);
// 触发Observer监听data里所有key
observe(this.data);
// 初始化模板数据的值
el.innerHTML = this.data[exp];
// 实例化Watcher, 传入Vue实例对象, 以及回调函数, 还有要触发监听的key值
// 4. Watcher执行, 更新el节点里的值
new Watcher(this, function(value){
el.innerHTML = value;
}, exp);
// 5. 返回Vue实例对象
return this;
}
</script>
<div id="app">{{userName}}</div>
<script>
// 6. 仿照Vue定义, 传入需要的参数
let app = new Vue({
el: "#app",
data () {
return {
"userName": "hello VueJS"
}
}
}, "userName");
setTimeout(()=>{
app.data.userName = "漂亮";
}, 2000);
// 这时, 我们发现雏形已经出来了, 但是还有点不一样, 但是我们在控制台修改app.data.userName 确实实现了数据的绑定, 页面发生了变化.
</script>
~~~
[当前页源代码](https://github.com/lidongxuwork126com/ldx_vue/tree/master/%E4%BB%BFVue%E6%BA%90%E7%A0%81)
但是我们发现访问data属性必须先.data再.key, 很明显这是不行的, 看下文如何改动
- web前端
- CSS问题
- 布局
- 双飞翼布局_flex方式
- 双飞翼布局_margin方式
- 圣杯布局_flex方式
- 圣杯布局_margin方式
- 子元素居中问题
- 弹性布局
- 概念_
- 标准模式与混杂模式
- 各种FC
- line-height
- vertical-align
- CSS3新特性
- 效果
- div添加箭头
- CSS绘制三角形
- JavaScript
- 兼容
- 事件相关
- 原理
- Ajax原理
- 继承原理
- 原型链继承
- 组合继承
- 寄生组合继承
- 数据绑定
- 1单向数据绑定m到c到v
- 2伪双向数据绑定
- 3双向数据绑定
- socket.io
- 运行时
- this指向
- 0.1+0.2问题
- 对象/数组-深拷贝&浅拷贝
- 事件循环
- typeof
- instanceof
- 概念
- 闭包
- 回调函数
- Promise
- 原生对象
- Attribute和property区别
- 防抖函数
- 节流函数
- 语言类型
- Vue
- Vue优缺点
- 仿Vue源码
- 1数据绑定_Observe
- 2数据绑定_订阅者&观察者定义
- 3数据绑定_Vue类实现
- 4数据绑定_Vue访问data更改
- 5DOM编译_Compile_双大括号模板讲解
- 6DOM编译_v-model讲解
- 7DOM编译_v-on:事件绑定讲解
- 项目总结
- 使用Svg图标
- vueCli环境_真机测试
- vueCli集成环信SDK
- 父子组件双向绑定
- React
- React优缺点
- 我的组件库
- Vue的组件库
- 环信_聊天组件
- 面试题
- HTML_分类
- CSS_分类
- JavaScript_分类
- VueJS_分类
- ReactJS_分类
- AngularJS_分类
- 浏览器端
- 笔试题
- CSS
- 特殊布局
- JavaScript_
- 经典_宏任务_微任务
- 浏览器问题
- CORS
- web服务器
- Apache
- 开启跨域
- Nginx
- 常用命令
- 正向代理
- 反向代理
- 负载均衡
- mac安装Nginx
- 配置80端口
- 算法
- 冒泡排序
- 选择排序
- 合并对象_排序
- 杨辉三角
- 红黑树
- 计算机基础
- 网络相关
- OSI七层模型
- http协议
- http工作原理
- https协议
- GET和POST区别
- hosts文件
- php相关
- session机制
- Linux
- 阿里云服务器
- linux使用Mysql
- 安装mysql
- 导入.sql文件
- 远程连接mysql
- linux使用xampp
- 安装Xampp
- 配置web访问
- 域名绑定服务器
- linux搭建git服务器_apache下
- 代码管理
- 什么是git
- 命令行_使用git
- .gitignore文件讲解
- 软件
- VSCode的安装
- 理财
- 基金
- 摄影