双向绑定

简介: 双向绑定

双向绑定


单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。


有单向绑定,就有双向绑定。如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。


什么情况下用户可以更新View呢?填写表单就是一个最直接的例子。当用户填写表单时,View的状态就被更新了,如果此时MVVM框架可以自动更新Model的状态,那就相当于我们把Model和View做了双向绑定:

image.png


在浏览器中,当用户修改了表单的内容时,我们绑定的Model会自动更新:


image.png

在Vue中,使用双向绑定非常容易,我们仍然先创建一个VM实例:


$(function () {
    var vm = new Vue({
        el: '#vm',
        data: {
            email: '',
            name: ''
        }
    });
    window.vm = vm;
});


然后,编写一个HTML FORM表单,并用v-model指令把某个<input>和Model的某个属性作双向绑定:


<form id="vm" action="#">
    <p><input v-model="email"></p>
    <p><input v-model="name"></p>
</form>

我们可以在表单中输入内容,然后在浏览器console中用window.vm.$data查看Model的内容,也可以用window.vm.name查看Model的name属性,它的值和FORM表单对应的<input>是一致的。


如果在浏览器console中用JavaScript更新Model,例如,执行window.vm.name='Bob',表单对应的<input>内容就会立刻更新。


除了<input type="text">可以和字符串类型的属性绑定外,其他类型的<input>也可以和相应数据类型绑定:


多个checkbox可以和数组绑定:


<label><input type="checkbox" v-model="language" value="zh"> Chinese</label>
<label><input type="checkbox" v-model="language" value="en"> English</label>
<label><input type="checkbox" v-model="language" value="fr"> French</label>


对应的Model为:


language: ['zh', 'en']


单个checkbox可以和boolean类型变量绑定:


<input type="checkbox" v-model="subscribe">


对应的Model为:


subscribe: true; // 根据checkbox是否选中为true/false


下拉框<select>绑定的是字符串,但是要注意,绑定的是value而非用户看到的文本:


<select v-model="city">
    <option value="bj">Beijing</option>
    <option value="sh">Shanghai</option>
    <option value="gz">Guangzhou</option>
</select>


对应的Model为:


city: 'bj' // 对应option的value


双向绑定最大的好处是我们不再需要用jQuery去查询表单的状态,而是直接获得了用JavaScript对象表示的Model。


处理事件


当用户提交表单时,传统的做法是响应onsubmit事件,用jQuery获取表单内容,检查输入是否有效,最后提交表单,或者用AJAX提交表单。


现在,获取表单内容已经不需要了,因为双向绑定直接让我们获得了表单内容,并且获得了合适的数据类型。


响应onsubmit事件也可以放到VM中。我们在<form>元素上使用指令:


<form id="vm" v-on:submit.prevent="register">


其中,v-on:submit="register"指令就会自动监听表单的submit事件,并调用register方法处理该事件。使用.prevent表示阻止事件冒泡,这样,浏览器不再处理<form>的submit事件。


因为我们指定了事件处理函数是register,所以需要在创建VM时添加一个register函数:


var vm = new Vue({
    el: '#vm',
    data: {
        ...
    },
    methods: {
        register: function () {
            // 显示JSON格式的Model:
            alert(JSON.stringify(this.$data));
            // TODO: AJAX POST...
        }
    }
});


在register()函数内部,我们可以用AJAX把JSON格式的Model发送给服务器,就完成了用户注册的功能。


使用CSS修饰后的页面效果如下:


image.png

相关文章
|
12月前
|
人工智能 安全 大数据
PAI年度发布:GenAI时代AI基础设施的演进
本文介绍了AI平台在大语言模型时代的新能力和发展趋势。面对推理请求异构化、持续训练需求及安全可信挑战,平台推出了一系列优化措施,包括LLM智能路由、多模态内容生成服务、serverless部署模式等,以提高资源利用效率和降低使用门槛。同时,发布了训推一体调度引擎、竞价任务等功能,助力企业更灵活地进行训练与推理任务管理。此外,PAI开发平台提供了丰富的工具链和最佳实践,支持从数据处理到模型部署的全流程开发,确保企业和开发者能高效、安全地构建AI应用,享受AI带来的红利。
|
数据采集 Java 测试技术
精准测试如何落地
在快速迭代的软件开发环境中,精准测试作为一种高效、针对性的测试方法,正逐步成为企业的首选。本文探讨了精准测试的落地方法、对质量指标的影响、数据统计与跟踪度量、提高投入产出收益率的策略及卡点数据的具体内容。通过优化测试用例、代码关联、技术融合及流程优化,精准测试能够显著提升软件质量和测试效率。
|
算法 搜索推荐 C语言
C语言用流程图表示算法
C语言用流程图表示算法
644 0
|
JavaScript Ubuntu Linux
蓝易云 - linux中安装nodejs,卸载nodejs,更新nodejs,git
请根据自己的Linux发行版和版本选择合适的命令。
469 2
|
缓存 算法
总结两种常见的长列表分页缓存策略
通常,对于长列表加载的场景,都需要进行分页, 如最近的世界杯体育垂站项目中的赛程页,评论流,直播流。而为了提高分页加载的性能,往往需要对分页进行缓存。 下面总结对两种常见的分页缓存的策略, 适用场景以及各自的优缺点。     策略一: 直接对分页结果缓存 顾名思义,就是直接缓存每次分页查询的结果。  
8560 0
|
自然语言处理
Prompt之文本生成详解教程
Prompt之文本生成详解教程
789 0
Prompt之文本生成详解教程
|
存储 运维 算法
CSMA/CD和CSMA/CA的区别(最全知识点总结)
CSMA/CD和CSMA/CA的区别(最全知识点总结)
3184 0
|
机器学习/深度学习 人工智能 自动驾驶
计算机视觉中的corner-case及其优化策略
Corner cases(CC)是指不经常出现或一些极端的场景数据,也是一种长尾问题的表现形式。然而,对于感知模型来说,CC非常重要,因为在自动驾驶系统的推理过程中,它需要训练、验证和提高感知模型的泛化性能。例如,一辆配备了最先进的目标检测器的车辆在高速公路上疾驰,可能无法及时发现失控的轮胎或翻倒的卡车(如下图)。这些自动驾驶目标检测失败的案例可能会导致严重的后果,危及生命。
计算机视觉中的corner-case及其优化策略
|
消息中间件 Web App开发 JavaScript
「web浏览器」通过 rAF,聊聊浏览器的任务调度
本文主要介绍浏览器相关知识点,通过 rAF,了解浏览器的任务调度。
683 0
|
小程序 前端开发
微信小程序直播间开发抽红包功能
小程序直播具备评论、点赞、连麦、拍一拍等丰富的互动功能,抽奖、优惠券等高效的营销功能,以及成员管理、评论管理、推流直播、数据看板等完善商家工具。通过引入小程序直播组件,商家自有小程序可快速具备直播能力,提升经营效率。
466 0
微信小程序直播间开发抽红包功能