Modal 模态框

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

interface showArgs {
  showClose?: boolean
  maskClosable?: boolean
}

const imageUrl = 'https://cdn.fox2.cn/vfox/swiper/center-2.jpg'

export default function ExpModal() {
  const [showClose, setShowClose] = useState(true)
  const [maskClosable, setMaskClosable] = useState(false)
  const [visible, setVisible] = useState(false)
  const [visible2, setVisible2] = useState(false)

  const callbackEvent = useRef(false)
  const visibleEvent = useRef(false)

  function onShow(args: showArgs = {}) {
    setShowClose(args.showClose !== false)
    setMaskClosable(!!args.maskClosable)
    setVisible(true)
  }

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

  const onCancel: PopupOnCancel = res => {
    console.log('onCancel', res)

    if (callbackEvent.current) {
      if (res.source === 'closeClick') {
        showToast('点击了关闭按钮')
      } else if (res.source === 'maskClick') {
        showToast('点击了蒙层')
      }
    }
  }

  return (
    <>
      <TaGroup title="基础用法">
        <TaCell label="默认" isLink onClick={() => onShow()} />
        <TaCell
          label="蒙层可点击"
          isLink
          onClick={() => onShow({ maskClosable: true, showClose: true })}
        />
        <TaCell
          label="隐藏关闭按钮"
          isLink
          onClick={() => onShow({ showClose: false, maskClosable: true })}
        />
      </TaGroup>
      <TaGroup title="自定义子节点">
        <TaCell label="图片" isLink onClick={() => setVisible2(true)} />
      </TaGroup>
      <TaGroup title="事件监听">
        <TaCell
          label="onCancel"
          isLink
          onClick={() => {
            callbackEvent.current = true
            onShow({ maskClosable: true })
          }}
        />
        <TaCell
          label="onVisibleStateChange"
          isLink
          onClick={() => {
            visibleEvent.current = true
            onShow()
          }}
        />
      </TaGroup>
      <TaModal
        visible={visible}
        maskClosable={maskClosable}
        showClose={showClose}
        onCancel={onCancel}
        onVisibleStateChange={onVisibleStateChange}
        onUpdateVisible={v => setVisible(v)}
      ></TaModal>
      <TaModal visible={visible2} onUpdateVisible={v => setVisible2(v)}>
        <TaImage className="exp-image-image" src={imageUrl} aspectRatio="1" />
      </TaModal>
    </>
  )
}

Import

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

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

Import Type

组件导出的类型定义:

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

Props

属性类型默认值必填说明
visiblebooleanfalse是否显示
widthstring模态框的宽度,支持 CSS 宽度值
maskClosablebooleanfalse点击蒙层是否触发关闭操作
showClosebooleantrue是否显示关闭按钮

Events

事件描述回调函数参数TypeScript 函数
onVisibleStateChange展示隐藏时触发payload: { state: VisibleState }PopupOnVisibleStateChange
onCancel关闭按钮或者点击蒙层关闭时触发payload: { source: string }PopupOnCancel
onUpdateVisible展示隐藏时触发visible: boolean 是否显示

VisibleState 值说明

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