Dialog 模态对话框

import {
  showToast,
  PopupOnCancel,
  showDialog,
  PopupOnVisibleStateChange,
  TaCell,
  TaGroup,
  TaDialog
} from '@/index'
import { useRef, useState } from 'react'

interface showArgs {
  title?: string
  content?: string
  showCancel?: boolean
  cancelText?: string
  confirmText?: string
  visibleEvent?: boolean
  confirmEvent?: boolean
}

const defaultContent = '提示内容提示内容提示内容提示内容提示内容提示内容'

export default function ExpDialog() {
  const [visible, setVisible] = useState(false)
  const [title, setTitle] = useState<string>()
  const [content, setContent] = useState('')
  const [showCancel, setShowCancel] = useState(false)
  const [cancelText, setCancelText] = useState<string>()
  const [confirmText, setConfirmText] = useState<string>()

  const visibleEvent = useRef(false)
  const confirmEvent = useRef(false)

  function onShow(args: showArgs = {}) {
    setTitle(args.title)
    setContent(args.content || defaultContent)
    setShowCancel(args.showCancel !== false)
    setCancelText(args.cancelText)
    setConfirmText(args.confirmText)

    visibleEvent.current = !!args.visibleEvent
    confirmEvent.current = !!args.confirmEvent

    setVisible(true)
  }

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

    if (res.state === 'hidden') {
      visibleEvent.current = false
      confirmEvent.current = false
    }
  }

  const onConfirm = () => {
    if (confirmEvent.current) {
      console.log('confirm')
      showToast('点击确定按钮')
    }
  }

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

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

  return (
    <>
      <TaGroup title="基础用法">
        <TaCell
          label="默认"
          isLink
          onClick={() =>
            onShow({
              title: '标题'
            })
          }
        />
        <TaCell label="不带标题" isLink onClick={() => onShow()} />
        <TaCell
          label="不显示取消按钮"
          isLink
          onClick={() =>
            onShow({
              title: '标题',
              showCancel: false
            })
          }
        />
        <TaCell
          label="自定义按钮文案"
          isLink
          onClick={() =>
            onShow({
              title: '惊喜',
              content: '这有一份关爱保险待你查收',
              cancelText: '拒绝',
              confirmText: '接受'
            })
          }
        />
      </TaGroup>
      <TaGroup title="事件监听">
        <TaCell
          label="confirm/cancel"
          isLink
          onClick={() =>
            onShow({
              title: '标题',
              confirmEvent: true
            })
          }
        />
        <TaCell
          label="onVisibleStateChange"
          isLink
          onClick={() =>
            onShow({
              title: '标题',
              visibleEvent: true
            })
          }
        />
      </TaGroup>
      <TaGroup title="API">
        <TaCell label="showDialog" isLink onClick={() => onCallApi()} />
      </TaGroup>
      <TaDialog
        visible={visible}
        title={title}
        content={content}
        showCancel={showCancel}
        confirmText={confirmText}
        cancelText={cancelText}
        onUpdateVisible={v => setVisible(v)}
        onVisibleStateChange={onVisibleStateChange}
        onCancel={onCancel}
        onConfirm={onConfirm}
      ></TaDialog>
    </>
  )
}

Import

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

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

Import Type

组件导出的类型定义:

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

Props

属性类型默认值必填说明
visiblebooleanfalse是否显示
titlestring'提示'提示的标题
contentstring提示的内容,优先于 slot
maskClosablebooleanfalse点击蒙层是否触发关闭操作
showCancelbooleantrue是否显示取消按钮
confirmTextstring'确定'确认按钮的文字
cancelTextstring'取消'取消按钮的文字

Events

事件描述回调函数参数函数 TypeScript
onConfirm确认按钮点击时触发
onCancel取消按钮点击时触发payload: { source: string }PopupOnCancel
onVisibleStateChange展示隐藏时触发payload: { state: VisibleState }PopupOnVisibleStateChange
onUpdateVisible展示隐藏时触发visible: boolean 是否显示

VisibleState 值说明

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

Slots

children

<TaDialog>提示内容</TaDialog>

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 调用

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