首頁  >  文章  >  web前端  >  如何利用Vue元件實現彈跳窗功能

如何利用Vue元件實現彈跳窗功能

php中世界最好的语言
php中世界最好的语言原創
2018-06-02 11:44:301908瀏覽

這次帶給大家如何利用Vue元件實現彈窗功能,利用Vue元件實現彈窗功能的注意事項有哪些,以下就是實戰案例,一起來看一下。

最近在使用element-ui框架,用到了Dialog對話框組件,大致實現的效果,跟我之前自己在移動端項目裡面弄的一個彈窗組件差不太多。然後就想著把這種彈跳窗組件的實現方式與大家分享一下,下面本文會帶著大家手摸手實現一個彈窗組件。

本文主要內容會涉及到彈窗遮罩的實現, slot 插槽的使用方式, props 、 $emit 傳參,具體組件代碼也傳上去了。如果喜歡的話可以點波贊/關注,支持一下,希望大家看完本文可以有所收穫。

元件最後實作的效果

實作步驟

  1. 先搭建元件的html和css樣式,遮罩層和內容層。

  2. 自訂彈出式內容:彈跳視窗元件透過 slot 插槽接受從父元件傳過來彈窗內容。

  3. 客製化彈跳窗樣式:彈跳視窗元件透過 props 接收從父元件傳過來的彈跳窗寬度,上下左右的位置。

  4. 元件開關:透過父元件傳進來的 props 控制元件的顯示與隱藏,子元件關閉時透過事件 $emit 觸發父元件改變值。

1.搭建元件的html和css樣式。

html結構:一層遮罩層,一層內容層,內容層裡面又有一個頭部title和主體內容和一個關閉按鈕。

下面是元件中的html結構,裡面有一些後面才要加進去的東西,如果看不懂的話可以先跳過,

<template>
 <p class="dialog">
  <!--外层的遮罩 点击事件用来关闭弹窗,isShow控制弹窗显示 隐藏的props-->
  <p class="dialog-cover back" v-if="isShow" @click="closeMyself"></p>
  <!-- transition 这里可以加一些简单的动画效果 -->
  <transition name="drop">
   <!--style 通过props 控制内容的样式 -->
  <p class="dialog-content" :style="{top:topDistance+&#39;%&#39;,width:widNum+&#39;%&#39;,left:leftSite+&#39;%&#39;}" v-if="isShow">
   <p class="dialog_head back">
    <!--弹窗头部 title-->
    <slot name="header">提示信息</slot>
   </p>
   <p class="dialog_main" :style="{paddingTop:pdt+&#39;px&#39;,paddingBottom:pdb+&#39;px&#39;}">
   <!--弹窗的内容-->
   <slot name="main">弹窗内容</slot>
   </p>
   <!--弹窗关闭按钮-->
   <p class="foot_close" @click="closeMyself">
    <p class="close_img back"></p>
   </p>
  </p>
 </transition>
 </p>
</template>

下面是元件中的主要的css樣式,裡面都做了充分的註釋,主要透過z-index 和background 達到遮罩的效果,具體內容的css可以根據自己的需求來設定。

<style lang="scss" scoped>
 // 最外层 设置position定位 
 .dialog {
 position: relative;
 color: #2e2c2d;
 font-size: 16px;
 }
 // 遮罩 设置背景层,z-index值要足够大确保能覆盖,高度 宽度设置满 做到全屏遮罩
 .dialog-cover {
 background: rgba(0,0,0, 0.8);
 position: fixed;
 z-index: 200;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 }
 // 内容层 z-index要比遮罩大,否则会被遮盖,
 .dialog-content{
 position: fixed;
 top: 35%;
 // 移动端使用felx布局 
 display: flex;
 flex-direction: column;
 justify-content: center;
 align-items: center;
 z-index: 300;
 }
</style>

2. 透過 slot 自訂彈窗內容

這一步,只要理解了 slot 的作用以及用法,就沒有問題了。

單一插槽:

這是在沒有slot傳進來的時候,才顯示的彈跳窗內容
上面是單一插槽也叫預設插槽,在父元件中使用插槽的正確姿勢:

<my-component>
 <!--在my-component里面的所有内容片段都将插入到slot所在的DOM位置,并且会替换掉slot标签-->
 <!--这两个p标签,将替换整个slot标签里面的内容-->
 <p>这是一些初始内容</p>
 <p>这是更多的初始内容</p>
</my-component>

ps:如果子元件裡麵包含slot 插槽,那麼上面的p標籤的內容將會被丟棄。

具名插槽:

所謂的具名插槽,也就是為slot 標籤賦一個name 屬性,具名插槽可以父元件中不同的內容片段放到子元件的不同地方,具名插槽還是可以擁有一個預設插槽。下面可以看一下彈窗元件插槽的使用方式:

<p class="dialog_head back ">
 <!--弹窗头部 title-->
 <slot name="header">提示信息</slot>
 </p>
 <p class="dialog_main " :style="{paddingTop:pdt+&#39;px&#39;,paddingBottom:pdb+&#39;px&#39;}">
 <!--弹窗的内容-->
 <slot name="main">弹窗内容</slot>
 </p>

在父元件中的使用方式:

將彈窗元件引入要使用的元件中,並透過components 註冊成為組件。
父元件中彈跳視窗元件插槽的使用方法如下。

<dialogComponent>
 <p slot="header">插入到name为header的slot标签里面</p>
  <p class="dialog_publish_main" slot="main">
  这里是内容插入到子组件的slot的name为main里面,可以在父组件中添加class定义样式,事件类型等各种操作
  </p>
</dialogComponent>

關於組件中用到的插槽的介紹就到這裡了,插槽在彈窗組件中的應用是一個典型的栗子,可以看到插槽作用相當強大,而插槽本身的使用並不難,同學愛上插槽了沒有?

3.透過props 控制彈窗顯隱&&自訂彈窗style

psops 是Vue中父元件向子元件傳遞資料的一種方式,不熟悉的小夥伴們可以看一下props文檔。

因為彈窗組件都是引到別的組件裡面去用的,為了適合不同組件場景中的彈窗,所以彈窗組件必須具備一定的可自訂性,否則這樣的組件將毫無意義,下面介紹一下props的使用方式,以彈窗組件為例:

首先需要在被傳入的組件中定義props的一些特性,驗證之類的。
然後在父元件中綁定props資料。

<script>
export default {
 props: {
 isShow: { 
 //弹窗组件是否显示 默认不显示
  type: Boolean,
  default: false,
  required:true, //必须
 },
 //下面这些属性会绑定到p上面 详情参照上面的html结构
 // 如: :style="{top:topDistance+'%',width:widNum+'%'}"
 widNum:{ 
 //内容宽度
  type: Number,
  default:86.5
 },
 leftSite:{
  // 左定位
  type: Number,
  default:6.5
 },
 topDistance: {
  //top上边距
  type: Number,
  default:35
 },
 pdt:{
  //上padding
  type: Number,
  default:22
 },
 pdb:{
  //下padding
  type: Number,
  default:47
 }
 },
}
</script>

父元件中使用方式:

<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum">
</dialogComponent>

ps:props传递数据不是双向绑定的,而是 单向数据流 ,父组件的数据变化时,也会传递到子组件中,这就意外着我们不应该在子组件中修改props。所以我们在关闭弹窗的时候就 需要通过 $emit 来修改父组件的数据 ,然后数据会自动传到子组件中。

现在基本上弹窗组件都已实现的差不多了,还差一个弹窗的关闭事件,这里就涉及到子组件往父组件传参了。

4. $emit 触发父组件事件修改数据,关闭弹窗

Vue中在子组件往父组件传参,很多都是通过 $emit 来触发父组件的事件来修改数据。

在子组件中,在点击关闭,或者遮罩层的时候触发下面这个方法:

methods: {
 closeMyself() {
  this.$emit("on-close"); 
  //如果需要传参的话,可以在"on-close"后面再加参数,然后在父组件的函数里接收就可以了。
 }
 }

父组件中的写法:

<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum" @on-close="closeDialog"> 
 </dialogComponent>
 //"on-close是监听子组件的时间有没有触发,触发的时候执行closeDialog函数
methods:{
 closeDialog(){
 // this.status.isShowPublish=false;
 //把绑定的弹窗数组 设为false即可关闭弹窗
 },
}

可以用弹窗组件实现下列这种信息展示,或者事件交互:

 

弹窗组件代码

上面是把弹窗的每个步骤拆分开来,一步步解析的,每一步都说的比较清楚了,具体连起来的话,可以看看 代码 ,再结合文章就能理的很清楚了。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎样进行JS变量声明var,let.const

怎样使用vue计算属性与方法侦听器

以上是如何利用Vue元件實現彈跳窗功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn