vue封装组件的正确方式-封装类似elementui的组件

vue

最近读了下element的源码,仿照他封装了两种不同的组件。

<template>

<!--src/component/custom/main.vue-->

    <div class = "contine">

<p class = "title">

{{title}}

</p>

<slot class = "contine" name = "contine">

</slot>

</div>

</template>

<script>

export default {

name:"test-component",

props:{

title:{

type : String,

default:"组件标题"

}

}

}

</script>

<style lang="scss" scoped>

$black : #333;

$mainSize : 16px;

$mainLineHeight:30px;

$lineCenter:center;

.extendStyle {

border-radius:$mainSize;

box-shadow: 3px 3px 3px 3px #333;

}

.contine{

width:50%;

height:130px;

color:$black;

font-size:$mainSize;

@extend .extendStyle;

.title,.contine{

color:$black;

font-size:$mainSize;

text-align:$lineCenter;

line-height:$mainLineHeight;

}

}

</style>

组件说明:只是一个简单的组件 显示一个标题和一段自定义slot内容(仅用作展示);我想通过以下方式引入

import TestModel from "./testComponent/index";

Vue.use(TestModel);

并且调用方法为:

<test-conponent title = "123">

<div slot = "contine">

2222

</div>

</test-conponent>

这么做,像不像element?是有点这个意思对吧,但是怎么实现呢,在这先说明下use的作用,其实就是相当于执行他的install方法,明白这个 之后 开始动工,思路:执行他的install方法,声明一个vue组件,组件内容就是上面写的,从而达到全局组件的目的,来看看我的js怎么写的:

import main from "./main";

main.install = (Vue) => {

Vue.component("test-conponent",main);

}

export default main;

没错就是这么一句,第一种的简单组件就写完了,一次引入 全局通用。

第二种、通过指令调用,比如element的loading组件等

<template>

<div class = "loading-container" v-show = "show">

<div class = "loading-mask"></div>

<div class="loading-content">

<div class="loading-animate"></div>

<div class="loading-text">

{{text}}

</div>

</div>

</div>

</template>

<script>

export default {

props:{

show:{

type:Boolean,

},

text:{

type:String,

default:"加载中...",

}

}

}

</script>

<style>

.loading-container {

position: relative;

text-align: center;

}

.loading-mask {

position:fixed;

top:0;

bottom:0;

left: 0;

right: 0;

background-color: rgba(0,0,0,.7);

}

.loading-content{

position:fixed;

left:50%;

top:45%;

z-index:999;

transform: translate(-50%,-45%);

text-align:center;

color:#fff;

}

.loading-content .loading-animate{

display:inline-block;

width:40px;

height:40px;

vertical-align: baseline;

margin:25px 0 10px;

vertical-align: middle;

animation:cricleLoading 1s steps(12,end) infinite;

background: transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat;

background-size: 100%;

}

.loading-content .loading-text{

font-size: 16px;

}

@-webkit-keyframes cricleLoading{

0%{

transform: rotate3d(0,0,1,0deg);

}

100%{

transform: rotate3d(0,0,1,360deg);

}

}

@keyframes cricleLoading{

0%{

transform: rotate3d(0,0,1,0deg);

}

100%{

transform: rotate3d(0,0,1,360deg);

}

}

</style>

以上是loading组件的内容,要通过这种方式引入:

import loading from "./toolTip";

Vue.use(loading);

并且通过指令方式调用

this.$loading.show({

text:"拼命加载中"

});

有的朋友可能会说了,这怎么可能啊,没有节点怎么放进去?对 没错 确实,没有节点是没办法进去的,但是没有节点就声明节点 对么?

import LoadingComponent from "./loading";

import Vue from "vue";

let instance;

const loadingConstructor = Vue.extend(LoadingComponent);

instance = new loadingConstructor({

el:document.createElement("div")

});

instance.show = false;

const loading = {

show(options = {}){

instance.show = true;

document.body.appendChild(instance.$el);

instance.text = options.text;

setTimeout(()=>{

loading.hide();

},5000)

},

hide() {

instance.show = false;

}

}

export default {

install(){

if(!Vue.loading){

Vue.$loading = loading;

}

Vue.mixin({

created(){

this.$loading = Vue.$loading;

}

})

}

}

实际上就是变相的利用install方法 吧loading指令挂到页面中,这样不管在哪里都可以直接用this.$loading调用。

以上就是本文所有分享

以上是 vue封装组件的正确方式-封装类似elementui的组件 的全部内容, 来源链接: utcz.com/z/380244.html

回到顶部