教你如何封装功能组件和页面组件

如果你是学的vue框架 ,那么你是必须要进行组件的封装。不然当一个页面的代码过多的时候就令人看起来冗余,也容易产生一些变量的污染,让别人看起来显得不太专业

话不多唠,开始上干货

一.components

找到创建vue文件的components文件,这个文件将会是我们用来封装一些公共的组件,在里面创建一个index.ts的文件 ,正如图上所示,这个文件 正是components文件的下一级

         

 

 二.进行一些简单功能组件的封装

当我们写一些页面功能的时候,一些消息的提示框或者确认框看起来简单的实用,但其中也分为自己封装或者一些插件,

下载一些插件,只用了其中的一个功能,会是很浪费内存的,这个时候 我们可以自己进封装,然后调用就可以了

 

首先。在components文件另开拓一个文件夹,然后在components下一级的index文件中导入并注册全局

因为 我使用的是vue3 +ts 则需要src 文件下进行类型声明 (进行类型的好处就是 当有错误或者渲染的时候有提示)

 这里就是components下文件的内容 ,到这里一个全局组件和内容 就已经完成的差不多了

<script lang="ts" setup>
import { onMounted, ref } from 'vue';
// 导入页面初始化状态和响应式ref
import { MessageType } from './type';
// 导入在type定义的数据状态


defineProps<{
 type: MessageType,
 text: string
}>()

// 定义一个对象,包含三种情况的样式,对象key就是类型字符串
const style = {
  warning: {
    icon: 'icon-warning',
    color: '#E6A23C',
    backgroundColor: 'rgb(253, 246, 236)',
    borderColor: 'rgb(250, 236, 216)',
  },
  error: {
    icon: 'icon-shanchu',
    color: '#F56C6C',
    backgroundColor: 'rgb(254, 240, 240)',
    borderColor: 'rgb(253, 226, 226)',
  },
  success: {
    icon: 'icon-queren2',
    color: '#67C23A',
    backgroundColor: 'rgb(240, 249, 235)',
    borderColor: 'rgb(225, 243, 216)',
  },
}

// 初始隐藏
const isShow = ref(false)

// dom渲染完成,显示
onMounted(() => {
  isShow.value = true
})
</script>


// 这里是内容
<template>
  <Transition name="down">
    <div class="xtx-message" :style="style[type]" v-show="isShow">
    <i class="iconfont" :class="style[type].icon"></i>
    <span class="text">{{text}}</span>
  </div>
  </Transition>
</template>


//  这里是一些消息提示的状态和样式

<style scoped lang="less">
.down-enter-from {
  transform: translateY(-70px);
}
.down-enter-active {
  transition: transform 0.5s;
}
.xtx-message {
  width: 300px;
  height: 50px;
  position: fixed;
  z-index: 9999;
  left: 50%;
  margin-left: -150px;
  top: 25px;
  line-height: 50px;
  padding: 0 25px;
  border: 1px solid #e4e4e4;
  background: #f5f5f5;
  color: #999;
  border-radius: 4px;
  i {
    margin-right: 4px;
    vertical-align: middle;
  }
  .text {
    vertical-align: middle;
  }
}
</style>

但还需要进行下一步

因为使用的是v3需在message文件下面在声明两个类型

 声明的三个状态 使用type进行声明类型 加联合类型

 messzge下面的index文件: 运用到vue自带的两个函数, {h} 和{render}函数

h函数:创建一个虚拟的dom

render函数:将一个虚拟dom挂载到真实的dom上

// 导入XtxMessage.vue组件
// 通过代码的方式去渲染它

import { h, render } from 'vue'
import { Message } from './type'

import XtxMessage from './XtxMessage.vue'

// 创建一个dom容器
// 把这个容器添加在body上
const div = document.createElement('div')
div.className = "xtx-message-container"
document.body.appendChild(div)

// 调用这个函数
let timer = -1
export default function Message(obj: Message) {
  const vNode = h(XtxMessage, {type: obj.type, text: obj.text})

  // 把虚拟dom放入上面定义的容器中
  render(vNode, div)

  // 清除定时器
  clearTimeout(timer)
  // 开启定时器
  timer = window.setTimeout(() => {
    // 从dom上删除
    render(null,div)
  }, obj.duration || 2000)
}

Message.success = (value: string) => {
  Message({ type: "success", text: value, duration: 1500 })
}

Message.error = (value: string) => {
  Message({ type: "error", text: value, duration: 1500 })
}

Message.warning = (value: string) => {
  Message({ type: "warning", text: value, duration: 1500 })
}

然后这个时候我们所做的就已经进本完成了

我们需要在哪个页面使用的时候 直接用这个全局组件即可

创建一个新的页面可以测试使用

 

 三.页面组件

页面组件解决代码冗余和变量污染

写一个主页面的时候,我们可以拆分为两个部分或者更多,可以在其他页面写代码然后导入到主页面,在vue2中 需要用到components注册组件才能使用,

而在vue3 就不大同,vue3 可以直接进行组件的使用,把组件放在你想要放得地方

 示例上面代码: 上面代码是我封装的页面一些局部的组件。使用起来相对比v2比较方便一点

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值