Vue3 | 双向绑定 及其 多种指令、修饰符的实践
完整原文地址见简书https://www.jianshu.com/p/7418a4246478
更多完整Vue笔记目录敬请见《前端 Web 笔记 汇总目录(Updating)》
本文内容提要
v-model
双向绑定【input例】
v-model
双向绑定【textarea例】
v-model
双向绑定【CheckBox例】使用
true-value
和false-value
自定义checkbox的布尔绑定值
v-model
双向绑定【CheckBox例(升级版)】
v-model
双向绑定【radio例】
v-model
双向绑定【select(单选)例】
v-model
双向绑定【select(多选)例】使用
v-for
优化以上代码,实现同样效果点击UI存储对应数据结构 的技巧
v-model
的.lazy
修饰符【input例】
v-model
的.number
修饰符【input例】
v-model
的.trim
修饰符【input例】
v-model
双向绑定【input例】
如下代码,input的内容 与 testString
字段的数据 双向绑定,
文本显示了 testString
字段的数据的内容,
此时,
手动改动 testString
字段的值,
input的内容会跟着改变;
手动输入改变input的内容,
testString
字段的值也会跟着改变(体现在{{testString}}
这里);
所谓 双向绑定:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World! heheheheheheda</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="heheApp"></div>
</body>
<script>
const app = Vue.createApp({
data() {
return {
testString: 'luelueluelalala'
}
},
template: `
<div>
{{testString}}
<input v-model="testString">
</div>`
});
const vm = app.mount('#heheApp');
</script>
</html>
手动改动 testString字段的值,input的内容会跟着改变;
手动改变input的内容,
testString字段的值也会跟着改变
v-model
双向绑定【textarea例】
<script>
const app = Vue.createApp({
data() {
return {
testString: 'luelueluelalala'
}
},
template: `
<div>
{{testString}}
<textarea v-model="testString" />
</div>`
});
const vm = app.mount('#heheApp');
</script>
效果:
v-model
双向绑定【CheckBox例】
<script>
const app = Vue.createApp({
data() {
return {
testString: false
}
},
template: `
<div>
{{testString}}
<input type="checkbox" v-model="testString" />
</div>`
});
const vm = app.mount('#heheApp');
</script>
运行效果:
勾选:
使用true-value
和false-value
自定义checkbox的布尔绑定值
true-value
定义的值覆盖checkbox的true
,
false-value
定义的值覆盖checkbox的false
,
即当checkbox的值为true-value
定义的字符串时,
checkbox显示为选中状态,
false-value
时为不选中状态:
注意这里是用字符串做值,有双引号包裹;
原始的布尔值,没有字符串包裹;
<script>
const app = Vue.createApp({
data() {
return {
testString: "lueluelue"
}
},
template: `
<div>
{{testString}} <br>
<input type="checkbox" v-model="testString"
true-value="heheda" false-value="lueluelue">
</div>`
});
const vm = app.mount('#heheApp');
</script>
效果:
v-model
双向绑定【CheckBox例(升级版)】
给CheckBox组件
配置value
属性,
使用v-model
将CheckBox组件
与一个数组
双向绑定,
当CheckBox组件
被勾选时,
勾选到的CheckBox组件
的value属性值
会加到其对应绑定的v-model
数组字段中:
<script>
const app = Vue.createApp({
data() {
return {
testString: [],
checkboxValue1: "heheda",
checkboxValue2: "lueluelue",
checkboxValue3: "xixixi"
}
},
template: `
<div>
{{testString}} <br>
{{checkboxValue1}} <input type="checkbox" v-model="testString" :value="checkboxValue1" /><br>
{{checkboxValue2}} <input type="checkbox" v-model="testString" :value="checkboxValue2" /><br>
{{checkboxValue3}} <input type="checkbox" v-model="testString" :value="checkboxValue3" />
</div>`
});
const vm = app.mount('#heheApp');
</script>
运行效果:
v-model
双向绑定【radio例】
区分一下这个内容:
CheckBox
可以多选
,选中数据可以用数组
存储;
radio
只能单选
,选中数据 按逻辑应用 一个变量字段
存储;
<script>
const app = Vue.createApp({
data() {
return {
testString: '',
checkboxValue1: "heheda",
checkboxValue2: "lueluelue",
checkboxValue3: "xixixi"
}
},
template: `
<div>
{{testString}} <br>
{{checkboxValue1}} <input type="radio" v-model="testString" :value="checkboxValue1" /><br>
{{checkboxValue2}} <input type="radio" v-model="testString" :value="checkboxValue2" /><br>
{{checkboxValue3}} <input type="radio" v-model="testString" :value="checkboxValue3" />
</div>`
});
const vm = app.mount('#heheApp');
</script>
v-model
双向绑定【select(单选)例】
<script>
const app = Vue.createApp({
data() {
return {
testString: '',
checkboxValue1: "heheda",
checkboxValue2: "lueluelue",
checkboxValue3: "xixixi"
}
},
template: `
<div>
{{testString}} <br>
<select v-model="testString">
<option disabled value=''>请选择内容</option>
<option :value="checkboxValue1">{{checkboxValue1}}</option>
<option :value="checkboxValue2">{{checkboxValue2}}</option>
<option :value="checkboxValue3">{{checkboxValue3}}</option>
</select>
</div>`
});
const vm = app.mount('#heheApp');
</script>
v-model
双向绑定【select(多选)例】
注意两个地方——数组字段
、multiple
关键字:
<script>
const app = Vue.createApp({
data() {
return {
testString: [],
checkboxValue1: "heheda",
checkboxValue2: "lueluelue",
checkboxValue3: "xixixi"
}
},
template: `
<div>
{{testString}} <br>
<select v-model="testString" multiple>
<option :value="checkboxValue1">{{checkboxValue1}}</option>
<option :value="checkboxValue2">{{checkboxValue2}}</option>
<option :value="checkboxValue3">{{checkboxValue3}}</option>
</select>
</div>`
});
const vm = app.mount('#heheApp');
</script>
效果:
使用v-for
优化以上代码,实现同样效果
<script>
const app = Vue.createApp({
data() {
return {
testString: [],
options:[{
text: 'heheda', value: 'heheda'
},{
text: 'lueluelue', value: 'lueluelue'
},{
text: 'xixixi', value: 'xixixi'
}]
}
},
template: `
<div>
{{testString}} <br>
<select v-model="testString" multiple>
<option v-for="item in options" :value="item.value">{{item.text}}</option>
</select>
</div>`
});
const vm = app.mount('#heheApp');
</script>
点击UI存储对应数据结构 的技巧
<script>
const app = Vue.createApp({
data() {
return {
testString: [],
options:[{
text: 'heheda', value: {value: 'heheda'}
},{
text: 'lueluelue', value: {value: 'lueluelue'}
},{
text: 'xixixi', value: {value: 'xixixi'}
}]
}
},
template: `
<div>
{{testString}} <br>
<select v-model="testString" multiple>
<option v-for="item in options" :value="item.value">{{item.text}}</option>
</select>
</div>`
});
const vm = app.mount('#heheApp');
</script>
效果:
v-model
的.lazy
修饰符【input例】
被.lazy
修饰的v-model
属性,其对应配置的组件,如input,
不再会在往input输入内容时,即时性
地双向同步
数据了,
而是在往input输入内容后,
点击其他组件
或者位置
使得input
失去焦点
时,
再进行双向数据同步
:
这样再某些场景下,可以减少多余的大部分事件的处理,
达到提升性能的效果;
<script>
const app = Vue.createApp({
data() {
return {
testString: "lueluelue"
}
},
template: `
<div>
{{testString}} <br>
<input v-model.lazy="testString">
</div>`
});
const vm = app.mount('#heheApp');
</script>
效果:
没有即时同步:
v-model
的.number
修饰符【input例】
使得输入框
在输入的内容后 通过双向绑定特性
将值存进数据字段
的时候,
会先将值(当然主要是支持数字内容的字符串) 转换成number
类型,
再存进数据字段
:
<script>
const app = Vue.createApp({
data() {
return {
testString: "123"
}
},
template: `
<div>
{{typeof testString}} <br>
<input v-model.number="testString">
</div>`
});
const vm = app.mount('#heheApp');
</script>
运行,初始为String类型,因初始赋值为String类型:
随后,点击输入数字,会转换成number类型:
v-model
的.trim
修饰符【input例】
v-model
的.trim
修饰符,
使得输入框
在输入的内容后 通过双向绑定特性
将值存进数据字段
的时候,
会先将值 的 前后的空格去除(值的中间存在的空格不去除),
再存进数据字段
:
<script>
const app = Vue.createApp({
data() {
return {
testString: "123"
}
},
template: `
<div>
{{testString}} <br>
<input v-model.trim="testString">
</div>`
});
const vm = app.mount('#heheApp');
</script>
加.trim
修饰符之前:
.trim
修饰符之后: