irpas技术客

Vue(三)双向绑定_前端小马的进阶之路~_vue双向绑定

irpas 6937

一、双向绑定

? ? ? ? 前面的指令和{{ }}都是单向绑定,当用户主动在文本框中输入内容后,如果使用: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>

效果如下:


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #vue双向绑定