初学福音,手把手带你vue封装弹框组件并全局注册使用~

Posted 北极光之夜。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学福音,手把手带你vue封装弹框组件并全局注册使用~相关的知识,希望对你有一定的参考价值。

一.话不多,先上效果:

  大家好呀,好久不见,最近还好吗?今天分享个vue封装弹框组件的内容,并全局注册它,虽然内容比较简单,但是刚入门vue的小伙伴可以友好的了解组件封装思想~ (最后有完整源码)

基本效果:

弹框里内容可以自定义内容放入标签等:

二.具体实现:

1.先确定弹框组件有什么功能:

 <SpringFrame
      :title="'江湖'"
      :isShow="true"
      @cancel="cancel"
      @confirm="confirm"
    >
     xxxx自定义内容
</SpringFrame>

组件名就叫SpringFrame,可以自定义传个标题title的值;isShow是一个布尔值,控制弹框是否显示隐藏,一般用变量;cancel是点击确认触发的事件;confirm是点击取消触发的事件;

2.开始SpringFrame写组件:

新建一个vue文件,先接收props父传过来的参数:

export default 
  name: "SpringFrame",
  props: 
    title: 
      type: String,  // 变量类型
      default: "标题",   //默认值
    ,
    isShow: 
      type: Boolean,
      default: false,
    ,
  ,
  data() 
    return ;
  ,
;

3.定义基本标签与样式:

标签:

<template>
<!-- 绑定isShow,是否显示,同时绑定点击事件,相当点击空白区域,占满整个屏幕 -->
  <div class="app" v-if="isShow" @click="blank">
    <!-- .card为真正显示的弹框盒子 -->
    <div class="card">
        <!-- 标题 -->
      <h2> title </h2>
      <hr />
      <!-- 内容区 -->
      <div class="text">
        <!-- 插槽,接收自定义在内容框的内容 -->
        <slot></slot>
      </div>
      <br />
      <!-- 按钮 -->
      <div class="btn">
        <button @click="cancel">取消</button>
        <button @click="confirm">确认</button>
      </div>
    </div>
  </div>
</template>

css样式,比较简单就不详细说了:

.app 
  position: fixed;
  inset: 0;  
  z-index: 10000;
  background-color: rgba(194, 194, 194, 0.2);

.card 
  position: absolute;
  top: 50%;
  left: 50%;
  min-width: 250px;
  transform: translate(-50%, -50%);
  box-shadow: 0 0 8px rgb(219, 219, 219);
  background-color: #fff;
  padding: 10px 15px;

.card > h2 
  text-align: center;
  font-size: 20px;
  line-height: 25px;

.text 
  min-height: 100px;
  max-height: 70vh;
  max-width: 70vw;
  overflow: auto;

.btn > button 
  padding: 5px;
  margin-left: 5px;
  float: right;
  text-align: center;
  font-family: "fangsong";
  font-weight: bold;
  font-size: 18px;
  border: none;
  color: rgb(114, 114, 114);
  background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1), white);
  box-shadow: -2px -2px 8px -2px white, 2px 2px 8px -2px rgba(0, 0, 0, 0.15);
  border-radius: 5px;
  cursor: pointer;

button:active 
  box-shadow: inset -2px -2px 8px -2px white,
    inset 2px 2px 8px -2px rgba(0, 0, 0, 0.15);

inset: 0; 相当于 top、left、right、bottom:0,

4.定义事件:

export default 
  name: "SpringFrame",
  props: 
    title: 
      type: String,
      default: "标题",
    ,
    isShow: 
      type: Boolean,
      default: false,
    ,
  ,
  data() 
    return ;
  ,
  computed: ,
  methods: 
    //点击确认时通过$emit传递事件过去
    cancel() 
      this.$emit("cancel");
    ,
    confirm() 
    //点击取消时通过$emit传递事件过去
      this.$emit("confirm");
    ,
    //点击空白区域相当于点击取消事件
    blank(e) 
      /* 看点击的节点是不是最外层 */
      if (e.target.className == "app") 
        this.cancel();
      
    ,
  ,
;

以上组件就定义好啦~

5.全局注册该组件:

在SpringFrame.vue文件同级下新建一个index.js文件,内容如下:

// 导入组件
import SpringFrame from './SpringFrame.vue';
// 放数组里,以后有多个组件可以方便点
const arr = [SpringFrame]

const assembly = 
// vue提供install可供我们开发新的插件及全局注册组件等
  //install方法第一个参数是vue的构造器,第二个参数是可选的选项对象
    install(Vue)
       arr.forEach((item)=>
       // 注册组件
           Vue.component(item.name,item)
       )
    
;
// 记得导出
export default assembly;

在main.js文件里使用:
这个路径你们看你们index的文件放那,我放components目录下:

import assembly from './components/index'
Vue.use(assembly)

5.使用该组件:

我就在App.vue里使用:

<template>
  <div id="app">
    <button @click="tan">弹框</button>
    <SpringFrame
      :title="'江湖'"
      :isShow="show"
      @cancel="cancel"
      @confirm="confirm"
    >
      <!-- 自定义放点内容 -->
      <div>北极光之夜。</div>
      <img
        src="https://img0.baidu.com/it/u=1584587589,1038748006&fm=26&fmt=auto"
        alt=""
      />
    </SpringFrame>
  </div>
</template>
<script>
export default 
  data() 
    return 
      show: false,
    ;
  ,
  methods: 
    tan() 
      console.log(this.show);
      this.show = true;
    ,
    confirm() 
      this.show = false;
    ,
    cancel() 
      this.show = false;
    ,
  ,
;
</script>

<style>
</style>

效果就跟上面一样

6.完整代码:

组件的完整代码:

<template>
<!-- 绑定isShow,是否显示,同时绑定点击事件,相当点击空白区域 -->
  <div class="app" v-if="isShow" @click="blank">
    <!-- .card为真正显示的弹框盒子 -->
    <div class="card">
      <!-- 标题 -->
      <h2> title </h2>
      <hr />
      <!-- 内容区 -->
      <div class="text">
        <!-- 插槽,接收自定义在内容框的内容 -->
        <slot></slot>
      </div>
      <br />
      <!-- 按钮 -->
      <div class="btn">
        <button @click="cancel">取消</button>
        <button @click="confirm">确认</button>
      </div>
    </div>
  </div>
</template>

<script>
export default 
  name: "SpringFrame",
  props: 
    title: 
      type: String,
      default: "标题",
    ,
    isShow: 
      type: Boolean,
      default: false,
    ,
  ,
  data() 
    return ;
  ,
  computed: ,
  methods: 
    //点击确认时通过$emit传递事件过去
    cancel() 
      this.$emit("cancel");
    ,
    confirm() 
    //点击取消时通过$emit传递事件过去
      this.$emit("confirm");
    ,
    //点击空白区域相当于点击取消事件
    blank(e) 
      /* 看点击的节点是不是最外层 */
      if (e.target.className == "app") 
        this.cancel();
      
    ,
  ,
  watch: ,
  created() ,
  mounted() ,
;
</script>
<style scoped>
.app 
  position: fixed;
  inset: 0;
  z-index: 10000;
  background-color: rgba(194, 194, 194, 0.2);

.card 
  position: absolute;
  top: 50%;
  left: 50%;
  min-width: 250px;
  transform: translate(-50%, -50%);
  box-shadow: 0 0 8px rgb(219, 219, 219);
  background-color: #fff;
  padding: 10px 15px;

.card > h2 
  text-align: center;
  font-size: 20px;
  line-height: 25px;

.text 
  min-height: 100px;
  max-height: 70vh;
  max-width: 70vw;
  overflow: auto;

.btn > button 
  padding: 5px;
  margin-left: 5px;
  float: right;
  text-align: center;
  font-family: "fangsong";
  font-weight: bold;
  font-size: 18px;
  border: none;
  color: rgb(114, 114, 114);
  background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1), white);
  box-shadow: -2px -2px 8px -2px white, 2px 2px 8px -2px rgba(0, 0, 0, 0.15);
  border-radius: 5px;
  cursor: pointer;

button:active 
  box-shadow: inset -2px -2px 8px -2px white,
    inset 2px 2px 8px -2px rgba(0, 0, 0, 0.15);

</style>

三.总结:

上面就是全部内容啦,是比较简单的,有不明白的可以评论区留言哈~

下次见啦~

我的哔哩哔哩空间
Gitee仓库地址:全部特效源码
Q群聊(欢迎):629596039
其它文章:
~关注我看更多简单创意特效:
文字烟雾效果 html+css+js
环绕倒影加载特效 html+css
气泡浮动背景特效 html+css
简约时钟特效 html+css+js
赛博朋克风格按钮 html+css
仿网易云官网轮播图 html+css+js
水波加载动画 html+css
导航栏滚动渐变效果 html+css+js
书本翻页 html+css
3D立体相册 html+css
霓虹灯绘画板效果 html+css+js
记一些css属性总结(一)
Sass总结笔记
…等等
进我主页看更多~

以上是关于初学福音,手把手带你vue封装弹框组件并全局注册使用~的主要内容,如果未能解决你的问题,请参考以下文章

初学福音,手把手带你vue封装弹框组件并全局注册使用~

vue实战:三分钟实现优雅弹框 [ 项目级组件封装 ][ 超详细 ]

vue封装分页组件并注册为全局组件

vue封装分页组件并注册为全局组件

react全局的公共组件-------弹框

VUE 2.x中全局组件的封装(三)