当前位置:网站首页>6.双向绑定(v-model)的实现
6.双向绑定(v-model)的实现
2022-07-19 05:05:00 【风落不归处】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<h3 v-html="title"></h3>
<input type="text" v-model="title">
</div>
<script>
// 双向绑定
// 数据源 -- 数据源,尽量的扁平化
var data = {
title: '你好',
user: {
name: 1
}
};
// 对于数据进行观察
observe(data);
// 模板的解析
document.querySelectorAll('[v-html]').forEach(node => {
let key = node.getAttribute('v-html')
node.innerHTML = data[key]
});
document.querySelectorAll('[v-model]').forEach(node => {
let key = node.getAttribute('v-model')
node.value = data[key];
node.addEventListener('input', function () {
data[key] = this.value
}, false)
});
/**
* 数据观察 -- 一定要对象,普通数据不进行观察
*/
function observe(target) {
// 类型判断 必须为对象
// if (typeof target === 'object' && target instanceof Object)
// 原型+冒充 [object Object]
// 如果它不是一个对象,则不进行任务的数据代理 -- 在多层代理时,防递归出不去的情况
if (Object.prototype.toString.call(target) != '[object Object]') return;
// 如果是对象则进行数据代理
// Object.defineProperty,它只能代理对象中的属性
// for in / Object.keys().forEach
for (let key in target) {
// 数据对象的属性代理ss
defineReactive(target, key, target[key])
}
}
// 代理
function defineReactive(target, key, value) {
// 递归 --
observe(value)
Object.defineProperty(target, key, {
get() {
console.log('get')
// 获取数据时触发
return value;
},
set(v) {
if (v != value) {
console.log('set')
// 设置数据时会触发
value = v
updateView(value)
}
}
})
}
function updateView(value) {
document.querySelectorAll('[v-html]').forEach(node => {
let key = node.getAttribute('v-html')
node.innerHTML = value
});
}
</script>
</body>
</html>
边栏推荐
- c语言指针重难点
- 指针和数组的相关练习题
- C语言中的文件操作
- Function recursion in C program
- 学习日记5-C语言函数的应用
- Easier to use C language entry-level cheese (1) data types, variables and constants, strings + escape characters + comments (super detailed)
- Dynamic memory request
- Learning diary 4- program structure and control statements
- 用C实现三种版本的通讯录
- 学习日记6-数组
猜你喜欢
随机推荐
Pytorch implements the use of data enhancement classification evaluations
The longest common subsequence of order 2 and order n
66-[重点]v-for指令的key属性
scroll系列
二阶及N阶最长公共子序列
Easier to use C language entry-level cheese (1) data types, variables and constants, strings + escape characters + comments (super detailed)
三角形问题最坏情况测试测试用例
C語言實現通訊錄
数据的表示和运算
我的第一篇博客
Shell Scripting
整型及浮点型数据在内存中的存储
77-全局自定义指令
Implementation of pytorch data enhancement cutmix
进程与线程以及进线程间通信
更易上手的C语言入门级芝士 (1) 数据类型、变量和常量、字符串+转义字符+注释(超详细)
更易上手的C语言入门级芝士 (2) 选择语句+循环语句、函数、数组、操作符(超详细)
Three piece chess game
练习提升C语言-1
Share what you learned this week - detailed explanation of transformer model