作者:se8529106 | 来源:互联网 | 2023-09-17 10:40
v-router的原理
hash的特点
- hash变化会触发网页跳转既浏览器前进、后退
- hash变化不会刷新页面,SPA(单页面应用)必须的特点
- hash永远不会提交到sever端
通过onhashchange监听hash的变化从而触发视图的更新
vue2.0响应式原理(Object.defineProperty)
数据是对象:对每一个对象的属性都通过Object.defineProperty绑定监听(层级深的就递归绑定)
数据是数组(通过重写数组方法的方式来触发页面渲染):将这个数组原型指向一个被重写push,pop,shift,unshift方法的一个对象,这些方法里就可以直接触发页面渲染函数
数组什么操作不会导致页面渲染
示例代码
function updateView() {console.log('视图更新')
}
const oldArrayProperty = Array.prototype
const arrProto = Object.create(oldArrayProperty);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {arrProto[methodName] = function () {updateView() oldArrayProperty[methodName].call(this, ...arguments)}
})
function defineReactive(target, key, value) {observer(value)Object.defineProperty(target, key, {get() {return value},set(newValue) {if (newValue !== value) {observer(newValue)value = newValueupdateView()}}})
}
function observer(target) {if (typeof target !== 'object' || target === null) {return target}if (Array.isArray(target)) {target.__proto__ = arrProto}for (let key in target) {defineReactive(target, key, target[key])}
}
const data = {name: 'zhangsan',age: 20,info: {address: '北京' },nums: [10, 20, 30]
}
observer(data)
data.nums.push(4)