var vm = new Vue({
el: ".container", // 挂载点
data: {}, // 数据决定了页面的样子 | 数据的响应式 => 数据变了界面跟着变
computed: {}, // 计算属性,惰性求值的依赖者,存在缓存
})
- 在Vue单例中,一般会把整个页面交给Vue来控制。
- new Vue()中的data为啥可以是对象,因为其不会被复用
- 依赖,指的是
谁
使用到了这个属性,需要在get方法收集依赖。 - get函数运行时,依赖收集,记录是哪个函数在用我,创建内置数组(元素唯一)存放使用属性的函数。
- set函数执行时,派发更新,运行执行用我的函数,遍历内置数组执行里面的函数。
- 如何知道谁用到这个属性呢,在全局定义了一个属性,开始的时候也就是使用属性的时候,触发了get方法,往内置数组funcs加入更新函数func,当重新赋值的时候则遍历数组执行更新函数。
index.html
<!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>
<link rel="stylesheet" href="./index.css" />
</head>
<body>
<div class="card">
<p id="firstName"></p>
<p id="lastName"></p>
<p id="age"></p>
</div>
<input type="text" oninput="user.name = this.value" />
<input type="date" onchange="user.birth = this.value" />
<script src="./euv.js"></script>
<script src="./index.js"></script>
</body>
</html>
index.css
.card {
width: 300px;
border: 2px solid rgb(74, 125, 142);
border-radius: 10px;
font-size: 2em;
padding: 0 20px;
margin: 0 auto;
background: lightblue;
color: #333;
}
index.js
var user = {
name: "王小明",
birth: "2000-1-1",
};
observe(user); // 观察
// 显示姓氏
function showFirstName() {
document.querySelector("#firstName").textContent = "姓:" + user.name[0];
}
// 显示名字
function showLastName() {
document.querySelector("#lastName").textContent = "名:" + user.name.slice(1);
}
// 显示年龄
function showAge() {
var birthday = new Date(user.birth);
var today = new Date();
today.setHours(0), today.setMinutes(0), today.setMilliseconds(0);
thisYearBirthday = new Date(
today.getFullYear(),
birthday.getMonth(),
birthday.getDate()
);
var age = today.getFullYear() - birthday.getFullYear();
if (today.getTime() < thisYearBirthday.getTime()) {
age--;
}
document.querySelector("#age").textContent = "年龄:" + age;
}
autorun(showFirstName);
autorun(showLastName);
autorun(showAge);
euv.js
/**
* 观察某个对象的所有属性
* @param {Object} obj
*/
function observe(obj) {
for (const key in obj) {
let internalValue = obj[key];
let funcs = [];
Object.defineProperty(obj, key, {
get: function () {
// 依赖收集,记录:是哪个函数在用我
if (window.__func && !funcs.includes(window.__func)) {
funcs.push(window.__func);
}
return internalValue;
},
set: function (val) {
internalValue = val;
// 派发更新,运行:执行用我的函数
for (var i = 0; i < funcs.length; i++) {
funcs[i]();
}
},
});
}
}
/**
* 执行autorun函数的时候先把目标函数fn添加到window的__func属性中
* 执行目标函数的时候,触发了get函数,将目标函数添加到内置数组funcs里面
* 当data中的变量进行赋值的时候,触发了set函数,运行内部数组funcs里面的目标函数fn
* 至此简易的数据响应式便实现了。
*/
function autorun(fn) {
window.__func = fn;
fn();
window.__func = null;
}
标签:funcs,function,Vue,函数,js,window,func,脚手架,today
From: https://www.cnblogs.com/crispyChicken/p/17202919.html