每天学习一点点 编程PDF电子书、视频教程免费下载:
http://www.shitanlife.com/code

v-model指令

vue.js的定义是一个mvvm框架,将它发挥到极致能够极大的提升工作效率。在vuejs中,指令(directive)无疑是最关键,最重要的一环之一,官方api自带的指令提供了非常方便的方式,将常见的编码场景进行提炼,使用这些指令能令人感到愉悦。

  v-model

    数据绑定指令,它最常见的用法是可以将指定的data对象中的属性绑定到一个form元素中,例如:

  1. <div id="app">
  2. <div class="directives">
  3. <input type="text" v-model="text" name="" value="">
  4. {{text}}
  5. </div>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  8. <script type="text/javascript">
  9. new Vue({
  10. el: '#app',
  11. data: function(){
  12. return {
  13. text: 'hello World'
  14. };
  15. },
  16.  
  17. })
  18. </script>

上面的代码,我们在data对象里创建了一个text属性,在标签<input>中使用v-model绑定到text,这时候这个input输入框会和text属性进行同步。当你修改input中的值,text属性值随之改变,然后这个改变被绑定到元素的value值上。

它的内部原理使用了html5的oninput事件,上面的代码经过内部操作,其实可以表示成:

  1. <div id="app">
  2. <div class="directives">
  3. <input type="text" :value="text" @input="setValue" name="" value="">
  4. {{text}}
  5. </div>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  8. <script type="text/javascript">
  9. new Vue({
  10. el: '#app',
  11. data: function(){
  12. return {
  13. text: 'hello World'
  14. };
  15. },
  16. methods:{
  17. setValue:function($event){
  18. this.text = $event.target.value;
  19. }
  20. }
  21. });
  22. </script>

注意这段:

  1. <input type="text" :value="text" @input="setValue" name="" value="">

v-model其实只是一个语法糖,它与angular的model是不同的。  vue中其实它通过解析,在@input事件中设置响应,在响应中修改text的值,然后再通过绑定属性v-bind绑定value同步value值,看到这里你应该

对v-model有了更深入的理解了吧,那么这个知识点对我们有什么帮助呢?

从这里我们可以看出,v-model不仅仅可以绑定form元素,它还可以绑定组件:

  1. <div id="app">
  2. <div class="directives">
  3. <demo-el v-model="text"></demo-el>
  4. <input type="text" v-model="text" name="" value="">
  5. </div>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  8. <script type="text/javascript">
  9. Vue.component("demo-el",{
  10. props:["value"],
  11. template:'<div style="color:green">{{value}}</div>'
  12. });
  13. new Vue({
  14. el: '#app',
  15. data: function(){
  16. return {
  17. text: 'hello World'
  18. };
  19. },
  20. methods:{
  21.  
  22. }
  23. });
  24. </script>

上面代码我们使用vue-component定义一个组件,叫demo-el,它接受一个prop属性,这里为什么是value呢? 结合上面的v-model原理再看。

  1. <!--可以看成这样-->
  2. <demo-el :value="text" @input="setValue"></demo-el>
  1. 原来是这样,解析model时,绑定的就是value属性,传入组件就是prop啦。
  2.  
  3. v-model不能直接绑定的元素相信大家一定遇到过,那就是checkbox radio
  4.  
  5. 在创建类似复选框或者单选框的常见组件时,v-model就不好用了。这里博主用自定义组件解决这个问题,
  6.  
  7. ps:现在最新版本的vue解决了一部分问题,v-model作用在checkbox上时可以绑定对应的true或者false了,但是它还不完美,例如在多选功能上,我们往往希望直接绑定选择的多个值,而不是true或者false

v-checkmodel 自定义指令实现

  1. 我们希望checkbox能够根据自己的定义实现truefalse的自由转换,例如我们在项目json中,0false1true,亦或者是 '是'true'否'false,这要怎么实现呢,
    平时我们开发可能会在watch中监控属性,例如:
  1. {
  2. ......
  3. watch:{
  4. check:function(n){
  5. if(n){
  6. this.checktext = '是',
  7. }
  8. }
  9. }
  10. }
  1. 我们需要手动判断ntruefalse,并且在请求到数据是需要将
  1. '是'
  1. '否'
  2.  
  3. 转换成 true false,我们可以用自定义指令来解决这个问题。
  1. Vue.directive("checkmodel",{
  2. inserted:function(el,binding,vnode){
  3. var value = binding.value.value;
  4. var condition = binding.value.condition;
  5. if(condition[value] != undefined){
  6. el.checked = condition[value];
  7. }
  8. el.addEventListener("click",function(){
  9. for(var name in condition){
  10. if(condition[name] === this.checked){
  11. binding.value.value = name;
  12. }
  13. }
  14. },false);
  15. }
  16. });

我们创建了一个自定义指令,名称叫checkmodel,它根据api接受三个参数,el【标签对象】,binding绑定对象,vnode,node节点对象。

然后我们在下面规定获取了绑定对象的value,绑定对象的condition表达式,然后将表达式的值绑定给el的checked,最后创建click监听事件,当点击时根据表达式的值进行绑定转换。

最后它的使用方法就像下面这样:

  1. <div id="app">
  2. <div class="directives">
  3. <input type="checkbox" v-checkmodel="check" name="" value="">
  4. {{check.value}}
  5. </div>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  8. <script type="text/javascript">
  9.  
  10. new Vue({
  11. el: '#app',
  12. data: function(){
  13. return {
  14. check:{
  15. value:"1",
  16. condition:{
  17. "1":false,
  18. "2":true
  19. }
  20. }
  21. };
  22. },
  23. methods:{
  24.  
  25. }
  26. });
  27.  
  28. </script>

我们指定1是false,2是true,然后通过v-checkmodel绑定到checkbox,在点击时候,指令会根据condition中的值转换true和false;

你也可以基于这个中心思想,定制自己的指令,使它契合你的业务。例如我可以定义一个全局condition这个属性,统管全局的字典转换。

(此图代码未经测试... gif录制太大,修改思想呈现就好)

写在后面

  mvvm框架和webpack的出现确实改变了前端的开发方式,使得学习前端变成了一门有着深入学问的课题。在我们日常开发中应该不断地学习,归纳,总结,寻找新的思想,对原有的代码有好的补充和好的改进。

写的不好,谢谢大家观看。 后续有空会新增更多关于开发的知识分享。

如果你有什么疑问,你可以联系我,或者在下方评论。

每天学习一点点 编程PDF电子书、视频教程免费下载:
http://www.shitanlife.com/code

深入学习vue指令,自定义指令解决开发痛点的更多相关文章

  1. Vue 3自定义指令开发

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是指令(directive) 在Angular和Vue中都有Direct ...

  2. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  3. Vue.directive 自定义指令

    一.什么是全局API? 全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如我们今天要学习的指令Vue.directive.说的简单些就是,在 ...

  4. Vue2.0 【第二季】第1节 Vue.directive自定义指令

    目录 Vue2.0 [第二季]第1节 Vue.directive自定义指令 一.什么是全局API? 二. Vue.directive自定义指令 三.自定义指令中传递的三个参数 四.自定义指令的生命周期 ...

  5. 最简单的方式理解Vue的自定义指令与混合

    vue.js 自定义指令 钩子函数:bindinsertedupdatecomponentUpdatedunbind 钩子函数完整实例:html: <div id="hook-argu ...

  6. vue 通过自定义指令实现 置顶操作;

    项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令  ...

  7. vue怎么自定义指令??

    最近看看vue中自定义指令,感觉vue的指令和angular1的指令相差较大 <script> //指令钩子函数: /* bind 只调用一次,指令第一次绑定到元素的时调用 inserte ...

  8. Vue directive自定义指令+canvas实现H5图片压缩上传-Base64格式

    前言 最近优化项目-手机拍照图片太大,回显速度比较慢,使用了vue的自定义指令实现H5压缩上传base64格式的图片 canvas自定义指令 Vue.directive("canvas&qu ...

  9. vue中自定义指令

    //vue中自定义指令 //使用 Vue.directive(id, [definition]) 定义全局的指令 //参数1:指令的名称.注意,在定义的时候,指令的名称前面,不需要加 v-前缀; 但是 ...

  10. 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点

    写在前面  一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 最近博主我沉淀了几个月,或者说懒了几个月.然而大佬的指点总是一针见血,能够让人看到方向.所以我现在有觉得,一个好的 ...

随机推荐

  1. JS基础(一)dom小实例

    DOM的新增示例 <script language="JavaScript"> window.onload = function(){ //createDocument ...

  2. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...

  3. JavaScript解析机制与闭包原理实例详解

    js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...

  4. POJ 2407Relatives

    Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15566   Accepted: 7900 Descri ...

  5. HTML之元素分类(HTML基础知识)

    HTML之元素分类 一.按照块级元素还是行内元素分类 块级元素(block-level)和行内元素(inline-level,也叫作“内联”元素). a.块级元素(独占一行) 块级元素:其最明显的特征 ...

  6. 使用SQL查看表字段和字段说明

    MySql: show full columns from tableName; Sql server: SELECT A.name AS table_name, B.name AS column_n ...

  7. php post接口,登录功能

    登录功能同注册功能一样,都是使用 post 方法,在执行 sql 语句时,同样要使用 "select * from 表名 where 键名 = 参数" 的查询方式,不同的是: 注册 ...

  8. web前端(9)—— CSS属性

    属性 终于到css属性,前面就零零散散的用了什么color,font-size之类,本篇博文就专项的介绍它了 字体属性 font-family 此属性是设置字体样式的,比如微软雅黑,方正书体,华文宋体 ...

  9. The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "SDSSDFCC...

    The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server ...

  10. Sql Server 按格式输出日期

    SELECT dbo.fn_Data(getdate(),'yyyymmdd') CREATE FUNCTION [dbo].[fn_Data] (@date as datetime, @format ...