Skip to content
On this page

Dialog 模态对话框

vue
<template>
  <ta-group title="基础用法">
    <ta-cell
      label="默认"
      isLink
      @click="
        show({
          title: '标题',
          content: '提示内容提示内容提示内容提示内容提示内容提示内容'
        })
      "
    ></ta-cell>
    <ta-cell
      label="不带标题"
      isLink
      @click="
        show({
          content: '提示内容提示内容提示内容提示内容提示内容提示内容'
        })
      "
    ></ta-cell>
    <ta-cell
      label="不显示取消按钮"
      isLink
      @click="
        show({
          title: '标题',
          content: '提示内容提示内容提示内容提示内容提示内容提示内容',
          showCancel: false
        })
      "
    ></ta-cell>
    <ta-cell
      label="自定义按钮文案"
      isLink
      @click="
        show({
          title: '惊喜',
          content: '这有一份关爱保险待你查收',
          cancelText: '拒绝',
          confirmText: '接受'
        })
      "
    ></ta-cell>
  </ta-group>
  <ta-group title="事件监听">
    <ta-cell
      label="confirm/cancel"
      isLink
      @click="
        show(
          {
            title: '标题',
            content: '提示内容提示内容提示内容提示内容提示内容提示内容'
          },
          true
        )
      "
    ></ta-cell>
    <ta-cell
      label="visible-state-change"
      isLink
      @click="
        show(
          {
            title: '标题',
            content: '提示内容提示内容提示内容提示内容提示内容提示内容'
          },
          false,
          true
        )
      "
    ></ta-cell>
  </ta-group>
  <ta-group title="API">
    <ta-cell label="showDialog" isLink @click="onCallApi()"></ta-cell>
  </ta-group>
  <ta-dialog
    v-model:visible="visible"
    v-bind="dialogArgs"
    @confirm="onConfirm"
    @cancel="onCancel"
    @visibleStateChange="onVisibleStateChange"
  >
  </ta-dialog>
</template>

<script lang="ts">
import { defineComponent, ref, reactive } from 'vue'
import { showToast, showDialog, type PopupOnVisibleStateChange, type PopupOnCancel } from '@/index'

interface DialogArgs {
  title?: string
  content?: string
  showCancel?: boolean
  cancelText?: string
  confirmText?: string
}

export default defineComponent({
  name: 'ExpDialog',
  setup() {
    const visible = ref(false)
    let callbackEvent = false
    let visibleEvent = false

    const dialogArgs = reactive<DialogArgs>({
      title: '',
      content: '',
      cancelText: '',
      confirmText: '',
      showCancel: false
    })

    function show(obj: DialogArgs, callbackE?: boolean, visibleE?: boolean) {
      obj = Object.assign(
        {
          title: '',
          content: '',
          showCancel: true,
          cancelText: '取消',
          confirmText: '确定'
        },
        obj
      )

      for (const k in obj) {
        dialogArgs[k as 'title'] = obj[k as 'title']
      }

      callbackEvent = !!callbackE
      visibleEvent = !!visibleE

      visible.value = true
    }

    function onCallApi() {
      showDialog({
        title: '标题',
        content: '提示内容提示内容提示内容提示内容提示内容提示内容',
        maskClosable: true,
        success: (res: any) => {
          console.log('success', res)
          showToast(res.confirm ? 'confirm = true' : 'cancel = true')
        }
      })
    }

    const onConfirm = (res: any) => {
      console.log('confirm', res)
      callbackEvent && showToast('点击确定按钮')
    }

    const onCancel: PopupOnCancel = res => {
      console.log('cancel', res)
      callbackEvent && showToast('点击取消按钮')
    }

    const onVisibleStateChange: PopupOnVisibleStateChange = ({ state }) => {
      if (visibleEvent) {
        console.log('visible-state-change', state)
        showToast(`${state} 事件触发`)
      }
    }

    return {
      visible,
      dialogArgs,
      show,
      onCallApi,
      onConfirm,
      onCancel,
      onVisibleStateChange
    }
  }
})
</script>

Import

js
import { TaDialog } from 'tantalum-ui-mobile'

具体的引入方式可以参考引入组件

Import Type

组件导出的类型定义:

ts
import type { VisibleState, PopupOnVisibleStateChange, PopupOnCancel } from 'tantalum-ui-mobile'

Props

属性类型默认值必填说明
v-model:visiblebooleanfalse是否显示
titlestring'提示'提示的标题
contentstring提示的内容,优先于 slot
mask-closablebooleanfalse点击蒙层是否触发关闭操作
show-cancelbooleantrue是否显示取消按钮
confirm-textstring'确定'确认按钮的文字
cancel-textstring'取消'取消按钮的文字

Events

事件描述回调函数参数函数 TypeScript
confirm确认按钮点击时触发
cancel取消按钮点击时触发payload: { source: string }PopupOnCancel
visible-state-change展示隐藏时触发payload: { state: VisibleState }PopupOnVisibleStateChange

VisibleState 值说明

说明备注
show展示时触发
shown展示且动画结束后触发
hide隐藏时触发可能携带其他参数 cancel, maskClick, closeClick 等
hidden隐藏且动画结束后触发可能携带其他参数 cancel, maskClick, closeClick 等

Slots

#default

vue
<ta-dialog>提示内容</ta-dialog>

showDialog(object)

显示模态对话框。

object

属性类型默认值必填说明
titlestring提示的标题
contentstring提示的内容
maskClosablebooleanfalse点击蒙层是否触发关闭操作
showCancelbooleantrue是否显示取消按钮
confirmTextstring'确定'确认按钮的文字
cancelTextstring'取消'取消按钮的文字
success(payload: SuccessPayload) => void接口调用成功(在用户做出选择后,如取消,选择选项)的回调函数
fail(e: Error) => void接口调用失败(如传入错误的参数)的回调函数(不传入 fail 遇错误直接抛出)
complete() => void弹窗关闭或调用失败的回调函数

SuccessPayload

属性类型说明
confirm?boolean为 true 时,表示用户点击了确定按钮
cancel?boolean为 true 时,表示用户取消了

Usage

具体调用方式可以参考API 调用

js
showDialog({
  title: '提示',
  content: '这是一个模态弹窗',
  success(res) {
    if (res.confirm) {
      console.log('用户点击确定')
    } else if (res.cancel) {
      console.log('用户点击取消')
    }
  }
})