[uni-app] uview封装Popup组件,处理props及v-model的传值问题

文章目录

需求及效果

uView(1.x版本)中, 有Pop弹出层的组件, 现在有个需求是,进行简单封装,有些通用的设置不想每次都写(比如 :mask-custom-style="{background: 'rgba(0, 0, 0, 0.7)'}"这种)

然后内部内容交给插槽去自己随意发挥.

遇到的问题

子组件封装内部

html 复制代码
<template>
	<!-- 通用搜索框-其内容自定义 -->
	<u-popup v-model="isShow" mode="center" border-radius="20" :width="width"
		:mask-custom-style="{background: 'rgba(0, 0, 0, 0.7)'}" @close="close">
		<slot name="content"></slot>
	</u-popup>
</template>

<script>

子组件调用

html 复制代码
		<!-- 清除搜索记录弹框 -->
		<centerPopup :isShow="show">
		</centerPopup>

然后说我们就可以通过 show这个状态去控制, 但此时我们会遇到一个报错
Avoid mutating a prop directly since the value will be overwritten whenever the parent component

简单来说

就是涉及到了 props单向传递, 与v-model产生了冲突

这里就相当于, 子组件也去更改了isShow这个props,这显然是不允许的

解决的办法

网上搜索就能看到很多关于 props + v-model双向绑定帖子

比如: props+v-model------父子双向通信

基本就可以处理解决了

偷懒的写法

再进一步, 上面的写法也有点麻烦

再看这个地方, 是不是想到.sync语法糖

所以,进行双向绑定的办法如下:

子组件

html 复制代码
<template>
	<!-- 通用搜索框-其内容自定义 -->
	<u-popup v-model="isShow" mode="center" border-radius="20" :width="width"
		:mask-custom-style="{background: 'rgba(0, 0, 0, 0.7)'}" @close="close">
		<!-- 自定义内容插槽 -->
		<slot name="content"></slot>
	</u-popup>
</template>

<script>
	/**
	 * 通用 center型  - popup弹框, 其内容slot定义,
	 * 仅提供通用的样式
	 * 
	 */

	export default {
		name: 'centerPopup',
		data() {
			return {
				isShow: false,
			}
		},
		props: {
			centerPopShow: {
				type: Boolean,
				default: false
			},
			width: {
				type: [String, Number],
				default: '590'
			}
		},
		watch: {
			centerPopShow: {
				handler: function(nv, ov) {
					this.isShow = nv;
				}
			}
		},

		methods: {
			close() {
				this.$emit("update:centerPopShow", false)
			}
		}
	}
</script>

<style>
</style>

用watch观察props:centerPopShow, 来驱动 v-mode:isShow进行状态变更

用.sync语法糖的写法, 来通知父组件的props:centerPopShow来同步状态的变化


父组件

html 复制代码
		<centerPopup :centerPopShow.sync="cleanpopshow">
		</centerPopup>

=>pop弹窗弹出, 只要设置 this.cleanpopshow=true即可

=>pop弹窗隐藏, 只要设置 this.cleanpopshow=false即可

相关推荐
2501_9159214320 小时前
iOS应用从开发到上架App Store的完整步骤详解
android·ios·小程序·https·uni-app·iphone·webview
小蒜学长3 天前
基于SpringBoot+uni-app的闪洁家政系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·uni-app·家政服务
anyup_前端梦工厂3 天前
uni-app 模板 Starter 一键清理 Skill 发布
前端·人工智能·uni-app
anyup_前端梦工厂3 天前
将uni-app工程迁移uni-app x,AI 能帮我们做什么?
前端·人工智能·uni-app
蒿豪郝灬号3 天前
UniApp接入鸿蒙版阿里百川
华为·uni-app·harmonyos
2501_915921434 天前
详细教程:使用Perfdog工具测量iOS应用的功耗性能与优化方法
android·macos·ios·小程序·uni-app·cocoa·iphone
梦曦i4 天前
uni-app、uni-app x 与 Flutter 深度对比:2026年跨平台开发框架选型指南
flutter·uni-app·uni-app x
普马萨特5 天前
uni-app x 定位踩坑实录:H5/小程序/App 统一经纬度与逆地理编码
uni-app
Geek_Vison5 天前
保险APP已经用了Flutter,还能接入小程序吗?
flutter·小程序·uni-app·mpaas·小程序容器
郑州光合科技余经理6 天前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程