问题描述
我能够通过在src / index.js文件中导出单个vue指令来创建npm包。但是我如何创建一个包,让您使用多个vue指令。我无法在同一index.js文件中导出两个vue指令。
export default Vue.directive('directive1',{
inserted: function (el,binding,vnode) {
el.addEventListener('mouseup',(e) => mouseup(e,el,_data))
el.addEventListener('mousedown',(e) => mousedown(e,_data))
el.addEventListener('mousemove',(e) => mousemove(e,_data))
setDraggerOffset(el,_data)
}
})
export default Vue.directive('directive2',_data)
}
})
解决方法
您正在尝试导出两个默认值。默认值表示您只需说import MyPack from 'path/to/package'
就可以获取值。您需要导出常量,并在要导入的位置进行销毁。 Learn more here
在包裹中
export const vD1 = Vue.directive('directive1',{
...
})
export const vD2 = Vue.directive('directive2',{
...
})
您要导入的位置:
import { vD1,vD2 } from 'path/to/package';
,
选中Vue Guide: Writing one plugin,我们可以按照本指南来开发指令,然后允许用户通过第二个参数= options
激活特定的指令。
就像下面的演示(假设导出myDirectives
,并且仅启用directive1
):
let myDirectives = {}
let _defaultDirectives = ['directive1','directive2']
myDirectives.directive1 = {
inserted: function (el,binding,vnode) {
el.addEventListener('mouseup',(e) => mouseup(e,el,_data))
el.addEventListener('mousedown',(e) => mousedown(e,_data))
el.addEventListener('mousemove',(e) => mousemove(e,_data))
console.log('directive1',`setDraggerOffset(el,_data)`)
}
}
myDirectives.directive2 = {
inserted: function (el,_data))
console.log('directive2',_data)`)
}
}
myDirectives.install = function (Vue,options) {
let selectedDirectives = (options && options.directives) || _defaultDirectives
selectedDirectives.forEach((directive) =>
Vue.directive(directive,this[directive])
// this[directive + 'Definition'] = Vue.directive(directive,this[directive])
)
}
// export default myDirectives
// Vue.use(myDirectives) // default option is register both directive1 and directive 2
Vue.use(myDirectives,{directives: ['directive1'] }) // register directive1 only
// console.log('Definition',myDirectives.directive1Definition,myDirectives.directive2Definition)
new Vue({
el: '#app'
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<span v-directive1></span>
<span v-directive2></span>
</div>