vue3双向数据绑定原理_demo
- <!DOCTYPE html>
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
- <meta http-equiv="X-UA-Compatible" content="ie=edge" />
- <title>proxyVue</title>
- <style>
- #app {
- margin: 100px auto 0 auto;
- width: 300px;
- }
- #btn {
- margin: 10px auto;
- }
- </style>
- </head>
- <body>
- <div id="app">
- <input type="text" v-model="num" />
- <input id="btn" type="button" value="添加到Todolist" v-click="addList" /><br />
- <span>您输入的是:</span><span v-bind="num"></span><span>{{num}}</span>
- <ul id="list"></ul>
- </div>
- </body>
- <script>
- class proxyVue {
- constructor(options) {
- this.$options = options || {};
- this.$methods = this._methods = this.$options.methods;
- const data = (this._data = this.$options.data);
- this.subscribe = {};
- this.observe(data);
- this.compile(options.el);
- }
- publish(watcher) {
- if (!this.subscribe[watcher.property])
- this.subscribe[watcher.property] = [];
- this.subscribe[watcher.property].push(watcher);
- }
- observe(data) {
- const that = this;
- let handler = {
- get(target, property) {
- return target[property];
- },
- set(target, property, value) {
- let res = Reflect.set(target, property, value);
- that.subscribe[property].map(item => {
- item.update();
- });
- return res;
- }
- };
- this.$data = new Proxy(data, handler);
- }
- compile(el) {
- const nodes = Array.prototype.slice.call(
- document.querySelector(el).children
- );
- let data = this.$data;
- nodes.map(node => {
- if (node.children.length > 0) this._complie(node);
- if (node.hasAttribute("v-bind")) {
- let property = node.getAttribute("v-bind");
- this.publish(new Watcher(node, "innerHTML", data, property));
- }
- if (node.hasAttribute("v-model")) {
- let property = node.getAttribute("v-model");
- this.publish(new Watcher(node, "value", data, property));
- node.addEventListener("input", () => {
- data[property] = node.value;
- });
- }
- /**
- self ...
- */
- if (/\{\{(.*?)\}\}/.test(node.innerHTML)) {
- let ret = /\{\{(.*?)\}\}/.exec(node.innerHTML)
- let property = ret[1];
- this.publish(new Watcher(node, "innerHTML", data, property));
- }
- // self end
- if (node.hasAttribute("v-click")) {
- let methodName = node.getAttribute("v-click");
- let mothod = this.$methods[methodName].bind(data);
- node.addEventListener("click", mothod);
- }
- });
- }
- }
- class Watcher {
- constructor(node, attr, data, property) {
- this.node = node;
- this.attr = attr;
- this.data = data;
- this.property = property;
- }
- update() {
- this.node[this.attr] = this.data[this.property];
- }
- }
- // 渲染todolist列表
- const Render = {
- // 初始化
- init: function (arr) {
- const fragment = document.createDocumentFragment();
- for (let i = 0; i < arr.length; i++) {
- const li = document.createElement("li");
- li.textContent = arr[i];
- fragment.appendChild(li);
- }
- list.appendChild(fragment);
- },
- addList: function (val) {
- const li = document.createElement("li");
- li.textContent = val;
- list.appendChild(li);
- }
- };
- // 实例化一个proxyVue
- window.onload = function () {
- let vm = new proxyVue({
- el: "#app",
- data: {
- num: 0,
- arr: []
- },
- methods: {
- addList() {
- this.arr.push(this.num);
- // Render.addList(this.num);
- }
- }
- });
- };
- </script>
- </html>
vue3双向数据绑定原理_demo的更多相关文章
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- vue的双向数据绑定原理
原理. vue是采用数据劫持结合发布者-订阅者模式的方式, 通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回 ...
- 深入vue源码,了解vue的双向数据绑定原理
大家都知道vue是一种MVVM开发模式,数据驱动视图的前端框架,并且内部已经实现了双向数据绑定,那么双向数据绑定是怎么实现的呢? 先手动撸一个最最最简单的双向数据绑定 <div> < ...
- Vue双向数据绑定原理深度解析
首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...
- Vue双向数据绑定原理分析(转)
add by zhj: 目前组里使用的是前端技术是jQuery + Bootstrap,后端使用的Django,Flask等,模板是在后端渲染的.前后端没有分离,这种做法有几个缺点 1. 模板一般是由 ...
- 手写MVVM框架 之vue双向数据绑定原理剖析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 16、前端知识点--Object.defineProperty 的用法+双向数据绑定原理解析
一.Object.defineProperty 的用法 Object.defineProperty 可以用于给对象添加更新属性. <script> // Object.defineProp ...
- Vue双向数据绑定原理解析
基本原理 Vue.采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调 ...
- Vue的双向数据绑定原理是什么?
vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调. ...
随机推荐
- kubeadm方式搭建K8S集群
一.kubeadm介绍 二.安装要求 三.集群规划 四.环境初始化(在每个服务器节点操作) 1.关闭防火墙 2.关闭selinux 3.关闭swap 4.根据规划设置主机名 5.在Master添加ho ...
- 测试开发【提测平台】分享9-DBUntils优化数据连接&实现应用搜索和分页功能
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 从本期开始知识点讲以思维导图的形式给出,内容点会按照讲解-应用-展示的形式体现,这样会更清晰些. DBUntils连接池 在项目中链接数据 ...
- 判断input radio选中那个
var _sex=$("input[name='sex']:checked").val(); if(_sex==null){ layer.msg("请选择性别" ...
- vue从mock数据过渡到使用后台接口
说明: 最近在搭建一个前端使用vue-element-admin,后端使用springBoot的项目. 由于vue-element-admin使用的是mock的模拟数据跑起来的项目,所以在开发过程中难 ...
- RSA及其证明 [原创]
描述RSA的实现步骤介绍文章非常多,但说明并证明其原理,并进而讨论为什么这样设计的文章不多.本人才疏学浅,不敢说理解了R.S.A.三位泰斗的设计初衷,简单就自己的理解写一写,博大家一笑. 以下原创内容 ...
- linux下分卷压缩,合并解压的3种方法
我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...
- 面试官:MySQL的幻读是怎么被解决的?
大家好,我是小林. 我之前写过一篇数据库事务的文章「 事务.事务隔离级别和MVCC」,这篇我说过什么是幻读. 在这里插入图片描述 然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别 ...
- easyx实现小球移动
easyx是一个针对VC++编译器的图形化插件.使用它,可以使得在C++中编写图形程序. 小球移动代码: #include"stdafx.h" #include<graphi ...
- CSS linear-gradient() 函数
用于背景颜色渐变或画线条等场景 linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片. 创建一个线性渐变,需要指定两种颜色,还可以实现不同方向(指定为一个角度)的渐变效 ...
- Shell系列(2)- 脚本执行方式
创建shell脚本 [root@localhost sh]# vim hello.sh shell脚本必须用.sh,同时方便文件管理 #!/bin/bash:shell文件第一行必须是这个,声明这个 ...