5.Vue数据双向绑定
5.1.什么是双向数据绑定
Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是 Vue.js 的精髓之处了。
(资料图)
值得注意的是,我们所说的数据双向绑定,一定是对于 UI 控件来说的,非 UI 控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用 vuex,那么数据流也是单项的,这时就会和双向数据绑定有冲突。
5.2 怎么实现双向数据绑定
v-model
v-model 指令可以在表单及元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。注意:v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值!
测试案例:
用非v-model方式的时候,是不能双向绑定的
{{msg}} <script> var app = new Vue({ el:"#app", data:{ msg:"hello" } }); </script>
改为v-model方式绑定:
{{msg}} <script> var app = new Vue({ el:"#app", data:{ msg:"hello" } }); </script>
案例2:
{{selected}}
<script> var v= new Vue({ el:"#app", data:{selected:"" } }); </script>
案例3:
选中的值: - {{item}}
<script type="text/javascript"> var v = new Vue({ el: "#app", data: { checkedValues:[] } }); </script>
6.Vue事件绑定
v-on
v-on:事件名 = “方法名” 简写方式: @事件名 = “方法名” 事件名有哪些: click|keydown|keyup|mouseover|mouseout|自定义事件名
测试案例1:
<script type="text/javascript" src="js/vue.js" ></script><script>var v=new Vue({el:"#app",data:{num:1},methods:{sub:function(){if(this.num>0) this.num-=1;},plus:function(){this.num=parseInt(this.num)+1; }}})</script>
v-on: 可以简化为@
测试案例2:
<script type="text/javascript" src="js/vue.js" ></script>输入分数,按回车,显示等级等级:{{level}} <script type="text/javascript"> var app = new Vue({ el: "#app", data: { level: "", score:"" }, methods: { show: function () { if(this.score>=0 && this.score<60) this.level="D"; else if(this.score<80) this.level="C"; else if(this.score<90) this.level="B"; else this.level="A"; } } }) </script>
测试结果:
7.综合案例
根据前面学习的vue的基础语法和事件绑定,实现一下商品的查询,添加,删除功能。
测试案例:
<script type="text/javascript" src="js/vue.js"></script> 商品操作页面
序号: 名称: 价格:
搜索: 序号 名称 价格 操作 {{ item.id }} {{ item.name }} {{ item.price }} 删除
<script type="text/javascript"> var vm = new Vue({ el : "#app", data:{ id:"", name:"", searchKey:"", list:[ {id:1,name:"T恤",price:100}, {id:2,name:"西装",price:500}, {id:3,name:"连衣裙",price:200}, {id:4,name:"衬衫",price:150} ] }, methods:{ add(){ //将表单中的数据组装为一个商品对象 var good = { id:this.id, name:this.name, price:this.price }; //存入list中 this.list.push(good); //将表单数据清空 this.id = this.name = this.price=""; }, del(id){ //遍历查询 var index = this.list.findIndex( item => { if(id == item.id){ return true; } }); this.list.splice(index,1);//JavaScript中的splice(index,i)方法:从已知数组的index下标开始,删除i个元素 }, search(searchKey){ //filter() 方法创建一个新的数组,新数组中的元素是数组中符合条件的所有元素组合而成 return this.list.filter(item => { if(item.name.includes(searchKey)){ return item; } }); } } }) </script>
测试结果:
8.Template 标签
template的作用是模板占位符,可帮助我们包裹元素,但在循环过程当中,template不会被渲染到页面上
比如:
{{value}}
这个循环是做在div上面的,如果需要循环的内容很多,比如span标签也要做这个循环
{{value}}{{value}}
则需要把循环提出来,但这样会多一个div标签
{{value}} {{value}}
如果不想多一个标签,可以用template,template不会渲染到页面上
{{value}} {{value}}
另外,template可以用到制作模板。
方法1:直接在vue对象中定义
<script type="text/javascript" src="js/vue.js" ></script> <script> var v = new Vue({ el:"#app", data:{ msg:"daimenglaoshi" }, template:"{{msg}}"//模板中只能有一个根元素 });</script>
方法2:写在template标签里
<script type="text/javascript" src="js/vue.js" ></script> {{msg}} <script> let vm = new Vue({ el:"#app", data:{ msg:"daimenglaoshi" }, //通过该属性可以将自定义的template属性中的内容全部替换app的内容,并且会覆盖里面原有的内容,并且在查看dom结构时没有template标签 template:"#temp" });</script>方法3:写在script标签里
<script type="text/javascript" src="js/vue.js" ></script><script type="x-template" id="temp"> {{msg}} </script><script> var v = new Vue({ el:"#app", data:{ msg:"daimenglaoshi" }, template:"#temp"//模板中只能有一个根元素 });</script>
推荐内容
世界简讯:VUE数据双向绑定
第一百一十四篇: JS数组Array(三)数组常用方法
天天速看:Python函数/动态参数/关键字参数
世界速读:注解在Android中的使用场景
世界简讯:Hessian2序列化支持这一点,让重构dubbo接口更容易了
【天天聚看点】微信小程序报错“getLocation:fail the api need to be declared in the requiredPriva
【全球快播报】记录--三分钟打造自己专属的uni-app工具箱
天天日报丨项目经理的核心价值:以目标为导向做正确的事
环球热点评!Vue3项目-生成Cron表达式组件
全球滚动:Java 反射概念的引入
渗透实录-01
要闻:Nacos 2.2 正式发布,这次更新太炸了!
世界关注:Kerberos身份验证在ChunJun中的落地实践
IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?全方位实测!
【聚看点】多数据源事务处理-涉及分布式事务
短讯!IDEA没有新建jsp文件按钮
VS2022生成控制台引用程序,.net应用导出成exe文件,发部成独立文件的详细图解
MySQL学习笔记2
环球短讯!认证管理(锐捷网关篇)
世界即时看!C语言字符串拆分的两种方式strtok和正则表达式
全球通讯!低代码靠不靠谱?看看低代码在智能物联系统搭建中的应用
每日精选:V2Board机场项目泄露400余万条数据
每日速讯:Blazor和Vue对比学习(进阶.路由导航五):路由守卫
观点:【从零开始学爬虫】采集收视率排行数据
mvn 打包报错:no compiler is provided in this environment
天天微动态丨JavaScript DOM的性能优化详解
每日资讯:VUE的实例的生命周期
焦点热讯:替代if esle 的高级方法
make学习
天天热门:高手必备10大难题:Mysql如何实现RR级隔离时,不会幻读?
FreeSWITCH学习笔记:应用程序(APP)
全球观察:7-2 案例 字符串关键字的散列映射
环球微头条丨初始Docker
热点评!分智慧果 - 2021算法与数据结构实验题
天天微动态丨自研分布式高性能RPC框架及服务注册中心ApiRegistry实践笔记【原创】【开源】
【独家】图形用户界面(GUI)编程可以学习C++ Builder,多图、实例、书籍
17 Java内存模型与线程_Java与线程
环球要闻:AIRIOT答疑第2期|如何使用物联网平台的数据采集与控制引擎?
世界速读:BaseDet: 走过开发的弯路
今日热门!引迈信息荣登「2022低代码企业50强」:JNPF,你的不二选择!
环球微速讯:SQL的使用总结
天天快资讯:WPF深入简出(一)入门必看
观热点:【机器学习】李宏毅——浅谈机器学习原理+鱼与熊掌兼得的深度学习简述
当前动态:前后端AES加密解密,CryptoJS和Java实现
热讯:记录--手把手带你开发一个uni-app日历插件(并发布)
【世界速看料】LeetCode HOT 100:旋转图像
【天天速看料】Shell 标准输入和输出
信息:公司新来一个同事,把网关系统设计的炉火纯青!(万能通用,稳的一批。。)
当前视讯!易基因|NSUN2介导RNA m5C修饰促进食管鳞状细胞癌进展的表观调控机制 | 肿瘤研究
ThingsBoard前端项目的安装与启动