Popover 气泡

import {
  TaButton,
  TaCell,
  TaGroup,
  TaPopover,
  PlacementType,
  PopupOnVisibleStateChange,
  showPopover,
  showToast
} from '@/index'
import { useRef, useState } from 'react'

interface showArgs {
  selector?: string
  content?: string
  placement?: PlacementType
  visibleEvent?: boolean
}

export default function ExpPopover() {
  const [selector, setSelector] = useState<string>()
  const [content, setContent] = useState('')
  const [placement, setPlacement] = useState<PlacementType>()
  const [visible, setVisible] = useState(false)
  const [visible2, setVisible2] = useState(false)

  const visibleEvent = useRef(false)

  function onShow(args: showArgs = {}) {
    setSelector(args.selector)
    setContent(args.content || '这是气泡内容')
    setPlacement(args.placement)

    visibleEvent.current = !!args.visibleEvent

    setVisible(true)
  }

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

  function onCallApi(selector: string) {
    showPopover({
      selector,
      content: '这是气泡内容',
      placement: 'top',
      success: res => {
        console.log('success', res)
      }
    })
  }

  return (
    <>
      <TaGroup title="基础用法">
        <div className="exp-popover-box">
          <TaButton
            size="small"
            id="popoverLeft"
            shape="circle"
            icon="PlusOutlined"
            onClick={() => onShow({ selector: '#popoverLeft' })}
          ></TaButton>
          <TaButton
            size="small"
            id="popoverCenter"
            shape="circle"
            icon="PlusOutlined"
            onClick={() => onShow({ selector: '#popoverCenter' })}
          ></TaButton>
          <TaButton
            size="small"
            id="popoverRight"
            shape="circle"
            icon="PlusOutlined"
            onClick={() => onShow({ selector: '#popoverRight' })}
          ></TaButton>
        </div>
      </TaGroup>
      <TaGroup title="方向 placement=top/bottom/left/right">
        <div className="exp-popover-box2">
          <div>
            <TaButton
              size="small"
              id="popoverTop2"
              shape="circle"
              icon="UpOutlined"
              onClick={() =>
                onShow({ placement: 'top', selector: '#popoverTop2' })
              }
            ></TaButton>
          </div>
          <div>
            <TaButton
              size="small"
              id="popoverLeft2"
              shape="circle"
              icon="LeftOutlined"
              onClick={() =>
                onShow({ placement: 'left', selector: '#popoverLeft2' })
              }
            ></TaButton>
            <TaButton
              className="exp-popover-box2-ml"
              size="small"
              id="popoverRight2"
              shape="circle"
              icon="RightOutlined"
              onClick={() =>
                onShow({ placement: 'right', selector: '#popoverRight2' })
              }
            ></TaButton>
          </div>
          <div>
            <TaButton
              size="small"
              id="popoverBottom2"
              shape="circle"
              icon="DownOutlined"
              onClick={() =>
                onShow({ placement: 'bottom', selector: '#popoverBottom2' })
              }
            ></TaButton>
          </div>
        </div>
      </TaGroup>
      <TaGroup title="带选项">
        <TaCell label="长文案">
          <TaButton
            size="small"
            id="popoverLongContent"
            shape="circle"
            icon="PlusOutlined"
            onClick={() =>
              onShow({
                content:
                  '这是气泡内容这是气泡内容这是气泡内容这是气泡内容这是气泡内容这是气泡内容',
                selector: '#popoverLongContent'
              })
            }
          ></TaButton>
        </TaCell>
        <TaCell label="不展示蒙层">
          <TaButton
            size="small"
            id="popoverNoMask"
            shape="circle"
            icon="PlusOutlined"
            onClick={() => setVisible2(true)}
          ></TaButton>
        </TaCell>
      </TaGroup>
      <TaGroup title="事件监听">
        <TaCell label="onVisibleStateChange">
          <TaButton
            size="small"
            id="popoverEvent"
            shape="circle"
            icon="PlusOutlined"
            onClick={() =>
              onShow({ visibleEvent: true, selector: '#popoverEvent' })
            }
          ></TaButton>
        </TaCell>
      </TaGroup>
      <TaGroup title="API">
        <TaCell label="showPopover">
          <TaButton
            size="small"
            id="popoverApi"
            shape="circle"
            icon="PlusOutlined"
            onClick={() => onCallApi('#popoverApi')}
          ></TaButton>
        </TaCell>
      </TaGroup>
      <TaPopover
        placement={placement}
        content={content}
        selector={selector}
        visible={visible}
        onUpdateVisible={v => setVisible(v)}
        onVisibleStateChange={onVisibleStateChange}
      ></TaPopover>
      <TaPopover
        visible={visible2}
        selector="#popoverNoMask"
        showMask={false}
        content="无蒙层气泡内容"
        onUpdateVisible={v => setVisible2(v)}
      ></TaPopover>
    </>
  )
}

Import

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

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

Import Type

组件导出的类型定义:

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

Props

属性类型默认值必填说明
visiblebooleanfalse是否显示
selectorstring | HTMLElement从哪个元素展开,如果是 string,则为可以被 document.querySelector(selector) 获取到
placementPlacementType'bottom'展开位置,可选 'bottom', 'top', 'left', 'right'
showMaskbooleantrue是否展示蒙层,如果设置不展示,气泡则是跟随 selector 对应的元素
contentstring展示文本,如设置了 slot,则不使用该字段

Events

事件描述回调函数参数TypeScript 函数
onVisibleStateChange展示隐藏时触发payload: { state: VisibleState }PopupOnVisibleStateChange
onUpdateVisible展示隐藏时触发visible: boolean 是否显示

VisibleState 值说明

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

Slots

children

<TaPopover>自定义内容</TaPopover>

showPopover(object)

显示气泡。

object

属性类型默认值必填说明
selectorstring | HTMLElement从哪个元素展开,如果是 string,则为可以被 document.querySelector(selector) 获取到
placementPlacementType'bottom'展开位置,可选 'bottom', 'top', 'left', 'right'
contentstring文本内容
showMaskbooleantrue是否展示蒙层,如果设置不展示,气泡则是跟随 selector 对应的元素
success() => void接口调用成功的回调函数
fail(e: Error) => void接口调用失败的回调函数(不传入 fail 遇错误直接抛出)
complete() => void接口调用结束的回调函数(调用成功、失败都会执行)

Usage

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

showPopover({
  selector: '#popoverTarget',
  content: '这是气泡内容',
  success: res => {
    console.log('success', res)
  }
})