HarmonyOS鸿蒙Next开发中,如何实现一个popup弹窗
HarmonyOS鸿蒙Next开发中,如何实现一个popup弹窗
popup弹窗,可以说是一个很常见的功能,像上边的微信,以及很多的应用,都会存在这样的需求,鸿蒙原生Api中,对于popup弹窗,可以说实现起来特别的简单,直接使用提供的bindPopup方法即可,我们就来实际的操作一下。
更多关于HarmonyOS鸿蒙Next开发中,如何实现一个popup弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
popup弹窗,可以说是一个很常见的功能,像上边的微信,以及很多的应用,都会存在这样的需求,鸿蒙原生Api中,对于popup弹窗,可以说实现起来特别的简单,直接使用提供的bindPopup方法即可。
简单举例如下:
Column() {
Button("点击").onClick(() => {
this.isShowPopup = !this.isShowPopup
}).bindPopup(this.isShowPopup, {
message: "我是一个测试popup",
onWillDismiss: () => {
this.isShowPopup = !this.isShowPopup
}
})
}.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
实际效果:

本篇文章主要概述bindPopup的使用方式,以及如何不绑定组件的情况下进行弹出popup弹窗。
1、了解bindPopup的属性
2、如何更改popup样式
3、如何自定义popup弹窗
4、不绑定组件方式弹出
5、相关总结
一、了解bindPopup的属性
bindPopup(show: boolean, popup: PopupOptions | CustomPopupOptions): T;
bindPopup共有两个参数,第一个参数show用于控制popup弹窗的显示,为了便于动态的弹出和隐藏,需要生成成员变量,并用装饰器来修饰,除此之外,还有一点需要注意,那就是popup弹窗必须等待页面全部构建完成才能展示,如果你在构建之前,比如aboutToAppear里进行改变,是没有效果的。
第二个参数是popup弹窗主要配置项,在这里可以配置,弹窗的样式等等效果,下面针对常见的几个参数,做一个简单的了解。
message:弹窗内容,仅支持string类型,如果只是一个普通的文字弹窗,只实现这一个参数即可。
placement:设置popup组件在绑定组件的显示位置,默认值为Placement.Bottom,也就是底部展示,你可以根据实际情况,设置需要展示的位置。
enableArrow:设置是否显示箭头,默认为true,展示。
popupColor:popup弹窗颜色,因为有背景填充的效果,可以发现,即便我们设置了颜色,并没有达到想要的效果,这里需要去除背景填充,将backgroundBlurStyle设置为BlurStyle.NONE即可。
radius:popup弹窗的圆角半径。
targetSpace:popup弹窗与绑定组件的距离。
onWillDismiss:popup弹窗隐藏回调,这里做一些隐藏之后的逻辑处理。
当然了,还有一些其他的属性,如果大家用到了,可以直接看官网介绍即可。
二、如何更改popup样式
更改popup样式,主要是根据上述的属性来进行设置,简单的举例几个样式。
1、修改popup弹窗背景
bindPopup(this.isShowPopup, {
message: "我是一个测试popup",
popupColor: Color.Pink,
backgroundBlurStyle: BlurStyle.NONE,
onWillDismiss: () => {
this.isShowPopup = !this.isShowPopup
}
})
通过popupColor属性设置,并改变填充背景backgroundBlurStyle,效果如下:

2、隐藏popup弹窗箭头
bindPopup(this.isShowPopup, {
message: "我是一个测试popup",
popupColor: Color.Pink, //设置背景
enableArrow: fasle, //隐藏箭头
backgroundBlurStyle: BlurStyle.NONE, //取消背景填充
onWillDismiss: () => {
this.isShowPopup = !this.isShowPopup
}
})
设置enableArrow为true即可,效果如下:

3、组件上边弹出popup弹窗
bindPopup(this.isShowPopup, {
message: "我是一个测试popup",
placement: Placement.Top, //设置组件上边弹出
popupColor: Color.Pink, //设置背景
enableArrow: false, //隐藏箭头
backgroundBlurStyle: BlurStyle.NONE, //取消背景填充
onWillDismiss: () => {
this.isShowPopup = !this.isShowPopup
}
})
使用属性placement来设置即可,效果如下:

4、设置popup弹窗文字样式
messageOptions: {
textColor: Color.White,
font: {
size: 15,
weight: FontWeight.Bold
}
}
通过messageOptions属性设置即可,可以设置字体的颜色,大小,权重等等。

三、如何自定义popup弹窗
在实际的需求中,popup弹窗不可能总是一个文字展示,有着多种多样的需求,比如前言中微信案例,那么如何自己定义弹窗的效果呢?可以使用提供的builder参数,传递一个定义的@Builder即可。
代码案例:
自定义视图:
[@Builder](/user/Builder)
popupView() {
Column() {
Text("我是条目一").fontColor(Color.White)
Text("我是条目二").fontColor(Color.White)
Text("我是条目三").fontColor(Color.White)
Text("我是条目四").fontColor(Color.White)
}.padding(5)
}
实现builder:
.bindPopup(this.isShowPopup, {
builder: this.popupView,
radius: 5,
popupColor: "#999999",
backgroundBlurStyle: BlurStyle.NONE, //取消背景填充
onWillDismiss: () => {
this.isShowPopup = !this.isShowPopup
}
})
案例效果:

四、不绑定组件方式弹出
可以发现,bindPopup是组件提供的一个方法,想要在哪个组件下弹出,就给哪个组件进行绑定,实现起来也是十分的简单便捷,当然了也是主推这种方式,如果你不想进行绑定实现,想要在何时何地,都可以书写弹出效果,您可以使用我之前封装的dialog库,里面目前针对Popup也简单封装了一层,感兴趣的可以使用。
中心仓库地址:https://ohpm.openharmony.cn/#/cn/detail/@abner%2Fdialog
定义弹出UI
首先要定义弹出的组件,自定义即可,支持自定义组件形式,传入即可
/**
* AUTHOR:AbnerMing
* INTRODUCE:popup 弹出框,可以自定义,任意组件
* */
[@Builder](/user/Builder)
function BuilderWindowView() {
Text("我是任意的组件")
.backgroundColor(Color.Pink)
}
任意位置
showPopupWindow({
view: wrapBuilder(BuilderWindowView),
x: 60,
y: 300
})
上边
showPopupWindow({
id: "popupTop",//要弹出的组件id,也就是你要在哪一个组件进行弹出
view: wrapBuilder(BuilderWindowView)
})
下边
showPopupWindow({
id: "popupBottom",//要弹出的组件id,也就是你要在哪一个组件进行弹出
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.BOTTOM
})
左边
showPopupWindow({
id: "popupLeft",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.LEFT
})
右边
showPopupWindow({
id: "popupRight",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.RIGHT
})
左上
showPopupWindow({
id: "popupTopLeft",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.TOP_LEFT
})
右上
showPopupWindow({
id: "popupTopRight",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.TOP_RIGHT
})
左下
showPopupWindow({
id: "popupBottomLeft",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.BOTTOM_LEFT
})
右下
showPopupWindow({
id: "popupBottomRight",
view: wrapBuilder(BuilderWindowView),
direction: PopupDirection.BOTTOM_RIGHT
})
携带参数
class WindowParams {
title?: string
}
[@Builder](/user/Builder)
function BuilderWindowParams(params: WindowParams) {
Text(params.title)
.backgroundColor(Color.Pink)
}
//代码调用
let params = new WindowParams()
params.title = "我是携带的参数"
showPopupWindow({
id: "popupParams",
params: params,
viewParams: wrapBuilder(BuilderWindowParams),
direction: PopupDirection.BOTTOM
})
五、相关总结
目前提供了两种方式实现popup弹窗,主推系统实现的方式,几乎能满足我们常见的所有场景,当然了,文章毕竟有限,尽量还是以官网为主。
更多关于HarmonyOS鸿蒙Next开发中,如何实现一个popup弹窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,实现Popup弹窗主要使用@ohos.arkui.advanced.Popup组件。首先导入Popup模块,然后在UI中定义Popup组件,设置其内容、位置和样式。通过绑定状态变量控制弹窗的显示与隐藏,例如使用@State装饰器管理显示状态。可以在Popup内放置自定义UI组件。最后,通过事件触发(如按钮点击)来改变状态变量,从而控制弹窗的弹出和关闭。
在HarmonyOS Next中,实现Popup弹窗主要有两种方式:使用bindPopup方法或Popup组件。根据你的描述,这里重点说明bindPopup方法,这是最简洁的实现方案。
使用bindPopup方法
bindPopup是组件的一个通用属性方法,允许你为任何组件(如Button、Text等)绑定一个弹窗。当触发指定事件(如点击)时,弹窗会自动显示。
基本实现步骤:
- 定义弹窗内容:使用
@Builder装饰器或内联方式定义一个自定义的UI组件,作为弹窗的内容。 - 绑定到宿主组件:在需要触发弹窗的组件上调用
.bindPopup方法,并传入弹窗配置参数。
示例代码:
import { popup } from '@kit.ArkUI';
@Entry
@Component
struct Index {
// 1. 使用@Builder装饰器定义弹窗内容
@Builder popupBuilder() {
Column() {
Text('这是一个Popup弹窗')
.fontSize(18)
.margin(10)
Button('关闭')
.onClick(() => {
// 获取PopupController并调用dismiss方法关闭弹窗
popupController.dismiss();
})
}
.padding(20)
.backgroundColor(Color.White)
.borderRadius(12)
}
// 创建PopupController用于控制弹窗
private popupController: popup.PopupController = new popup.PopupController();
build() {
Column() {
// 2. 在Button组件上绑定弹窗
Button('点击显示弹窗')
.bindPopup({
// 传入弹窗控制器
controller: this.popupController,
// 设置弹窗内容
builder: this.popupBuilder,
// 设置弹窗位置(相对于宿主组件)
placement: popup.Placement.Bottom,
// 设置弹窗背景是否可点击关闭(默认为false)
maskColor: Color.Gray,
// 点击背景是否可关闭弹窗
enableArrow: false, // 是否显示箭头
// 其他自定义样式...
})
.onClick(() => {
// 点击按钮时,通过controller显示弹窗
this.popupController.show();
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
关键配置参数说明:
controller: 必须。PopupController对象,用于控制弹窗的显示(show)和隐藏(dismiss)。builder: 必须。使用@Builder装饰的函数或内联Builder,定义弹窗的UI内容。placement: 弹窗相对于宿主组件的显示位置。可选值包括:Top、Bottom、Left、Right、TopLeft、TopRight、BottomLeft、BottomRight等。maskColor: 设置弹窗背景蒙层的颜色。设置为透明色(Color.Transparent)可取消蒙层。如果设置了颜色,通常配合onWillDismiss事件实现点击背景关闭。enableArrow: 布尔值,控制是否在弹窗边缘显示一个指向宿主组件的箭头。onWillDismiss: 弹窗即将关闭时的回调函数。
另一种方式:Popup组件
你也可以直接使用Popup组件,将其作为容器,通过条件渲染(if或状态)控制其显示隐藏。这种方式提供了更直接的布局控制,但bindPopup在常见场景下更便捷。
总结:
对于大多数场景,bindPopup是实现Popup弹窗的首选方法。它声明简单,与触发组件逻辑关联紧密,且提供了丰富的配置选项(位置、蒙层、箭头等)来满足不同的UI需求。你只需定义一个内容构建函数,创建一个控制器,然后将其绑定到宿主组件即可。

