vue2和vue3的全局组件封装

vue2的组件封装

vue2封装组件是基于Vue.extend的封装

新建index.jstoast.vue文件
在这里插入图片描述
index.js入口文件

	
import toastComponent from './toast.vue'
import Vue from 'vue'
let instance;
const toast = function(text) {
  if(instance) {
    instance.text = text;
    instance.show()
    return
  }
  const toastFn = Vue.extend(toastComponent)
  instance = new toastFn({
    propsData:{
      text:text
    }
  })
  instance.$mount(document.createElement('div'))
  document.body.appendChild(instance.$el)
}

export default toast

toast.vue组件内容

<template>
  <div v-show="isshow" class="toast">{{ text }}</div>
</template>

<script>
export default {
  props:{
    text:{
      type:String,
      default:""
    }
  },
  data() {
    return {
      isshow:false,
      timeid:null
    }
  },
  mounted() {
    this.show()
  },
  methods:{
    show() {
      this.isshow=true;
      clearTimeout(this.timeid);
      this.timeid = setTimeout(() => {
        this.isshow=false;
      }, 3000)
    }
  }
}
</script>

<style lang="less" scoped>
.toast{
    position: fixed;
    width: 3.6rem;
    line-height: 0.6rem;
    text-align: center;
    left: 50%;
    bottom: 1rem;
    margin-left: -1.8rem;
    color: #ffffff;
    font-size: 0.28rem;
    background: rgba(0, 0, 0, 0.5);
    z-index: 999;
}
</style>

vue2的使用方法

可以直接挂载到全局,每个页面的this可以直接用

import toast from "@/component/toast"

Vue.prototype.$toast= toast;

也可以在每个页面需要的时候,再加在

import toast from "@/component/toast"

toast('弹窗')

vue3的组件封装

由于vue3取消了extend,所以如果想获取组件的$el需要换个写法

index.js入口文件

import toastComponent from "./toast.vue";
import { createApp } from "vue";
let instance;
const toast = function(text) {
  if (instance) {
    instance.text = text;
    instance.show();
    return;
  }
  instance = createApp(toastComponent).mount(document.createElement("div"));
  instance.text = text;
  document.body.appendChild(instance.$el);
};

export default toast;

toast.vue插件内容

<template>
  <div v-show="isshow" class="toast">{{ text }}</div>
</template>

<script>
import { toRefs, reactive } from "vue";
export default {
  props: {
    text: {
      type: String,
      default: ""
    }
  },
  setup(props) {
    let state = reactive({
      text: props.text,
      isshow: true
    });
    let timeid = null;

    function show() {
      state.isshow = true;
      clearTimeout(timeid);
      timeid = setTimeout(() => {
        state.isshow = false;
      }, 3000);
    }
    show();
    return {
      ...toRefs(state),
      show
    };
  }
};
</script>

<style lang="less" scoped>
.toast {
  position: fixed;
  width: 360px;
  line-height: 60px;
  text-align: center;
  left: 50%;
  top: 100px;
  margin-left: -180px;
  color: #ffffff;
  font-size: 16px;
  background: rgba(0, 0, 0, 0.5);
  z-index: 999;
}
</style>

vue3的组件使用方法

可以按需使用,跟vue2的使用方法一样

也可以全局挂载

const app = Vue.createApp({})

app.config.globalProperties.toast = toast

但这仅限于使用options API

如果使用 Composition API

官方还是推荐使用 provideinject 方式

Vue 2和Vue 3在组件封装方面有一些区别。下面是一些主要的区别: 1. 语法:Vue 2使用的是Options API,而Vue 3引入了Composition API。Options API基于选项对象,在一个对象中定义组件的选项,但随着组件变得复杂,选项对象可能会变得冗长。Composition API允许开发者通过函数的形式来组织组件的逻辑,使代码更易维护和重用。 2. 组件注册:在Vue 2中,我们使用Vue.component()全局注册组件或者通过components选项在局部注册组件。而在Vue 3中,全局注册的方法变成了app.component(),而且不再需要通过Vue实例来进行注册。 3. Props 的类型声明:在Vue 2中,我们需要使用props选项来声明组件的Props,并可以指定各个prop的类型、默认值等信息。而在Vue 3中,可以使用`<script setup>`语法来声明Props并给它指定类型。 4. 生命周期钩子:在Vue 2中,我们使用各种生命周期钩子函数来处理组件的生命周期事件。而在Vue 3中,Options API中的生命周期钩子函数仍然可用,但推荐使用Composition API中的函数式API来处理。 5. Transition/动画:Vue 2中有内置的transition和动画系统,可以通过<transition>和<transition-group>标签来实现。而在Vue 3中,这些功能被迁移到了单独的@vue/transition和@vue/animation库中,需要额外安装和引入。 需要注意的是,Vue 3在组件封装方面引入了更多的改进,并且提供了更强大和灵活的开发体验。但由于Vue 3相对于Vue 2来说还比较新,一些库和插件可能还没有完全适配Vue 3,因此在升级之前需要考虑项目的具体情况和可行性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值