Vue单项数据绑定绑定原理简单实现
2023-06-13 09:12:14 时间
单项数据绑定
在Vue中Model(data)会绑定到View(html),当我们修改Model时,我们不需要手动操作DOM元素,即可实现数据的自动更新 如下演示
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script type="text/javascript" src='./vue-2.4.0.js'></script>
<title>Document</title>
</head>
<body>
<div id='app'>
<p>年龄:{{age}}</p>
</div>
<script type="text/javascript">
let vm = new Vue({
el:'#app',
data:{
"age":19
}
})
</script>
</body>
</html>
页面显示如下
当修改data时页面自动更新
data:{
"age":20
}
//年龄:20
在代码内部修改我们还能理解,奇怪的是我们在控制台修改data居然也能完成自动更新
他是如何做到的? 方便理解我们通过代码简单的实现其原理 1.新键如下结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id='app'>
<p>年龄:{{age}}</p>
</div>
</body>
</html>
2.获取根元素节点 let el=document.getElementById('app');
接下来我们如何在data修改的时候自动更新HTML? 首先保存之前的HTML方便后面自动渲染 let template = el.innerHTML
接下来数据自动更新的重点来了Proxy对象
Proxy的英译是代理,通过Proxy我们可以将真正的数据对象隐藏起来,当我们修改数据对象时其实是修改的代理对象 所以我们得有一个真正的数据对象
let _data={"age":19};
其次创建一个代理对象 该对象接收两个参数第一个是真正的数据对象,第二个为执行各种操作时代理的行为。如set,get等等。
let data = new Proxy(_data,{
set(obj,name,value){
obj:真实的数据对象
name:设置的属性
value:设置的值
//当设置数据时执行的操作
}
})
我们尝试修改data值,弹出警告框
let data = new Proxy(_data,{
set(obj,name,value){
alert('你尝试修改数据!')
}
})
data.age=99;
有了set的方法我们就可以在数据发生改变时,我们就可以进行各种操作了如实现数据自动更新
set(obj,name,value){
// alert('你尝试修改数据!')
obj[name]=value;//当修改对象值时,同步到原对象
}
接下来我们编写渲染页面函数,当页面加载和数据发生改变时进行页面渲染
function render(){
el.innerHTML=template.replace(/\{\{\w+\}\}/g,str=>{
str=str.substring(2,str.length-2);//将{{age}}替换为age
return _data[str];//将{{age}}替换为 _data[age]
})
}
在页面加载和数据改变时应用render() 完整代码
let el=document.getElementById('app');
let template = el.innerHTML;
let _data={"age":19};
let data = new Proxy(_data,{
set(obj,name,value){
// alert('你尝试修改数据!')
obj[name]=value;//当修改对象值时,同步到原对象
render();//数据发生改变重新渲染页面
}
})
render();//页面初始渲染
// data.age=99;
function render(){
el.innerHTML=template.replace(/\{\{\w+\}\}/g,str=>{
str=str.substring(2,str.length-2);//将{{age}}替换为age
return _data[str];
})
}
相关文章
- Java项目毕业设计:基于springboot+vue的电影视频网站系统「建议收藏」
- Vue专题 05_详解vue生命周期的每个节点
- 一比一手写迷你版vue,彻底搞懂vue运行机制
- vue 加载页面时触发时间_Vue 刷新页面时会触发事件吗「建议收藏」
- [ Vue ] vue 设计原理之响应式系统实现笔记( 二 )
- 一篇文章,Vue快速入门!!!
- Vue中显示img图片,显示不出来怎么办?vue显示图片
- VUE 如何将父组件中的数据传递到子组件中
- VUE v-for 数据引用
- Vue笔记(10) vue-router
- vue cdn引入 页面加载时出现模版渲染问题
- vue子组件给父组件传值 接收不到数据_vue父向子组件传值
- vue的双向绑定原理及实现_vue绑定数据
- 我都学会Vue了,还不行吗?前端的水还得要多深
- vue的双向绑定原理及实现_vue的数据绑定怎么实现
- vue formdata请求_vue修改数据没有渲染到页面的原因
- vue的双向绑定原理及实现_vue双向绑定指令
- Vue(renren-fast_vue_master)项目目录结构[通俗易懂]
- vue实战-深入响应式数据原理_2023-03-01
- 每日一题之Vue数据劫持原理
- k8sailor - 08 使用 vue 获取后台 API 数据并展示
- Vue + SpreadJS 实现高性能数据展示与分析
- 后端人眼中的Vue(一)
- vue.js入门篇之Vue.js 样式绑定
- Vue数据双向绑定原理及简单实现详解编程语言
- Vue抢跑Redis速度感受实时重磅数据(vue获取redis)
- Vue快速连接Redis实现数据存储(vue 直连redis)
- 优化网站性能,Vue搭配Redis缓存更加有效(vue使用redis缓存)