antd的Calendar日历自定义单元格数据刷新不及时

1 篇文章 0 订阅
1 篇文章 0 订阅
本文档介绍了一个React应用中遇到的问题,即在日历组件中显示日志状态时,由于dateCellRender方法的无状态特性导致数据更新后未能及时刷新。通过将dateCellRender转换为有状态组件并监听数据变化,实现了日志状态的实时更新。示例代码展示了如何在日历单元格中渲染带有日志状态的徽章,并在日期选择改变时更新组件。
摘要由CSDN通过智能技术生成


项目场景:

用日历显示日志状态



问题描述:

想重新选择年月查看日志状态,查到数据了,但是 dateCellRender 方法已经执行完毕了,导致刷新不及时,点击一下日历面板 才能显示



原因分析:

官方给的文档每个日期渲染的单元格数据是无状态的,可以把dateCellRender函数设置成一个有状态的组件,当数据变化时,在重新render



下面是一个简单的示例代码

import React, { PureComponent } from 'react';
import { withRouter } from 'react-router-dom'
import { connect } from 'react-redux'
import { Button, Row, Col, Card, Form, Divider, Table, Tree, message, Modal, Upload, Calendar, Badge } from 'antd';
import { Input, DatePicker, Select, Switch, Radio, Checkbox, Cascader, InputNumber } from 'antd';

class DataCellRender extends PureComponent {
    constructor(props) {
        super(props)

        this.state = {
            component: <div></div>
        }

        this.reload = this.reload.bind(this)
    }

    componentDidMount() {
        this.reload()
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.dataSource !== this.props.dataSource) {
            this.reload(nextProps.dataSource)
        }
    }

    reload(dataSource = this.props.dataSource) {
        let component = <div></div>
        let currentDate = moment(this.props.value).format('YYYY-MM-DD')
       //  currentDate 是每一个日期单元格触发dateCellRender 返回的参数(当前单元格日期)  具体业务可以结合当前选择的日期value和自定义数据datacouce 来组合
        
        component = <ul className="events">
            <li>
                <Badge color="#ff0000" text={dataSource} />
            </li>
        </ul>

        this.setState({
            component,
        })
    }

    render() {
        return this.state.component
    }
}

@withRouter
@connect(
    state => ({
    })
)
class Panel extends React.PureComponent {

    constructor(props) {
        super(props);

        this.state = {
            dataSource: moment().format("yyyy-MM-DD"),
        }
        this.onPanelChange = this.onPanelChange.bind(this)
    }

    componentDidMount() {
    }

    onPanelChange(e) { //选择日期的回调函数
        let date = e['_d'] //日期的moment对象
        this.setState({
            dataSource: moment(date).format("yyyy-MM-DD")
        })
    }

    render() {
        return (
            <Card style={{ padding: 10 }}>
                <Calendar dateCellRender={value => <DataCellRender value={value} dataSource={this.state.dataSource} />} onPanelChange={this.onPanelChange} />
            </Card>
        )
    }
}

export default Panel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nba136667854

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值