zoukankan      html  css  js  c++  java
  • 4.弹出层组件的实现与封装

    1. 在这个项目中,弹出层组件出现的方式很多,主要有以下三种

         

      这三种的主要区别在于:是否需要蒙版、是否有蒙版颜色、蒙版的位置是在底部还是随这操作变化位置

    1. 位于底部固定的弹出层

        代码如下:

    <template>
    	<view style="z-index:999;overflow:hidden" v-if="avalilable">
    		<!-- 蒙版 -->
    		<view 
    			class="position-fixed left-0 right-0 top-0 bottom-0" 
    			:style="getMaskColor"
    			@click="hidden"
    			v-if="mask"
    		></view>
    		
    		<!-- 弹出框 -->
    		<view class="position-fixed bg-white" :class="atBottom">
    			<!-- <view  style="height: 300rpx;"></view> -->
    			<slot></slot>
    		</view>
    	</view>
    </template>
    
    <script>
    	export default {
    		props: {
    			//蒙版颜色
    			maskColor: {
    				type: Boolean,
    				default: true
    			},
    			//是否开启蒙版
    			mask: {
    				type: Boolean,
    				default: true
    			},
    			//是否处于底部
    			bottom: {
    				type: Boolean,
    				default: true
    			}
    		},
    		created() {
    			console.log(this.bottom)
    		},
    		data() {
    			return {
    				avalilable: false
    			}
    		},
    		methods:{
    			show() {
    				this.avalilable = true
    			},
    			hidden() {
    				this.avalilable = false
    			}
    		},
    		computed:{
    			getMaskColor() {
    				let i = this.maskColor ? 0.5 : 0
    				return `background-color: rgba(0,0,0,${i});`		
    			},
    			atBottom() {
    				let bottom = this.bottom ? 'left-0 right-0 bottom-0' : ''
    				return bottom;
    			}
    		}
    	}
    </script>
    

      当我们点击扩展按钮时,就会出现下面效果

    2. 当我们长按对话列表时,会出现操作的选项

      在会话列表组件下,调用长按事件longpress

    <div class="flex align-center justify-between" @click="onClick" @longpress="long">
    

      计算出长按的位置x,y

      小程序端和nvue端获取位置的方式不同,需要判断

      计算出x,y后,将位置传给父组件

    long(e) {
    	// console.log(e)
        let x = 0
        let y = 0
    
    	// #ifdef APP-PLUS-NVUE
    	x = e.changedTouches[0].screenX
    	y = e.changedTouches[0].screenY
    				
    	// #endif
    	// 如果是小程序端
    	// #ifdef MP
    	x = e.detail.x
    	y = e.detail.y
    				
    	// #endif
    	console.log(e)
    					
    	this.$emit('long', {x, y})
    	}
    },

      在index.vue中使用h-media-list组件, 绑定子组件传递的long事件

      调用弹出层组件中的show方法,传入x,y坐标即可实现效果

    <!-- 聊天列表 -->
            <view class="flex flex-column">
                <block v-for="(item, index) in chatList" :key="index">
                    <h-media-list :item="item" @long="long"></h-media-list>
                </block>
            </view>

    <!-- 弹出层 -->
          <h-popup ref="popup">
            <view style=" 200rpx;height: 300rpx;"></view>
          </h-popup>

      

    long({x, y}) {
    	this.$refs.popup.show(x, y)
    }
    

      完成效果如下:

              

  • 相关阅读:
    C#学习笔记(28)——委托排序(2)自定义排序
    C#学习笔记(27)——委托排序(1)
    C#学习笔记(26)——委托计算器
    C#学习笔记(25)——用刻盘器批量从U盘删除添加文件
    ABBYY FineReader Pro for Mac系统要求
    ABBYY FineReader错误代码142和55
    哪些因素影响ABBYY FineReader 12的识别质量
    ABBYY FineReader 12没你想得那么简单
    超强OCR文字识别软件首选ABBYY FineReader
    详解ABBYY FineReader 12扫描亮度设置
  • 原文地址:https://www.cnblogs.com/zhanghaoblog/p/12228639.html
Copyright © 2011-2022 走看看