antd Design Table组件中,整行触发悬浮

   由于最近的需求,要求开发出一个table行触发悬浮提示框展示信息的功能,类似这样:

 

 鼠标放入这一行,然后展示一个悬浮窗,展示本行的数据。

但是,我们都知道antd的Table组件,是一列一列的设定样式和属性进行调整的(column这个API),无法像column一样固定一整行的设定样式和属性。特别是触发悬浮窗,

一般都是这样,给某一列特定字段加上悬浮,显示表格中被省略的内容。这种只能由某行某个字段触发 ,无法行悬浮内容。所以在这里跟大家分享一下,利用Popver,Table行悬浮:

    state={

        show:false,

        data:{},

    }

    Info(show,data){

        console.log(show)

        return <Popover title='详情' overlayClassName={`suspend_popver`} visible={show}

        mouseEnterDelay={0}

        mouseLeaveDelay={0}

        content={<>

            <div>test:{data.test}</div>

        </>}>{''}</Popover>

    }

    render() {

        const { show, data } = this.state;

        return <React.Fragment>

            <Table

            onRow={(v, i) => {

                return {

                    onMouseEnter: event => {

                        event.stopPropagation;

                        this.setState({show:true,data:v})

                    },

                    onMouseMove: event => {

                        event.stopPropagation;

                        const popver = document.getElementsByClassName(`suspend_popver`);

                        if (popver.length > 0) {

                            (popver.item(0) as HTMLElement).style.left = event.clientX - 80 + 'px' ;

                            (popver.item(0) as HTMLElement).style.top = event.clientY + 50 + 'px' ;

                        }

                    },

                    onMouseLeave: event => {

                        event.stopPropagation;

                        this.setState({show:false,data:v})

                    },

                };

            }}

            dataSource={[{test:555555}]}

            columns={[

                {dataIndex:'test',title:'test'}

            ]}

            />

            {this.Info(show, data)}

        </React.Fragment>

    }

 代码如上,然后效果图如下:

鼠标移动到每一行的时候,就会触发悬浮提示,并且提示可以随着鼠标的移动而移动。

如果只需要表格行触发悬浮,而不需要随鼠标移动的话也可以也可以这样写。

 state={

        dataSource:[{test:555555,popoverShow:false}]

    }

    render() {

        const { dataSource } = this.state;

        return <React.Fragment>

            <Table

            onRow={(v, i) => {

                return {

                    onMouseEnter: event => {

                        event.stopPropagation;

                        let newDataSource = []

                        dataSource.map(i=>{

                            i.popoverShow = true

                            newDataSource.push({...i})

                        })

                        this.setState({dataSource:newDataSource})

                    },

                    onMouseLeave: event => {

                        event.stopPropagation;

                        let newDataSource = []

                        dataSource.map(i=>{

                            i.popoverShow = false

                            newDataSource.push({...i})

                        })

                        this.setState({dataSource:newDataSource})

                    },

                };

            }}

            dataSource={dataSource}

            columns={[

                {title:'', dataIndex:'popoverShow', width:0, render: (v,o,i)=>{

                          return <Popover title='详情' visible={v} placement="topLeft"

                               content={<>

                                     <div>test:{o.test}</div>

                               </>}

                           ><div style={{height:30}}></div></Popover>

                }},

                {dataIndex:'test',title:'test'}

            ]}

            />

 

利用一个宽度为 0 的 列生成悬浮窗,用一个字段作为悬浮框的开关,就可以实现整行触发了。

这里注意一下,悬浮提示随鼠标移动时不要设置的离鼠标太近,和鼠标最好留一点距离,如果鼠标移动就能碰到悬浮框的话,那么很可能触发 鼠标移入移出事件 导致悬浮框的不停隐藏,出现切换。这里的 鼠标移入移出事件 只对行有效,悬浮框不属于表格行的部分,鼠标从行内移出但刚好进入悬浮框,就会移出事件,悬浮框关闭,悬浮框关闭后鼠标又在行内,又触发事件,就会不停闪动。 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值