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
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
visible | boolean | false | 否 | 是否显示 |
selector | string | HTMLElement | 是 | 从哪个元素展开,如果是 string,则为可以被 document.querySelector(selector) 获取到 | |
placement | PlacementType | 'bottom' | 否 | 展开位置,可选 'bottom', 'top', 'left', 'right' |
showMask | boolean | true | 否 | 是否展示蒙层,如果设置不展示,气泡则是跟随 selector 对应的元素 |
content | string | 否 | 展示文本,如设置了 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
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
selector | string | HTMLElement | 是 | 从哪个元素展开,如果是 string,则为可以被 document.querySelector(selector) 获取到 | |
placement | PlacementType | 'bottom' | 否 | 展开位置,可选 'bottom', 'top', 'left', 'right' |
content | string | 是 | 文本内容 | |
showMask | boolean | true | 否 | 是否展示蒙层,如果设置不展示,气泡则是跟随 selector 对应的元素 |
success | () => void | 否 | 接口调用成功的回调函数 | |
fail | (e: Error) => void | 否 | 接口调用失败的回调函数(不传入 fail 遇错误直接抛出) | |
complete | () => void | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
Usage
具体调用方式可以参考API 调用。
showPopover({
selector: '#popoverTarget',
content: '这是气泡内容',
success: res => {
console.log('success', res)
}
})