通过npm引用的vue组件使用详解


Posted in Javascript onMarch 02, 2017

 什么是组件:组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能。在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展。

    如何注册组件?

    需要使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件。Vue.extend方法格式如下:

var MyComponent = Vue.extend({
  // 选项...后面再介绍
})

    如果想要其他地方使用这个创建的组件,还得个组件命个名:

Vue.component('my-component', MyComponent)

   命名之后即可在HTML标签中使用这个组件名称,像使用DOM元素一样。

本文章通过实现一个vue-dialog的弹出层组件,然后附加说明如果发布此包到npm,且能被其他项目使用。

功能说明

  • 多层弹出时,只有一个背景层。
  • 弹出层嵌入内部组件。
  • 弹出层按钮支持回调
  • 源码下载

实现

通过npm引用的vue组件使用详解

  • 多层弹出时,只有一个背景层
  • 利用两个组件实现,一个背景层组件(只提供一个背景层,组件名:background.vue),一个弹出层内容管理组件(实现多个内容层的管理,组件名:master.vue)。
  • 弹出层嵌入内部组件

使用vue的component组件实现,他可以完美支持。

弹出层按钮支持回调

在master.vue中实现,详细解析此代码

html代码

<template>
 <div> 
  <div class="modal-content" v-for="(comp,index) in comps" v-bind:style="style(index,comp)" >
   <div class="modal-header" >
   header
   </div>
   <div class="modal-body">
   <component :is="comp"></component>
   </div>
   <div class="modal-footer">
   <button type="button" class="btn btn-default" v-on:click="clickHandler(btn.value, comp, index)" v-for="btn in btns" >{{btn.text}}</button>
   </div>
  </div> 
  <hDialogBack ref="back" v-bind:z-index="realIndex-1" ></hDialogBack>
 </div>
</template>
  • comps:内部组件的集合
  • realIndex:一个computed属性,读取props的mIndex属性,表示内部层的zIndex层级关系。
  • component加载组件
  • btns:表示按钮的集合,现还不支持组件独立配置按钮列表。
  • style:此方法用于生成内部组件居中的css代码。

js代码:

<script>
import hDialogBack from './background'

function getclientPoint () {
 return {
 width: document.documentElement.clientWidth || document.body.clientWidth,
 height: document.documentElement.clientHeight || document.body.clientHeight
 }
}

export default {
 name: 'HDialog',
 data () {
 return {
  comps: []
 }
 },
 props: {
 'btns': {
  type: Array,
  default: function () {
  return [{ text: 'ok', value: 'ok'}, { text: 'cancel', value: 'cancel'}]
  }
 },
 'mIndex': {
  type: Number,
  default: 19861016
 }
 },
 computed: {
 realIndex: function () {
  return this.mIndex
 }
 },
 components: {
 hDialogBack
 },
 methods: {
 open: function (comp) {
  comp.promise = new Promise(function (resolve, reject) {
  comp.resolve = resolve
  comp.reject = reject
  })
  comp.width = comp.width || 600
  comp.height = comp.height || 400
  this.comps.push(comp)
  if (!this.$refs.back.show) {
  this.$refs.back.open()
  }
  return comp.promise
 },
 clickHandler: function (type, comp, index) {
  let self = this
  let close = function () {
  self.comps.splice(index, 1)
  if (self.comps.length === 0 && self.$refs.back.show) {
   self.$refs.back.close()
  }
  }
  /** 只提供promise模式 */
  comp.resolve({'type': type, 'close': close})
 },
 style: function (index, comp) {
  let point = getclientPoint()
  return {
  zIndex: this.realIndex + index,
  width: comp.width + 'px',
  height: comp.height + 'px',
  left: ((point.width - comp.width) / 2) + 'px',
  top: ((point.height - comp.height) / 2) + 'px'
  }
 }
 }
}
</script>
  • open方法,用于打开弹出层,且返回一个Promise。
  • 嵌入background.vue组件,用于提供背景层。
  • clickHandler方法:master.vue组件按钮的事件响应函数,会resolve在open方法中提供的promise。

css代码:

<style>
.modal-content {
 position: absolute;
}
</style>

如何实用

  • 首先需要在顶层引入master.vue,然后嵌入到与app组件平级,如下代码:
new Vue({
 el: '#app',
 template: '<div><App></App><HDialog ref="hDialog" ></HDialog></div>',
 components: { App }
})

一定要指定ref值,这是弹出层实现的关键。

  • 在任意一个子组件中如下使用:
let promise = this.$root.$refs.hDialog.open({
  template: '<div>第二层了</div>'
 })
 promise.then(function (arg) {
  alert('第二层' + arg.type)
  arg.close()
})
  • 使用$root.$refs找到弹出层管理组件
  • 使用调用其open方法,并接受一个promise类型的返回值
  • 使用promise即可。

发布到npm

  • 如果组件需要被其他人引用,最好使用commonjs2规范,webapck如下配置:
output: {
path: './dist',
filename: '[name].js',
library: 'vue-hdialog',
libraryTarget: 'commonjs2'
}
  • 在npmjs上注册一个账号
  • 利用npm login 登录
  • 使用npm publish 发布,如果你想卸载可以用npm unpublish --force.
  • 发布是需要package.json检测version和name字段,如果已存,或者是存在被卸载的都不行。
  • package.json中的main节点是指定其他引用时,默认导出的文件。

以上所述是小编给大家介绍的通过npm引用的vue组件使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
索趣科技的答案
Feb 07 Javascript
ASP中Sub和Function的区别说明
Aug 30 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
js图片预加载示例
Apr 30 Javascript
node.js中的path.isAbsolute方法使用说明
Dec 08 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
React 组件中的 bind(this)示例代码
Sep 16 Javascript
分享Angular http interceptors 拦截器使用(推荐)
Nov 10 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 #Javascript
vue-dialog的弹出层组件
May 25 #Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 #Javascript
基于Bootstrap的网页设计实例
Mar 01 #Javascript
JS中的作用域链
Mar 01 #Javascript
javascript html5轻松实现拖动功能
Mar 01 #Javascript
详解数组Array.sort()排序的方法
May 09 #Javascript
You might like
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
Javascript的&amp;&amp;和||的另类用法
2014/07/23 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
农药学硕士毕业生自荐信
2013/09/25 职场文书
一年级评语大全
2014/04/23 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
开学典礼观后感
2015/06/15 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书