vue封装单文件弹窗组件

简介:   VUE想要实现一个普通弹窗,想必对于大部分前端开发者来说实现起来都是非常简单一件事情,但是如果说要封装某一个具体需求效果,可能就难倒不少同学 ,由此可见 从实现到封装这个过程是非常考验个人能力的!

普通弹窗无非就是新建弹窗文件 引用注册 提供一些数据 再加上某些函数 就能写好一个弹窗组件在页面使用

<template>
  <div>
    <messageBox v-if="show">弹出提示</messageBox>
    <button @click="show = true">显示</button>
  </div>
</template>
<script>
import messageBox from '../component/alert.vue';//引入组件
  export default {
    
    components: {
     messageBox },//注册
    data () {
    
      return {
    
        show: false
      }
    }
  }
  </script>

这种弹窗简单是简单 可需求只要一个弹窗 真的有必要每个地方都引入注册在使用做一大堆重复操作吗?就像原生的JS弹窗就一个alert()就搞定的事情,到VUE里怎么还变复杂了呢,所以如果说要想把弹窗封装起来的话就需要考虑到代码易用性,实现一个弹窗可以很复杂,封装的时候多写点代码无所谓,反正封装只写一次,但是!使用的时候一定要简单,越简单越好,因为用的次数远远大于你封装实现的次数,一次封装无数次使用,那具体如何封装呢?
首先需要考虑的是 不需要在做成某一个具体组件了,就单单一个普通的JS函数即可实现
找到文件目录 新建一个文件夹 utils 在新建一个工具函数message.js 导出一个函数showMsg 参数为自定义消息 onClick则为具体的回调函数,当点击确定按钮之后执行的事情
```js

export function showMsg(msg,onClick){
}

​
要想使用弹窗首先需要渲染这个弹窗 ,具体渲染逻辑vue.js官方文档就写的很清楚,我们只需要把对应的内容改成我们所需要的
![image.png](https://ucc.alicdn.com/pic/developer-ecology/mc4u467rasmms_79faa4a6c6354bb9b4af76cd247f20aa.png)
 创建一个根组件,然后挂载到页面上的某一个元素

导入根组件 
​```js
export function showMsg(msg, onClick) {
  //在页面创建一个DIV元素
  const div = docutment.createElement('div')
  docutment.body.appendChild(div)
  //渲染组件到界面上
  const app = createApp(MessageBox,{
    //传递事件 传递消息 执行关闭弹窗
    msg,
    onClick(){
      onclick(()=>{
        //关闭弹窗即 移除div
        app.remove(div)
      })
    }
  });
  // 挂载div
  app.mount(div)
}


MessageBox 为挂载的组件

这时候乍一看 这不就是 新建个 组件只不过是通过函数调用挂载到页面吗。

别着急接着往下看

   一个程序首先要满足高内聚低耦合 到目前为止 一个弹框实际上还是使用了两个文件 一个js文件一个vue文件  一个功能使用两个文件 显然是违背高内聚了,在这里的MessageBox无非就是一个组件,那该怎么想办法把组件文件 写到js文件里面来呢?这就考验大家对vue组件的理解程度了,脱离了单文件如何写代码呢。

  其实也不难,要明白组件的本质是什么呢?很明显组件的本质就是一个对象!一个配置对象,始终要记住,万物皆对象。脱离单文件我们直接把这个对象写到js里不就实现了 这个时候就需要使用的render函数了 render渲染JSX具体可以去官方文档一探究竟

Vue 提供了一个 h() 函数用于创建 vnodes:h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。这个名字来源于许多虚拟 DOM 实现默认形成的约定。一个更准确的名称应该是 createVnode(),但当你需要多次使用渲染函数时,一个简短的名字会更省力。

​ 需要注意的是在JSX语法里是不支持大胡子语法的需要使用react那种写法



const MessageBox = {
   
  props: {
   
    //组件配置例如函数参数等
    msg: {
   
      type: String,
      required: true
    }
  },
//ctx指上下文
  render(ctx) {
   
//通过上下文拿到属性和emit方法
   const {
    {
   mathJaxContainer[0]}emit } = ctx;
     return  <div> <div>{
   {
   mathJaxContainer[1]}{
   emit('onClick')}">关闭</button> </div>
  }
};

关于css样式 除了行内样式 还可以参照react CSS in JS 随便找一个工具库能在js里写css即可!
```js

const MessageBox = {
props: {
//组件配置例如函数参数等
msg: {
type: String,
required: true
}
},
//ctx指上下文
render(ctx) {
//通过上下文拿到属性和emit方法
const { $props, $emit } = ctx;
return

{$props.msg}
目录
相关文章
|
9天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
13天前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
22 1
|
13天前
|
JavaScript 前端开发 Java
《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense
《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense
25 2
|
14天前
|
Java
vue3知识点:Teleport组件
vue3知识点:Teleport组件
24 1
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
83 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
82 0
|
JavaScript
vue父子组件传值
vue父子组件传值
|
JavaScript
vue兄弟组件传值 方便快捷
vue兄弟组件传值 方便快捷