目录
双向绑定
1.v-model
2. 双向绑定原理(高频笔试面试)
3. 监视函数
4. 事件修饰符
5. 双向绑定在不同表单元素中的原理
双向绑定
前面的指令和 {{ }} 都是单向绑定,当用户主动在文本框中输入内容后,如果使用:value="str" 方式绑定,用户输入的内容是无法自动回到程序中的变量中保存的。这是因为单向绑定只能将程序中的变量值,自动同步到页面上显示,不能自动将界面中的用户主动做的修改,自动同步回程序中变量里保存。
1.v-model
如果希望在表单元素中自动获得页面中用户主动做的修改时,都要用双向绑定。
双向绑定既能将程序中的变量自动同步到页面上显示,又能将页面上用户主动修改的新值自动更新回程序中的变量保存。
<表单元素 v-model="变量">
举例:使用双向绑定实现点按钮,获得文本框中用户输入的内容;
<body><!--VUE 3步1. 做界面1.1 唯一父元素包裹1.2 找可能发生改变的位置本例中: 文本框的内容(input的value)会由用户修改而改变1.3 找触发事件的元素本例中: 按钮button--><div id="app"><!-- <input id="txt" :value="str"> --><input id="txt" v-model="str"><button @click="search">百度一下</button></div><script>//2. 创建new Vue()对象,监视id为app的区域var vm = new Vue({el: "#app",//3. 创建模型对象//3.1 data: 本例中,界面中需要一个str变量,保存用户输入的关键字data: {str: ""},//3.2 methods: 本例中: 界面中需要一个search函数methods: {search() {console.log(`正在搜索${this.str}相关的内容`);}}})</script></body>
效果如下:
2. 双向绑定原理(高频笔试面试)
双向绑定就是在单向绑定的基础上,自动为元素添加 onchange 或 oninput 事件处理函数,并能在事件处理函数中,自动将新值更新到 data 中的变量中。
a.自动添加事件绑定;
b.访问器属性;
c.虚拟DOM树。
举例:使用 :value+@input 事件模拟实现双向绑定;
<body><!--VUE 3步1. 做界面1.1 唯一父元素包裹1.2 找可能发生改变的位置本例中: 文本框的内容由用户主动输入而改变1.3 找触发事件的元素本例中: 点按钮执行搜索操作--><div id="app"><input :value="str" @input="input" id="txt"><button @click="search">百度一下</button></div><script>//2. 创建new Vue()对象,监视id为app的区域var vm = new Vue({el: "#app",//3. 创建模型对象//3.1 data: 本例中,界面中需要一个str变量,保存用户输入的关键字data: {str: "" //开局,用户什么都没输入,默认""},//3.2 methods: 本例中: 界面中需要一个search函数methods: {input(e) {this.str = e.target.value;},search() {console.log(`搜索 ${this.str} 相关的内容`)}}})</script></body>
3. 监视函数
专门用于监视一个变量的变化,并在变量值发生变化时自动执行的一个函数,只要希望一个变量的值一改变,我们就能自动执行一项操作时,都可用监视函数 watch。
new Vue({data:{变量名: 值},//监视函数watch:{变量名(){//只要上面data中同名变量的值一发生改变,watch中的同名监视函数就会自动执行}}})
举例(上例):实现按回车搜索和一边输入一边搜索;
效果如下:
4. 事件修饰符
简化版的对事件的约束,想改变事件的默认行为或约束触发事件的条件时,就用事件修饰符。
(1)限制用户按的键盘号
//DOM事件处理函数(e){if(e.keyCode==13){... ...}}//vue<元素 @事件名.13="事件处理函数"
(2)停止冒泡
//DOM 事件处理函数(e){e.stopPropagation();... ...}//vue<元素 @事件名.stop="处理函数"
(3)阻止默认行为
//DOM事件处理函数(e){e.preventDefault()... ...}//vue<元素 @事件.prevent="事件处理函数">
(4)多个事件修饰符连用
<元素 @事件.stop.prevent="事件处理函数">//等效于: 事件处理函数(e){e.stopPropagation()e.preventDefault()}
具体用法如下:
5. 双向绑定在不同表单元素中的原理
(1)文本框 <input type="text"> 和文本域 <textarea>
首次加载时,v-model 将程序中变量的值更新到页面上的文本框中显示,当用户主动在文本框中输入内容时,v-model 自动将用户输入的内容更新回程序中变量中保存。
(2)单选按钮 <input type="radio"> 多选一
<input type="radio" name="sex" value="1" v-model="sex">男<input type="radio" name="sex" value="0" v-model="sex">女
为每个 <input type="radio"> 备选项上添加一个 v-model="sex"。首次加载页面时,v-model 读取程序中的变量值,用变量值自动与每个 radio 固定 value 值做比较,如果哪个 radio 的固定 value 值刚好等于变量值,则当前 radio 自动选中。否则如果 radio 固定 value 值与变量值不相等,则 radio 不选中;当用户切换选中项时,v-mode 只会自动将选中的一个 radio 身上固定 value 值更新到程序中变量里保存,如果未选中的 radio 身上的 value 值是不需要放回程序中的。
举例:获取选择的性别;
<body><div id="app">性别:<input type="radio" name="sex" value="1" v-model="sex">男<input type="radio" name="sex" value="0" v-model="sex">女<br /><h3>您选择的性别是:{{sex}}</h3></div><script>new Vue({el: "#app",data: {sex: 1}})</script></body>
效果如下:
(3)下拉列表 <select>
<select><option value="备选值1"><option value="备选值2"><option value="备选值3"></select>
一个 <select> 下包含多个 <option>,每个 <option> 上都有一个固定的备选值 value 属性,只要在父元素 <select> 上写一个 v-model="变量" 即可。
加载数据时 v-model 会读取程序中的变量值,自动跟 <select> 下每个 option 上固定 value 值做比较,哪个 option 上固定 value 值与变量值一致,则哪个 option 被选中,反之其余 value 值与变量值不相等的 option,就不选中;当用户主动切换 select 中的选中项后,v-model 只会将选中的 option 的 value 值自动更新回程序中变量里保存。
举例:选择城市,切换城市图片;
<body><!--VUE 3步1. 做界面1.1 唯一父元素1.2 找可能发生变化的位置: 本例中:select选中的option会由用户主动改变而变化img的src属性会随程序变化而变化--><div id="app">请选择城市:<select v-model="src" id="sel"><option value="img/bj.jpg">北京</option><option value="img/sh.jpg">上海</option><option value="img/hz.jpg">杭州</option></select><br /><br /><img style="width:300px" :src="src"></div><script>//2. 创建new Vue()对象new Vue({el: "#app",//3. 创建模型对象data: {src: "img/bj.jpg"}})</script></body>
效果如下:
(4)复选框 checkbox 单独使用
<input type="checkbox">同意
复选框没有 value 值,只要在、<input>上写一个 v-model="变量" 即可。
<input type="checkbox" v-model="变量">
加载数据时 v-model 先取出变量值,将变量值赋值给 checkbox 的 checked 属性,如果checked 属性为 true,则当前 checkbox 选中,如果 checked 属性值为 false,则当前 checkbox 就不选中;当用户切换当前 checkbox 的选中状态后,v-model 会将当前 checkbox 的 checked 属性的新状态 bool 值,自动更新回程序中的变量里保存。
举例:点同意,启用元素;不同意,禁用元素;
<body><!--VUE 3步1. 做界面1.1 唯一父元素1.2 找可能发生变化的位置: 本例中: checkbox由用户主动修改其选中状态,用v-model绑定其余三个表单元素的disabled属性随checkbox的选中状态的改变而被动发生变化,用:disabled--><div id="app"><!--不同意(agree=false)时,禁用(disabled=true)同意(agree=true)时,启用(disabled=false)让disabled属性值与agree相反即可!--><br />用户名:<input :disabled="!agree"><br /><br />密码:<input :disabled="!agree" type="password"><br /><br /><input type="checkbox" v-model="agree">同意<br /><br /><button :disabled="!agree">注册</button></div><script>//2. 创建new Vue()对象new Vue({el: "#app",//3. 创建模型对象data: {agree: false //开始时默认不同意}})</script></body>
效果如下: