自己封装 vue 组件 和 插件
vue 组件
一、组件的创建,两种方法。(本质上是1、2两种,vue文件,只是创建了一个 组件选项对象,仅是一个js对象)
1、定义组件:Vue.component('button-counter',{})。这种方法创建的组件,只能使用在父组件中,无法使用在插件中。因为在不挂载组件时,无法获取到组件对象。
Vue.component('my-component',{
template : '<h3>这是使用 Vue.component 创建的组件</h3>',
data(){
return {}
},
methods: {
}
})
2、通过Vue.extend({}) ,再实例化一个组件出来。 https://www.w3cplus.com/vue/vue-extend.html
个人理解:Vue.extend() 方法 的 作用就是将一个 组件选项对象 变成一个 组件类。可以直接把 导入的 vue组件 ,作为 Vue.extend() 的参数。
let baseExtend = Vue.extend({
template: `<p> {{ firstName }} {{ lastName }} aka {{ alias }}</p>`,
data() {
return {
firstName: '大漠',
lastName: 'w3cplus',
alias: '大漠_w3cplus'
}
},
created() {
console.log('onCreated-1');
}
})
new baseExtend() // 实例化一个组件
等同于:
// test.vue (把上面的组件选项对象,写入一个 vue文件中)
。。。
import test from './test.vue' // 引入 一个vue组件文件 let baseExtend = Vue.extend(test) // 这里通过打印test,发现test和上面的 Vue.extend()的参数属性名不完全相同。但是通过 Vue.extend() 后是一样。个人猜测 vue组件文件 导入 ,应该是webpack 做了某些处理了。不用去深究。 new baseExtend() // 实例化一个组件
3、vue文件(这个其实没有创建组件):vue文件的组件,其它的地方使用,一定要先导入,导入获得的只是一个有关这个组件的 js对象,还不是一个组件(应该就是1和2中参数中的对象)。
要使用这个组件,还需要把这个 js对象注入到组件中。(我猜使用Vue.extend应该也是可以的)
感悟:通过打印 import ToastComponent from './toast.vue' console.log(ToastComponent) 发现 ToastComponent 中 template 属性,但是里面有其它的属性。
vue文件是webpack才有的,直接 导入一个 vue文件,得到 一个 组件选项对象。虽然打印出来,和 直接写的 组件选项不完全一样。但是两者其实是一样的。应该是webpack对vue文件导入时做过处理,毕竟vue文件里还有css呢。
二、组件的使用:https://blog.csdn.net/WU5229485/article/details/82908068
1、组件在父组件的使用,只要组件注册(个人理解,就是创建一个挂载这个组件的标签)到父组件中就可以使用。当然,全局使用就全局注册。
2、组件在插件中的使用,必须要获取到这个组件对象才能使用。因为组件在插件中使用是不需要生成挂载标签的。一般是通过手动挂载的。
三、获取组件实例:
1、Vue.component注册的组件,必须在使用组件的时候,通过$refs属性获得。无法直接在没有挂载组件时,获取组件实例。
2、Vue.extend 获取组件实例很简单,直接new一个实例出来就可以了。插件中需要组件实例,都是用这种方式获取到的。
vue 插件
1、vue 插件 格式:
说明:install方式的插件,其实就是方便把插件注册到Vue对象上。就是把插件挂载在Vue对象下,这样在其他的地方使用时,可以不用引入Vue(就像Vue内置的功能一样使用,比如指令、方法、属性等)。
var MyPlugin = {}
MyPlugin.install = function (Vue, options) {
Vue.myGlobalMethod = function () { // 1. 添加全局方法或属性,如: vue-custom-element
// 逻辑...
}
Vue.directive('my-directive', { // 2. 添加全局资源:指令/过滤器/过渡等,如 vue-touch
bind (el, binding, vnode, oldVnode) {
// 逻辑...
}
...
})
Vue.mixin({
created: function () { // 3. 通过全局 mixin方法添加一些组件选项,如: vuex
// 逻辑...
}
...
})
Vue.prototype.$myMethod = function (options) { // 4. 添加实例方法,通过把它们添加到 Vue.prototype 上实现
// 逻辑...
}
}
2、纯 js (不需要显示 html 标签)的插件很简单,很好开发。
// MyPlugin.js
var MyPlugin = {}
MyPlugin.install = function (Vue, option) {
Vue.prototype.$msg = 'hello'
}
// main.js
import MyPlugin from './Plugins/MyPlugin'
Vue.use(MyPlugin) // 这一步的作用是自动 调用插件里面的install方法,同时把Vue和option两个参数传递进去
// 使用的页面中
console.log(this.$msg)
3、需要显示 内容(即需要html标签显示的)的插件开发。如:Toast 插件 的开发 https://www.cnblogs.com/linxin/p/6637904.html 或 https://www.cnblogs.com/DangerousBaymax/p/9116453.html(亲测有效)
// Toast.js
var MyPlugin = {}
MyPlugin.install = function (Vue, option) {
Vue.prototype.$Toast = (tips) => {
let ToastTpl = Vue.extend({ // 1、创建构造器,定义好提示信息的模板
template: '<div class="vue-toast">' + tips + '</div>'
})
let tpl = new ToastTpl().$mount().$el // 2、创建实例,在文档之外渲染成
document.body.appendChild(tpl) // 3、把创建的实例添加到body中
setTimeout(function () { // 4、延迟2.5秒后移除该提示
document.body.removeChild(tpl)
}, 2500)
}
}
// main.js
import MyPlugin from './Plugins/MyPlugin'
Vue.use(MyPlugin) // 这一步的作用是自动 调用插件里面的install方法,同时把Vue和option两个参数传递进去
// 使用的页面中
this.$Toast('Global')
4、使用vue文件,作为组件的插件。https://blog.csdn.net/Wbiokr/article/details/78881308
// toast.vue
<template>
<div>{{msg}}</div>
</template>
<script>
export default {
data () {
return {
msg: ''
}
}
}
</script>
// toast.js
import toast from './toast.vue' var plugin = {}
plugin.install = (Vue, option) => {
Vue.prototype.$toast = (msg) => {
var ToastClass = Vue.extend(toast)
var ToastCom = new ToastClass()
ToastCom.msg = msg
var Dom = ToastCom .$mount().$el
document.body.appendChild(Dom)
}
} export default plugin
this.$toast('数据')
5、自己写一个图片放大浏览的插件:
涉及的概念:
a、组件构造器 (Vue.extend),再组件实例化。 https://cn.vuejs.org/v2/api/#Vue-extend(官网)
b、组件名.$mount():手动将组件挂载到DOM 中 (和Vue初始化的el属性是一样的功能)。 https://cn.vuejs.org/v2/api/#vm-mount(官网)
c、组件的 $el 属性:获取相应 vue(或组件)实例渲染($mount方法没有参数,就有渲染成DOM功能)后的DOM对象。 https://cn.vuejs.org/v2/api/#vm-el (官网)
总结:(个人)插件不一定非得使用Vue.use(install)的方法开发,直接写一个方法也是可以的。然后把这个方法挂载Vue实例上就可以了(官方推荐使用Vue.use这种方法)。
需要组件的插件,难点在于,生成组件,并且把组件的标签手动挂载在DOM上。
四、Vue.component(el,{}) 和 Vue.extend({})有什么区别 https://www.cnblogs.com/battle-wang/p/9673577.html
1、Vue.component 作用是将组件注册到挂载标签el上。Vue.extend({})创建的组件类,需要使用vue.component进行实例化、或使用new extendName().$mount(''+el)方式进行实例化(从而实现模拟组件)
自己封装 vue 组件 和 插件的更多相关文章
- 封装Vue组件的一些技巧
封装Vue组件的一些技巧 本文同步在个人博客shymean.com上,欢迎关注 写Vue有很长一段时间了,除了常规的业务开发之外,也应该思考和反思一下封装组件的正确方式.以弹窗组件为例,一种实现是在需 ...
- 手把手教你封装 Vue 组件,并使用 npm 发布
Vue 开发插件 开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: // 这里注意一下包的名字前缀是 ...
- 手把手教你封装 Vue 组件并使用 NPM 发布
Vue 开发插件 我们可以先查看Vue的插件的开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: ps: 这里注意一下包的名 ...
- 封装 vue 组件的过程
首先,组件可以提升整个项目的开发效率.能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发的缺点:效率低,难维护,复用性等问题: 然后,使用Vue.extend方法创建一个组件,然后使用 Vue ...
- 如何封装使用api形式调用的vue组件
在实际开发中一般有两种封装vue组件的方法:一种就是常用的的通过props父组件传值给子组件的方法: 子组件 父组件: 还有一种就是通过调用api的形式,下面例子是本人在实际项目中封装的一个自定义图标 ...
- 封装Vue Element的table表格组件
上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...
- element el-table表格的vue组件二次封装(附表格高度自适应)
基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...
- vue2.0 如何自定义组件(vue组件的封装)
一.前言 之前的博客聊过 vue2.0和react的技术选型:聊过vue的axios封装和vuex使用.今天简单聊聊 vue 组件的封装. vue 的ui框架现在是很多的,但是鉴于移动设备的复杂性,兼 ...
- 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm
前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...
随机推荐
- CSD编码----数字信号处理--006
有符号数(Signed Digit Number , SD) SD编码 1.有三重值 {0,1,-1} 2.应用在不用进位的加法器或乘法器中能够降低复杂性 因为通常可以通过非零元素的数来估计乘法的工作 ...
- Activity 启动模式总结
Activity 启动模式: 1. standard: 默认启动模式,每次启动一个Activity都会重新创建一个实例: 2. singleTop: 栈顶复用模式,新Activity位于任务栈的栈顶, ...
- CMMI模型
CMMI的成熟度级别 初始级(过程不可预测,管理和控制差,是反应式的)管理级(过程处于项目级,经常是反应式的)定义级(过程已经提升到组织级(OSSP))定量管理级(对过程进行度量,并进行统计控制)优化 ...
- 用K-近邻算法分类和回归
import numpy as npfrom matplotlib import pyplot as plt X_train = np.array([ [158, 64], [170, 66], [1 ...
- Redis入门很简单之七【使用Jedis实现客户端Sharding】
Redis入门很简单之七[使用Jedis实现客户端Sharding] 博客分类: NoSQL/Redis/MongoDB redisjedisspringsharding分片 <一>. 背 ...
- Workflow:Workflow 百科
ylbtech-Workflow:Workflow 百科 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”.是对工作流程及其各操作步骤之间业务规则的抽象.概括描述.在计 ...
- CSS-使整个页面上的全部元素可编辑
# [在线预览](https://jsfiddle.net/1010543618/6zu1gush/) ## 方法一 - 使用 html 的 contenteditable 属性: [HTML 5 全 ...
- 距离矢量路由协议——RIP
距离矢量路由协议RIP: 众所周知,RIP(Routing Information Protocol),即路由信息协议,是一种距离矢量路由协议,它与IGRP,OSPF等一样都是属于IGP(Interi ...
- C语言|博客作业6
一.本周教学内容&目标 第3章 分支结构 3.1-3.2 使学生熟悉多分支结构.字符型数据类型和逻辑运算符. 二.本周作业头 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...
- Django token 学前小知识
1,base64 '防君子不防小人' 方法 作用 参数 返回值 b64encode 将输入的参数转化为base64规则的串 预加密的明文,类型为bytes:例:b‘guoxiaonao’ base64 ...