ActionSheet 动作面板

import {
  ActionSheetOption,
  ActionSheetOnConfirm,
  showToast,
  showDialog,
  PopupOnCancel,
  showActionSheet,
  PopupOnVisibleStateChange,
  TaCell,
  TaGroup,
  TaActionSheet
} from '@/index'
import { useRef, useState } from 'react'

interface showArgs {
  options?: ActionSheetOption[]
  title?: string
  showCancel?: boolean
  cancelText?: string
  visibleEvent?: boolean
  confirmEvent?: boolean
}

const defaultOptions: ActionSheetOption[] = [
  {
    name: '选项1'
  },
  {
    name: '选项2'
  },
  {
    name: '选项3'
  }
]

export default function ExpActionSheet() {
  const [options, setOptions] = useState(defaultOptions)
  const [visible, setVisible] = useState(false)
  const [title, setTitle] = useState('')
  const [showCancel, setShowCancel] = useState(false)
  const [cancelText, setCancelText] = useState<string>()

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

  function onShow(args: showArgs = {}) {
    setTitle(args.title ?? '')
    setShowCancel(!!args.showCancel)
    setCancelText(args.cancelText)
    setOptions(args.options ?? defaultOptions)

    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: ActionSheetOnConfirm = res => {
    if (confirmEvent.current) {
      console.log('confirm', res)
      // showDialog({
      //   title: '选择了',
      //   showCancel: false,
      //   content: `item.name: '${res.item.name}'\nindex: ${res.index}`
      // })
    }
  }

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

  function onCallApi() {
    showActionSheet({
      title: '标题',
      options: defaultOptions,
      showCancel: true,
      success: res => {
        console.log('success', res)
        const { confirm, detail } = res

        if (confirm) {
          showDialog({
            title: '选择了',
            showCancel: false,
            content: `item.name: '${detail.item.name}'\nindex: ${detail.index}`
          })
        } else {
          showToast('取消了')
        }
      }
    })
  }

  return (
    <>
      <TaGroup title="基础用法">
        <TaCell label="默认" isLink onClick={() => onShow()} />
        <TaCell
          label="展示标题"
          isLink
          onClick={() => onShow({ title: '标题' })}
        />
        <TaCell
          label="展示取消按钮"
          isLink
          onClick={() => onShow({ showCancel: true })}
        />
        <TaCell
          label="设置取消按钮文案"
          isLink
          onClick={() =>
            onShow({ showCancel: true, cancelText: '自定义取消按钮文案' })
          }
        />
      </TaGroup>
      <TaGroup title="options 扩展">
        <TaCell
          label="选项描述"
          isLink
          onClick={() =>
            onShow({
              options: [
                {
                  name: '选项1',
                  description: '选项1的描述文案'
                },
                {
                  name: '选项2'
                },
                {
                  name: '选项3'
                }
              ]
            })
          }
        />
        <TaCell
          label="选项高亮"
          isLink
          onClick={() =>
            onShow({
              options: [
                {
                  name: '选项1',
                  highlight: true
                },
                {
                  name: '选项2'
                },
                {
                  name: '选项3'
                }
              ]
            })
          }
        />
      </TaGroup>
      <TaGroup title="事件监听">
        <TaCell
          label="confirm/cancel"
          isLink
          onClick={() => onShow({ showCancel: true, confirmEvent: true })}
        />
        <TaCell
          label="onVisibleStateChange"
          isLink
          onClick={() => onShow({ visibleEvent: true })}
        />
      </TaGroup>
      <TaGroup title="API">
        <TaCell label="showActionSheet" isLink onClick={() => onCallApi()} />
      </TaGroup>
      <TaActionSheet
        visible={visible}
        title={title}
        options={options}
        showCancel={showCancel}
        cancelText={cancelText}
        onUpdateVisible={v => setVisible(v)}
        onVisibleStateChange={onVisibleStateChange}
        onCancel={onCancel}
        onConfirm={onConfirm}
      />
    </>
  )
}

Import

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

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

Import Type

组件导出的类型定义:

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

Props

属性类型默认值必填说明
visiblebooleanfalse是否显示
titlestring标题,不设置则不展示标题栏
optionsActionSheetOption[]选项列表
maskClosablebooleantrue点击蒙层是否触发关闭操作
showCancelbooleanfalse是否显示取消按钮
cancelTextstring'取消'取消按钮的文本

ActionSheetOption 的结构

key类型默认值必填说明
namestring展示名称
descriptionstring附加描述
disabledstringfalse是否禁用
highlightstringfalse是否高亮显示
interface ActionSheetOption {
  name: string
  highlight?: boolean
  description?: string
  disabled?: boolean
}

const options: ActionSheetOption[] = [
  {
    name: '选项1',
    disabled: false,
    description: '选项描述',
    highlight: false
  }
]

Events

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

VisibleState 值说明

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

showActionSheet(object)

显示动作面板。

object

属性类型默认值必填说明
titlestring提示的标题,不设置则不展示
optionsActionSheetOption[]选项列表
showCancelbooleanfalse是否显示取消按钮
cancelTextstring'取消'取消按钮的文字
success(payload: SuccessPayload) => void接口调用成功(在用户做出选择后,如取消,选择选项)的回调函数
fail(e: Error) => void接口调用失败(如传入错误的参数)的回调函数(不传入 fail 遇错误直接抛出)
complete() => void弹窗关闭或调用失败的回调函数

SuccessPayload

属性类型说明
confirm?boolean为 true 时,表示用户点击了选项,此时返回 detail
cancel?boolean为 true 时,表示用户点击了取消
detail?.item.namestringconfirm=true 时点击 item 的选项名
detail?.indexnumberconfirm=true 时点击 item 的索引

Usage

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

showActionSheet({
  title: '标题',
  options: [
    {
      name: '选项1',
      description: '选项1的描述文案'
    },
    {
      name: '选项2'
    },
    {
      name: '选项3'
    }
  ],
  showCancel: true,
  success: ({ confirm, cancel, detail }) => {
    ...
  }
})