一,子组件 modalConfirm.vue 文件封装

<template>
    <div class="confirmBgc animations" :style="{backgroundColor:rytColor}" v-show="show">
        <div class="rytContainer" :style="{borderRadius:rytBorderradius}">
            <h2 class="rytTitle" v-if="title">{{title}}</h2>
            <div class="rytContent parent">
                <slot name="content"></slot>
            </div>
            <div class="rytButtons">
                <div class="button cancel" @click="clickCancel">{{cancel}}</div>
                <div class="rytline"></div>
                <div class="button confirmStyle" @click="clickConfirm">{{confirm}}</div>
            </div>
        </div>
    </div>
</template>

<!-- slot 插槽又叫内容分发 将父组件的内容放到子组件的指定位置就叫做内容分发 -->
<!-- <slot name="content"></slot>  此为插槽具名用法,在父父组件中只需要 <标签名 slot="content">内容部分</标签名> 即可-->

<script>
     export default {
         name:'modalConfirm',
         props:{
             rytColor:{
                 type:String,
                 default:'rgba(0,0,0,0.6)'
             },
             rytBorderradius:{
                 type:String,
                 default:'12px'
             },
             title:{
                 type:[String,Boolean],
                 default:'rrr'
             },
             cancel:{
                 type:[String],
                 default:'取消'
             },
             confirm:{
                 type:[String],
                 default:'确定'
             },
             showModalconfirm:{
                 type:Boolean,
                 default:false
             }

         },
        data(){
         return{
             show:false,
              }

          },
        methods:{
            clickCancel(){
               this.show = false
            },
            clickConfirm(){
                this.show = false
                this.$emit('oncilckConfirm')

            }
        },
        watch:{
            showModalconfirm(val){
                this.show = val
            },
            show(val){  //监听show的值,当show的值发生改变的时候val即为当前show的值,把该值传给父组件的v-model属性(v-                                 model绑定的是input事件,出发Input事件)
              this.$emit('input',val)
            }
        }
     }
</script>
<style scoped>
        .parent{
                   position: relative;
                 }
         .parent::after {  /*利用缩放和伪元素解决1px在不同手机有粗有细问题*/
          margin:auto auto;
          width:295px;
          position: absolute;
          bottom: 0;
          left: 0;
          right: 0;
          content: "";
          box-sizing: border-box;
          height: 1px;
          border-bottom: 1px solid #e8e8e8;
          
          transform: scaleY(0.5);
          transform-origin: 0 0;
        }
    .animations {
      /* -webkit-animation: 'scaleDraw'  1s ease-in-out 0s 1 alternate forwards; 关键帧名称 */
      -webkit-animation: 'scaleDraw' .6s ease-in-out 0s 1 alternate forwards;
      -moz-animation: 'scaleDraw' .6s ease-in-out 0s 1 alternate forwards;
      -o-animation: 'scaleDraw' .6s ease-in-out 0s 1 alternate forwards;
      animation: 'scaleDraw' .6s ease-in-out 0s 1 alternate forwards;
    }
    .confirmBgc{
        width:100%;
        height:100%;
        position:fixed;
        top:0px;
        bottom:0px;
        left:0px;
        right:0px;
    }
    .rytContainer{
        width:295px;
        background-color: #fff;
        position:absolute;
        top:50%;
        left:50%;
        transform: translate(-50%,-50%);
    }
    .rytTitle{
        font-size: 20px;
        color:#333;
        font-weight: 700;
        height:44px;
        line-height: 44px;
    }
    .rytContent{
        font-size: 16px;
        color:#333;
        box-sizing: border-box;
        padding:0px 20px;
        padding-bottom: 16px;
    }
    .rytButtons{
        height:48px;
        color:#333;
        display: flex;
        flex-direction: row;
        justify-content: flex-start;
    }
    .button{
        width:50%;
        text-indent: center;
        height:42px;
        line-height: 42px;
    }
   .confirmStyle{
        color:#FF8200;
    }
   .rytline{
       width:1px;
       height:42px;
       background-color: #e8e8e8;
       /*以下代码是实现line线在x轴上的缩放,使线在不同手机上都显示的比较细*/
       transform: scaleX(0.5);
    transform-origin: 0 0;

   }
</style>

二,父组件引用 ceconfirm.vue

<template>
  <div class="about marquee">
  
    <button @click="clickConfirm">点击确认弹框modalConfirm</button>

    <modal-confirm
    v-model="rytModalconfirm"
    :showModalconfirm="rytModalconfirm"
    @oncilckConfirm="clickConfirmBtn"
    title="请确认"
    >
     <span slot="content">身份证姓名与实名认证不符,是否更换为识别到的身份证姓名</span>
    </modal-confirm>


  </div>
</template>
<script>

import modalConfirm from '../../components/modal-confirm/modalConfirm.vue';  //下拉框带popup蒙层
export default {
   name:'ceconfirm',
   components: { //注册组件
    modalConfirm
  },
 
  data() {
    return {
     rytModalconfirm:false,
    };
  },
  methods: {
     //modalconfirm 确认弹框逻辑
     clickConfirm(){
        this.rytModalconfirm = true
        console.log(this.rytModalconfirm ,'clickConfirm')
     },
     clickConfirmBtn(){ //点击了确认弹窗的确认按钮触发的事件
       console.log('请继续点击了confirm弹框确定按钮的逻辑')
     }
  
  },
 }
</script>


<style scoped>

</style>

三,所用知识点
 父子组件之间的传值
slot 插槽用法,具名插槽用法

运用v-model实现子组件的显示隐藏
缺点:没有transition 的淡入淡出功能特效

------------------------还有一些小瑕疵,待完善------------------------------------

Logo

前往低代码交流专区

更多推荐