通过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 相关文章推荐
IE中直接运行显示当前网页中的图片 推荐
Aug 31 Javascript
js处理自己不能定义二维数组的方法详解
Mar 03 Javascript
利用a标签自动解析URL分析网址实例
Oct 20 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
Dec 02 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 Javascript
早该知道的7个JavaScript技巧
Jun 21 Javascript
Angular4学习教程之DOM属性绑定详解
Jan 04 Javascript
vue中实现回车键登录功能
Feb 19 Javascript
vue实现div单选多选功能
Jul 16 Javascript
jQuery实现二级导航菜单的示例
Sep 30 jQuery
详解Vue中的自定义指令
Dec 07 Vue.js
完美解决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教程 预定义变量
2009/10/23 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
python添加模块搜索路径方法
2017/09/11 Python
基于python实现百度翻译功能
2019/05/09 Python
wxpython绘制圆角窗体
2019/11/18 Python
Python对wav文件的重采样实例
2020/02/25 Python
python os.listdir()乱码解决方案
2021/01/31 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
SQL Server数据库笔试题和答案
2016/02/04 面试题
护理专业本科生自荐信
2013/10/01 职场文书
个人简历自我评价
2014/01/06 职场文书
考博专家推荐信
2014/05/10 职场文书
公司会议策划方案
2014/05/17 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
使用JS实现简易计算器
2021/06/14 Javascript
简单聊聊Golang中defer预计算参数
2022/03/25 Golang