Open MandyJin opened 6 years ago
双向绑定概念其实很简单,就是视图(View)的变化能实时让数据模型(Model)发生变化,而数据的变化也能实时更新到视图层
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>双向数据绑定</title>
</head>
<body>
<input id="input" type="text" value="">
<p id="p"></p>
</body>
</html>
<script type="text/javascript">
let obj={};
let temp={};
//在console更改obj.name 来监听并更改视图
Object.defineProperty(obj,"name",{
get(){
//只要获取这个对象obj的属性name就会触发这个函数,并且会拦截
//获取 obj.name
//这个函数返回什么 获取的值就是什么
return temp["name"] ;
},
set(val){
//只要是给obj.name设置值就会触发这函数,并且拦截
//默认给set传一个参数就是设置的值
temp.name=val;
input.value=val;
p.innerHTML=val;
}
});
//Module变化通知View,View再更新Module
input.oninput=function () {
//当正在输入的时候触发的事件;
obj.name=this.value;
p.innerHTML=this.value
};
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>双向数据绑定</title>
</head>
<body>
<input type="text" id="input">
<p id="p1">
</p>
</body>
</html>
<script type="text/javascript">
//es6 中的一个构造函数 Proxy
let temp={name:"你好"};
let p=new Proxy(temp,{
get(temp,key,p){
//默认传3个参数
//temp:代理的原对象
//key:获取属性
//p:当前实例
//通过 p.属性/p["属性"] 获取值的时候被他拦截
return temp[key]
},
set(temp,key,val,p){
//四个参数
//val 设置的属性值
//通过 p.属性/p["属性"]=值的时候 被他拦截
temp[key]=val;
input.value=val;
}
});
input.addEventListener("input",function () {
p.name=this.value;
p1.innerHTML=p.name;
});
</script>
v-if v-show 都是根据里面的数据(变成布尔值)的值控制显示和隐藏的 v-if 控制的是DOM v-show 控制的是样式 display:none
如果频繁的切换显示隐藏使用v-show性能好点
vue中自定义的一个标签表示组件,可以起包裹作用 v-if操作DOM元素,直接将标签干掉 v-show操作样式对于这个template标签不起作用