VUE中的v-model可以实现双向绑定,但是原理是什么呢?往下看看吧
根据官方文档的解释,v-model其实是一个语法糖,它会自动的在元素或者组件上面解析为 :value="" 和 @input="", 就像下面这样
// 标准写法 // 等价于 // 在组件上面时
1.当在input输入框输入内容时,会自动的触发input事件,更新绑定的name值。
2.当name的值通过JavaScript改变时,会更新input的value值
根据上面的原理,vue就通过v-model实现双向数据绑定
看了前面的解释,对于v-model有了一定的理解。下面我们就来实现自己组件上面的v-model吧
需求:实现一个简单的点击按钮,每次点击都自动的给绑定值price加100。 组件名为 AddPrice.vue
// AddPrice.vue // 通过props接受绑定的value参数点击加钱// 在父组件中调用组件中使用props接受传入的参数值value, 组件点击事件触发并 使用$emit调用父组件上的input事件,实现了自定义的双向绑定
补充知识:vue - v-model实现自定义样式の多选与单选
这两天在玩mpvue,但是下午如果对着文档大眼瞪小眼的话,肯定会睡着的。
想起昨晚的flag,我就想直接用demo上手吧,一举两得
谁想到我好不容易快做完了,v-model在小程序中不起作用!
来不及研究为什么,我先直接在原来项目上赶紧建了一个test页面,先赶紧实现我的这种设想:
使用v-model和原生表单也可以实现这么好看且达到需求的效果。
重要的是不用自己跟在用户屁股后面屁颠屁颠的监听人家到底何时用了点击事件,又把点击事件用在何处了!
效果图如下,和之前的没什么两样呢!
具体实现我想,vue官网有关于表单输入绑定的讲解和demo,事实上,我只要做到利用他的demo把我的数据和样式调整一下就万事大吉了!
没有什么比简单解决一个功能更让人开心的了!
说干就干,我直接在原来项目代码的基础上动手:
之前的选项处理就一个li孤军奋战,数据渲染、样式切换、包括点击事件都绑定在上边,
ul.qus-list li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" @click="choosed(index)" v-bind:class="{'li-focus' : chooseNum==index}" ref="liId") {{item.Code}}、{{item.Description}}简直忙到没朋友啊有没有!光他和ul的长度差距就说明了一切!
现在我们把他要做的事分解一下:
现在他只负责v-for循环数据渲染
ul.qus-list
li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" v-bind:class="{'li-focus' : chooseNum==index}")
内部分配给他两个小弟
input:radio/checkbox和label,这俩人一个负责点击后与数据的绑定,一个负责样式。这么一说大神就明了了,好你可以走了,把沙发腾出来。
这俩人中,Input负责数据绑定,其实也就是利用v-model。具体原理直接看https://cn.vuejs.org/v2/guide/forms.html
input( type="radio" :value="item.Code" :id="'choice1'+index" v-model="picked")
然后时label负责样式。样式也包括用户看到的选项文本的展示:
label(:for="'choice1'+index" class="choice-item") {{item.Code}}、{{item.Description}}
至于他具体怎么负责样式?这个也利用了css的选择器
主要是:checked选择器和+相邻兄弟选择器
/*普通样式*/ .choice-item{ display: block; margin: .2rem auto 0; padding: .3rem .3rem .34rem; color: $qusTxt; font-size: .34rem; text-align: center; @include boxStyle(1rem,.12rem,rgba(49,32,114,0.16)); } /*input被选中时,label的样式*/ input:checked + .choice-item{ background: $purpleClr; color: #FFF; }于是就有了这样的样式:
这里可以看出,二者是相互成就的关系:
首先通过html那里,label的for属性和input的id属性关联,使得点击label的时候,input也就被选择上了。
然后是css样式这里,label除了自己正常的样式,还受input被选中状态的影响,当input被选中后(input:checked),作为input在li爸爸内部的唯一兄弟元素(+选择符),label的样式就被重新更新了选中态。
因为选中展示的效果被label做了,那么input也就可以归隐山林,幽香田园生活了。所以直接设置样式不可见即可。
这也就是我上一篇说的,不会巧妙的利用每一个代码的特性。
而这一篇的实现方式正是还算巧妙的利用了该用的知识点。
也就不再需要li身上绑定的哪个choose事件来监听用户点击了。代码自己给我们做了!
甚至最后连用户选了什么都不用管,直接将v-model绑定的变量传给后端即可。
强大的v-model!
最后因为本需求有多选和单选,作为单页应用,又因不需要渲染很多道题目,每次只渲染一道。
所以我们可以最后根据选项判断确定是需要多选还是单选,动态的切换这两套就行了。
这么一看是不是特别简单名了!却被我之前实现的那么麻烦。。。。。我也是佩服自己光脚登山的傻劲。
整篇源码:
//- 答题 组件 #QuestionTest //- 弹层 layer(:layerItem="layerItem" @confirmsubmit= "confirmSubmit($event)" @changelayershow= "changeLayerShow($event)" @hidelayer="hideLayer($event)" v-show="showLayer") h3.zhanshi 您的选择是:{{picked}} //- 题目表单 form.question div h3.qus-title(:data-id="state.ExamInfo.QuestionID") {{state.ExamInfo.ExamQuestionNo}}、{{state.ExamInfo.Description}} ul.qus-list li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" v-bind:class="{'li-focus' : chooseNum==index}") input( type="radio" :value="item.Code" :id="'choice1'+index" v-model="picked") label(:for="'choice1'+index" class="choice-item") {{item.Code}}、{{item.Description}} h3.zhanshi 您的多选选择是:{{pickedBox}} form.question div h3.qus-title(:data-id="state.ExamInfo.QuestionID") 15、这是多选题目?-多选 ul.qus-list li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" v-bind:class="{'li-focus' : chooseNum==index}") input( type="checkbox" :value="item.Code" :id="'choice2'+index" v-model="pickedBox") label(:for="'choice2'+index" class="choice-item") {{item.Code}}、多选{{item.Description.substring(2)}}以上这篇vue中的v-model原理,与组件自定义v-model详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
如何解决《在Laravel中处理url的字符大小写?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《std::list按索引删除元素》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何在字体真棒图标中创建过渡效果》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何从bitbake构建的最终rootfs映像中删除特定的包》经验,为你挑选了1个好方法。 ... [详细] 如何解决《从一组数组中返回最大的数组》经验,为你挑选了1个好方法。 ... [详细] 如何解决《无法在Windows10中以管理员身份更改系统变量路径》经验,为你挑选了1个好方法。 ... [详细] 如何解决《AVAudioEngine可录制麦克风和声音文件,避免反馈循环》经验,为你挑选了0个好方法。 ... [详细] 如何解决《Javascript单击iframe内的坐标》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何缓存asyncio协同程序》经验,为你挑选了1个好方法。 ... [详细] 如何解决《无法让用户在注册过程中上传个人资料图片(Parse.com/JSSDK)》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何在使用MySQL的Yii2迁移中实现AUTO_INCREMENT?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《LinkedIn登录基本示例不起作用》经验,为你挑选了0个好方法。 ... [详细] 如何解决《SparkSQL的where子句排除空值》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Breakpoint命中Hashmap.put()一个简单的HelloWorld程序》经验,为你挑选了2个好方法。 ... [详细] 如何解决《子查询where子句中的MYSQL别名》经验,为你挑选了0个好方法。 ... [详细] 如何解决《tsconfig.json-仅从文件夹构建ts文件》经验,为你挑选了2个好方法。 ... [详细] 如何解决《RecylerView无需动画即可滚动到所需位置》经验,为你挑选了0个好方法。 ... [详细] 如何解决《执行上下文和调度程序-最佳实践,有用的配置和文档》经验,为你挑选了0个好方法。 ... [详细] 如何解决《AndroidGoogleSignIn无法在调试模式下运行:GoogleSignInResult为false》经验,为你挑选了2个好方法。 ... [详细] 如何解决《如何在SublimeText3中为ruby设置高亮显示的端到端块?》经验,为你挑选了1个好方法。 ... [详细]吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1如何在编译时初始化浮点数组?
- 2将重复出现的图像识别为更大的图像
- 3Angular 2指令现在是"可扩展的"吗?
- 4使用Retrofit 2.0.x进行HTTP缓存
- 5如何初始化Direct到对象在C++中工作?
- 6为什么采用迭代器的构造函数需要元素为EmplaceConstructible?
- 7MYSQL导入:无法从发送到GEOMETRY字段的数据中获取几何对象
- 8React中的校验和是什么以及如何使用它?
- 9javascript:什么是$$?
- 10Stetho显示两个具有相同名称的列
- 11在C#中的父类上正确实现IDisposable
- 12Rails类型如何转换array_agg()函数的结果
- 13OpenLayers:如何检测地图视图是否已完全加载?
- 14如何在从url打开后清除活动中的意图数据?
- 15无法训练神经网络解决XOR映射
- 16如何在Camel中动态添加和启动路由?
- 17Threads和println()语句之间的关系
- 18如何向Android活动添加底部菜单
- 19使用rvest(R)进行网络抓取时停止使用网址
- 20如何使用webpack从node_modules加载静态CSS文件?
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有