深入学习vue指令,自定义指令解决开发痛点
每天学习一点点 编程PDF电子书、视频教程免费下载:
http://www.shitanlife.com/code
v-model指令
vue.js的定义是一个mvvm框架,将它发挥到极致能够极大的提升工作效率。在vuejs中,指令(directive)无疑是最关键,最重要的一环之一,官方api自带的指令提供了非常方便的方式,将常见的编码场景进行提炼,使用这些指令能令人感到愉悦。
v-model
数据绑定指令,它最常见的用法是可以将指定的data对象中的属性绑定到一个form元素中,例如:

- <div id="app">
- <div class="directives">
- <input type="text" v-model="text" name="" value="">
- {{text}}
- </div>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
- <script type="text/javascript">
- new Vue({
- el: '#app',
- data: function(){
- return {
- text: 'hello World'
- };
- },
- })
- </script>

上面的代码,我们在data对象里创建了一个text属性,在标签<input>中使用v-model绑定到text,这时候这个input输入框会和text属性进行同步。当你修改input中的值,text属性值随之改变,然后这个改变被绑定到元素的value值上。
它的内部原理使用了html5的oninput事件,上面的代码经过内部操作,其实可以表示成:

- <div id="app">
- <div class="directives">
- <input type="text" :value="text" @input="setValue" name="" value="">
- {{text}}
- </div>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
- <script type="text/javascript">
- new Vue({
- el: '#app',
- data: function(){
- return {
- text: 'hello World'
- };
- },
- methods:{
- setValue:function($event){
- this.text = $event.target.value;
- }
- }
- });
- </script>

注意这段:
- <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元素,它还可以绑定组件:

- <div id="app">
- <div class="directives">
- <demo-el v-model="text"></demo-el>
- <input type="text" v-model="text" name="" value="">
- </div>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
- <script type="text/javascript">
- Vue.component("demo-el",{
- props:["value"],
- template:'<div style="color:green">{{value}}</div>'
- });
- new Vue({
- el: '#app',
- data: function(){
- return {
- text: 'hello World'
- };
- },
- methods:{
- }
- });
- </script>

上面代码我们使用vue-component定义一个组件,叫demo-el,它接受一个prop属性,这里为什么是value呢? 结合上面的v-model原理再看。
- <!--可以看成这样-->
- <demo-el :value="text" @input="setValue"></demo-el>
- 原来是这样,解析model时,绑定的就是value属性,传入组件就是prop啦。
- v-model不能直接绑定的元素相信大家一定遇到过,那就是checkbox radio。
- 在创建类似复选框或者单选框的常见组件时,v-model就不好用了。这里博主用自定义组件解决这个问题,
- ps:现在最新版本的vue解决了一部分问题,v-model作用在checkbox上时可以绑定对应的true或者false了,但是它还不完美,例如在多选功能上,我们往往希望直接绑定选择的多个值,而不是true或者false。
v-checkmodel 自定义指令实现
- 我们希望checkbox能够根据自己的定义实现true和false的自由转换,例如我们在项目json中,0是false,1是true,亦或者是 '是'是true,'否'是false,这要怎么实现呢,
平时我们开发可能会在watch中监控属性,例如:

- {
- ......
- watch:{
- check:function(n){
- if(n){
- this.checktext = '是',
- }
- }
- }
- }

- 我们需要手动判断n的true或false,并且在请求到数据是需要将
- '是'
- '否'
- 转换成 true false,我们可以用自定义指令来解决这个问题。

- Vue.directive("checkmodel",{
- inserted:function(el,binding,vnode){
- var value = binding.value.value;
- var condition = binding.value.condition;
- if(condition[value] != undefined){
- el.checked = condition[value];
- }
- el.addEventListener("click",function(){
- for(var name in condition){
- if(condition[name] === this.checked){
- binding.value.value = name;
- }
- }
- },false);
- }
- });

我们创建了一个自定义指令,名称叫checkmodel,它根据api接受三个参数,el【标签对象】,binding绑定对象,vnode,node节点对象。
然后我们在下面规定获取了绑定对象的value,绑定对象的condition表达式,然后将表达式的值绑定给el的checked,最后创建click监听事件,当点击时根据表达式的值进行绑定转换。
最后它的使用方法就像下面这样:

- <div id="app">
- <div class="directives">
- <input type="checkbox" v-checkmodel="check" name="" value="">
- {{check.value}}
- </div>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
- <script type="text/javascript">
- new Vue({
- el: '#app',
- data: function(){
- return {
- check:{
- value:"1",
- condition:{
- "1":false,
- "2":true
- }
- }
- };
- },
- methods:{
- }
- });
- </script>

我们指定1是false,2是true,然后通过v-checkmodel绑定到checkbox,在点击时候,指令会根据condition中的值转换true和false;
你也可以基于这个中心思想,定制自己的指令,使它契合你的业务。例如我可以定义一个全局condition这个属性,统管全局的字典转换。
(此图代码未经测试... gif录制太大,修改思想呈现就好)
写在后面
mvvm框架和webpack的出现确实改变了前端的开发方式,使得学习前端变成了一门有着深入学问的课题。在我们日常开发中应该不断地学习,归纳,总结,寻找新的思想,对原有的代码有好的补充和好的改进。
写的不好,谢谢大家观看。 后续有空会新增更多关于开发的知识分享。
如果你有什么疑问,你可以联系我,或者在下方评论。
每天学习一点点 编程PDF电子书、视频教程免费下载:
http://www.shitanlife.com/code
深入学习vue指令,自定义指令解决开发痛点的更多相关文章
- Vue 3自定义指令开发
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是指令(directive) 在Angular和Vue中都有Direct ...
- Vue.js自定义指令的用法与实例
市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...
- Vue.directive 自定义指令
一.什么是全局API? 全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如我们今天要学习的指令Vue.directive.说的简单些就是,在 ...
- Vue2.0 【第二季】第1节 Vue.directive自定义指令
目录 Vue2.0 [第二季]第1节 Vue.directive自定义指令 一.什么是全局API? 二. Vue.directive自定义指令 三.自定义指令中传递的三个参数 四.自定义指令的生命周期 ...
- 最简单的方式理解Vue的自定义指令与混合
vue.js 自定义指令 钩子函数:bindinsertedupdatecomponentUpdatedunbind 钩子函数完整实例:html: <div id="hook-argu ...
- vue 通过自定义指令实现 置顶操作;
项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令 ...
- vue怎么自定义指令??
最近看看vue中自定义指令,感觉vue的指令和angular1的指令相差较大 <script> //指令钩子函数: /* bind 只调用一次,指令第一次绑定到元素的时调用 inserte ...
- Vue directive自定义指令+canvas实现H5图片压缩上传-Base64格式
前言 最近优化项目-手机拍照图片太大,回显速度比较慢,使用了vue的自定义指令实现H5压缩上传base64格式的图片 canvas自定义指令 Vue.directive("canvas&qu ...
- vue中自定义指令
//vue中自定义指令 //使用 Vue.directive(id, [definition]) 定义全局的指令 //参数1:指令的名称.注意,在定义的时候,指令的名称前面,不需要加 v-前缀; 但是 ...
- 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 最近博主我沉淀了几个月,或者说懒了几个月.然而大佬的指点总是一针见血,能够让人看到方向.所以我现在有觉得,一个好的 ...
随机推荐
- JS基础(一)dom小实例
DOM的新增示例 <script language="JavaScript"> window.onload = function(){ //createDocument ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- JavaScript解析机制与闭包原理实例详解
js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...
- POJ 2407Relatives
Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15566 Accepted: 7900 Descri ...
- HTML之元素分类(HTML基础知识)
HTML之元素分类 一.按照块级元素还是行内元素分类 块级元素(block-level)和行内元素(inline-level,也叫作“内联”元素). a.块级元素(独占一行) 块级元素:其最明显的特征 ...
- 使用SQL查看表字段和字段说明
MySql: show full columns from tableName; Sql server: SELECT A.name AS table_name, B.name AS column_n ...
- php post接口,登录功能
登录功能同注册功能一样,都是使用 post 方法,在执行 sql 语句时,同样要使用 "select * from 表名 where 键名 = 参数" 的查询方式,不同的是: 注册 ...
- web前端(9)—— CSS属性
属性 终于到css属性,前面就零零散散的用了什么color,font-size之类,本篇博文就专项的介绍它了 字体属性 font-family 此属性是设置字体样式的,比如微软雅黑,方正书体,华文宋体 ...
- 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 ...
- Sql Server 按格式输出日期
SELECT dbo.fn_Data(getdate(),'yyyymmdd') CREATE FUNCTION [dbo].[fn_Data] (@date as datetime, @format ...