更新记录

1.0.0(2026-05-12) 下载此版本

提交插件


平台兼容性

uni-app(4.54)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

n-dialog

一个基于 uni-app 的自定义弹窗组件,支持多端运行,提供流畅的动画体验和丰富的自定义配置。

特性

  • 支持 v-model 双向绑定控制显示/隐藏
  • 平滑的显示/隐藏动画过渡效果(350ms)
  • 支持标题属性和标题插槽
  • 内容区域支持滚动,避免内容过长溢出
  • 支持底部操作按钮区,可自定义按钮文本
  • 支持点击遮罩层关闭(可配置开关)
  • 右上角关闭按钮
  • 丰富的 CSS 变量,支持深度自定义样式
  • 纯 CSS 绘制关闭图标,性能优异

安装

将组件放入你的 uni-app 项目的 uni_modules 目录中即可使用。

基本使用

<template>
  <view>
    <button @click="showDialog = true">打开弹窗</button>
    <n-dialog v-model="showDialog" title="提示">
      <text>这是弹窗的内容区域</text>
    </n-dialog>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import nDialog from '@/uni_modules/n-dialog/components/n-dialog/n-dialog.vue'

const showDialog = ref(false)
</script>

Props

属性名 类型 默认值 说明
modelValue Boolean false 控制弹窗显示/隐藏,支持 v-model 双向绑定
title String - 弹窗标题文本,不传则不显示标题栏
showFooter Boolean true 是否显示底部按钮区域
leftLabel String '取消' 左侧按钮的文本
rightLabel String '确定' 右侧按钮的文本
clickMark Boolean true 是否允许点击遮罩层关闭弹窗

Events

事件名 说明 回调参数
update:modelValue 弹窗状态变化时触发,用于 v-model 绑定 false
close 弹窗关闭时触发 false
clickBtn 点击底部按钮时触发 0(点击左侧按钮) / 1(点击右侧按钮)

Slots

插槽名 说明
default 弹窗的主要内容区域
title 自定义标题内容,优先级高于 title 属性
footer 自定义底部按钮区域,优先级高于 leftLabel/rightLabel

自定义样式(CSS 变量)

你可以通过修改以下 CSS 变量来自定义组件样式:

CSS 变量名 默认值 说明
--n-dilaog-background #fff 弹窗主体背景色
--n-dialog-mark-background rgba(0, 0, 0, .5) 遮罩层背景色
--n-dialog-border-radius 8rpx 弹窗圆角大小
--n-dialog-padding 24rpx 弹窗内边距
--n-dialog-close-icon-color #000 关闭图标颜色
--n-dialog-close-icon-size 28rpx 关闭图标尺寸
--n-dilog-border-color #edebeb 底部分割线颜色
--n-dialog-footer-padding 24rpx 底部按钮内边距

注意:部分 CSS 变量名中存在拼写错误,使用时请严格按照上面的变量名书写。

全局自定义示例:

:root {
  --n-dilaog-background: #f5f7fa;
  --n-dialog-mark-background: rgba(0, 0, 0, 0.7);
  --n-dialog-border-radius: 16rpx;
}

局部自定义示例:

<n-dialog v-model="show" title="自定义弹窗" 
  style="--n-dilaog-background: #fffbe6; --n-dialog-border-radius: 20rpx;">
  <text>自定义背景色的弹窗</text>
</n-dialog>

使用示例

示例1:监听按钮点击事件

<template>
  <view>
    <button @click="show = true">打开</button>
    <n-dialog v-model="show" title="确认操作" @clickBtn="handleBtnClick">
      <text>确定要执行此操作吗?</text>
    </n-dialog>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import nDialog from '@/uni_modules/n-dialog/components/n-dialog/n-dialog.vue'

const show = ref(false)
const handleBtnClick = (val) => {
  if (val === 0) {
    console.log('点击了取消按钮')
  } else {
    console.log('点击了确定按钮')
    // 执行操作逻辑
    show.value = false
  }
}
</script>

示例2:自定义标题和底部按钮

<template>
  <n-dialog v-model="show" :showFooter="false">
    <template #title>
      <view style="color: red; font-size: 32rpx; font-weight: bold;">警告!</view>
    </template>
    <text>这是一个警告弹窗,没有底部按钮。</text>
  </n-dialog>
</template>

示例3:完全自定义底部

<template>
  <n-dialog v-model="show" title="选择操作">
    <text>请选择你要进行的操作:</text>
    <template #footer>
      <view class="custom-footer">
        <view class="custom-btn blue" @click="doA">操作A</view>
        <view class="custom-btn green" @click="doB">操作B</view>
        <view class="custom-btn" @click="closeAll">关闭</view>
      </view>
    </template>
  </n-dialog>
</template>

示例4:不允许点击遮罩关闭

<n-dialog v-model="show" title="重要提示" :clickMark="false">
  <text>此弹窗必须通过点击按钮或关闭按钮关闭,点击遮罩不会关闭。</text>
</n-dialog>

完整示例

<template>
  <view class="demo">
    <button @click="dialog1 = true">基础弹窗</button>
    <button @click="dialog2 = true">自定义按钮文本</button>
    <button @click="dialog3 = true">无底部弹窗</button>
    <button @click="dialog4 = true">自定义样式弹窗</button>

    <n-dialog v-model="dialog1" title="提示" @clickBtn="onBtn1">
      <view class="content-text">这是一个基础的弹窗示例。</view>
    </n-dialog>

    <n-dialog v-model="dialog2" title="删除确认" leftLabel="放弃" rightLabel="删除" @clickBtn="onBtn2">
      <view class="content-text">确定要删除该数据吗?删除后无法恢复。</view>
    </n-dialog>

    <n-dialog v-model="dialog3" title="通知" :showFooter="false">
      <view class="content-text">这里是没有底部按钮的弹窗内容。</view>
    </n-dialog>

    <n-dialog v-model="dialog4" title="自定义样式"
      style="--n-dilaog-background: #f0f9ff; --n-dialog-border-radius: 20rpx; --n-dialog-close-icon-color: #1890ff;">
      <view class="content-text">自定义背景色、圆角和关闭图标颜色。</view>
    </n-dialog>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import nDialog from '@/uni_modules/n-dialog/components/n-dialog/n-dialog.vue'

const dialog1 = ref(false)
const dialog2 = ref(false)
const dialog3 = ref(false)
const dialog4 = ref(false)

const onBtn1 = (val) => {
  console.log('弹窗1点击了按钮:', val)
  dialog1.value = false
}

const onBtn2 = (val) => {
  console.log('弹窗2点击了按钮:', val)
  dialog2.value = false
}
</script>

<style scoped>
.demo {
  padding: 40rpx;
  display: flex;
  flex-direction: column;
  gap: 24rpx;
}
.content-text {
  font-size: 28rpx;
  color: #333;
  line-height: 1.6;
}
</style>

注意事项

  1. 弹窗使用 fixed 定位,默认层级较高,不会被普通页面内容遮挡
  2. 内容区域内置 scroll-view,当内容超长时会自动滚动
  3. 关闭过程有 350ms 的动画延迟,期间组件不会立即销毁
  4. 点击底部按钮后组件不会自动关闭,需要在事件处理函数中手动修改 v-model 为 false

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。