在vue中有很多指令,以v-开头的命令作用在html元素上,将指令绑定在元素上,给绑定的元素添加一些特殊行为。
<span v-if="yes">yes的时候显示出来</span>
但有一些是没有相对应的指令进行操作。在这里以progress(h5的新标签进度条)为例,向大家介绍Vue的一个用于指令扩展的方法:directive(自定义指令)。
语法如下:
Vue.directive(id, definition)
传入的两个参数,id是指指令ID,definition是指定义对象。其中,定义对象可以提供一些钩子函数。
钩子函数 | 描述 |
bind | 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 |
inserted | 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中) |
update | 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新 |
componentUpdated | 被绑定元素所在模板完成一次更新周期时调用 |
unbind | 只调用一次,指令与元素解绑时使用 |
接下来我们来看一下钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。
指令钩子函数会被传入以下参数:
1.首先创建一个指令自定义对象directObj。
let directObj = {}.
2.vue为所有指令的钩子函数都提供一些函数参数。
let args = {
el:'指令所绑定的元素,可以用来直接操作 DOM ',
binding:{
name:'指令名,不包括 v- 前缀。',
value:'指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。',
oldValue:'指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。',
expression:"字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"",
arg:"传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"",
modifiers:"一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。",
vnode:"Vue 编译生成的虚拟节点。",
oldVnode:"上一个虚拟节点"
}
}
3.在directObj上可根据需要定义一些钩子函数
directObj.bind = function({...args }){
//只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
}
directObj.inserted= function({...args }){
//被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
}
directObj.update= function({...args }){
//所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。
指令的值可能发生了改变,也可能没有。
但是你可以通过比较更新前后的值来忽略不必要的模板更新
}
directObj.componentUpdated= function({...args }){
//指令所在组件的 VNode 及其子 VNode 全部更新后调用。
}
directObj.unbind= function({...args }){
//只调用一次,指令与元素解绑时调用。
}
4.注册自定义指令
(1).全局注册:
Vue.directive('指令名称','指令对象');
例:Vue.directive('reclick',directObj);
注意:全局注册自定义指令需在实例化Vue之前.
(2).局部(组件)注册:
export default{
directives:{
'指令名称':'指令配置'
}
}
例:
export default{
directives:{
'reclick':directObj
}
}
;(function() {
/**
* 函数防抖
*
* @param {any} method 方法名
*/
function debounce(method) {
clearTimeout(method.tId);
method.tId = setTimeout(function() {
method.call();
}, 200);
}
/**
* 事件绑定
*
* @param {any} element 绑定dom
* @param {any} event 事件类型
* @param {any} listener 方法
*/
function addEvent(element, event, listener) {
if (element.addEventListener) {
element.addEventListener(event, listener, false);
} else if (element.attachEvent) {
element.attachEvent('on' + event, listener);
} else {
element['on' + event] = listener;
}
}
var vueReclick = {};
var reclick = {
bind: function(el, binding) {
addEvent(el, 'click', function() {
debounce(binding.value);
});
},
unbind: function(el) {
addEvent(el, 'click', function() {});
}
};
vueReclick.install = function(Vue) {
Vue.directive('reclick', reclick);
};
if (typeof exports == 'object') {
module.exports = vueReclick;
} else if (typeof define == 'function' && define.amd) {
define([], function() {
return vueReclick;
});
} else if (window.Vue) {
window.vueReclick = vueReclick;
Vue.use(vueReclick);
}
})();
1.将所有代码包裹在一个立即执行函数之中.
立即执行函数有自己的作用域,可以避免变量冲突与污染.
将独立的功能封装在自包含模块中.
2.vue-reclick功能相关的代码这里简单说明下.
这里封装了两个方法(1.throttle,2.addEvent)
一个指令配置对象(reclick)
在reclick对象里定义了bind方法,在指令绑定到dom的时候,在dom上绑定点击事件,并获取指令绑定的方法名称.
在触发点击事件的时候通过函数节流的方法来调用该方法,从而解决短时间快速点击触发多次方法的问题.
在reclick对象里定义了unbind方法,在指令与dom解绑的时候,将传入方法与dom进行解绑..
3.定义一个vueReclick插件对象,并在该对象上定义一个install方法.
(Vue.js 的插件应当有一个公开方法 install 。这个方法的第一个参数是 Vue 构造器)
4.在install方法里全局注册指令
vueReclick.install = function(Vue) {
Vue.directive('reclick', reclick);
};
5.兼容多种模块规范暴露该插件
if (typeof exports == 'object') {
module.exports = vueReclick;
} else if (typeof define == 'function' && define.amd) {
define([], function() {
return vueReclick;
});
} else if (window.Vue) {
window.vueReclick = vueReclick;
Vue.use(vueReclick);
}
6.到这一步,其实一个简单的自定义组件就已经大功告成了.
7.最后.我们来讲一下如何在项目中引入vueReclick并使用.
(1).非node环境中
在第5点我们在else if(window.Vue)中其实已经Vue的全局方法来使用该插件.
所以我们可以直接在项目中使用该指令.
例:https://github.com/webfansplz/vue-reclick/blob/master/example/index.html
(2).node环境中
我们可以在项目入口文件中引入该插件,然后全局使用它,下面我们会讲解如何将插件发布到npm.
例:
import vueReclick from 'vue-reclick';
Vue.use(vueReclick);
VueJS 实际开发中会遇到的问题,主要写一些 官方手册 上没有写,但是实际开发中会遇到的问题,需要一定知识基础。
Vue.js是一套构建用户界面的渐进式的前端框架。 vueJS与后台交互数据的方法我所了解的有以下几种
Vue是一套构建用户界面的JS渐进式框架。 Vue 只关注视图层, 采用自底向上增量开发的设计。讲解js高级之响应式、过渡效果、过渡状态。
深入理解Vue.js响应式原理。Vue教程有关的视频都讲到,我习惯响应式开发,在更早的Angular1时代,我们叫它:数据绑定(Data Binding)。你只需要在Vue实例的 data() 块中定义一些数据,并绑定到HTML
在vue组件中,为了使样式私有化(模块化),不对全局造成污染,可以在style标签上添加scoped属性以表示它的只属于当下的模块,这是一个非常好的举措,但是为什么要慎用呢?因为scoped往往会造成我们在修改公共组件(三方库或者项目定制的组件)的样式困难,需要增加额外的工作量
vue现在使用的人越来越多了,这篇文章主要整理一些比较优秀的移动端ui框架,推荐给大家,例如:mint UI、vux、vonic、vant、cube-ui、Muse-ui、Vue-Carbon、YDUI等
webpack是开发Vue单页应用必不可少的工具,它能管理复杂的构建步骤,并且优化你的应用大小和性能, 使你的开发工作流更加简单。在这篇文章中,我将解释使用webpack提升你的Vue应用的4种方式,包括:单文件组件、优化Vue构建过程、浏览器缓存管理、代码分离
Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决方案,通过对路由、视图、请求三个层面的控制,使开发者可以实现任意颗粒度的用户权限控制。
Web 中的组件其实就是页面组成的一部分,具有高内聚性,低耦合度,互冲突等特点,有利于提高开发效率,方便重复使用,简化调试步骤等。vue 中的组件是一个自定义标签形式,扩展原生的html元素,封装可重用的代码。
Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理、数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成、编译、挂着、销毁等过程进行js控制。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!