通过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 相关文章推荐
JavaScript replace(rgExp,fn)正则替换的用法
Mar 04 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
Javascript简单实现面向对象编程继承实例代码
Nov 27 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
Bootstrap Scrollspy源码学习
Mar 02 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
Mar 31 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
基于AngularJS的简单使用详解
Sep 10 Javascript
详解html-webpack-plugin用法全解
Jan 22 Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 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 Cookie的一个使用注意点
2008/11/08 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python迭代dict的key和value的方法
2018/07/06 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
Python自动创建Excel并获取内容
2020/09/16 Python
最好的商品表达自己:Cafepress
2019/09/04 全球购物
党员学习新党章思想汇报
2014/10/25 职场文书
放假通知范文
2015/04/14 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android