简体   繁体   English

如何在 react-date-range 中的日期范围 select 之后自动关闭日期范围模式

[英]How to auto close date range modal after date range select in react-date-range

Date range should be automatically closed when i click on any date or after selecting date range.当我单击任何日期或选择日期范围后,日期范围应自动关闭。

import React, { useState, useCallback } from 'react'
import { DateRange } from 'react-date-range'
import { withStyles } from '@material-ui/styles'
import {
    TextField,
    Popover,
    InputAdornment,
    IconButton,
} from '@material-ui/core'
import DateRangeIcon from '@material-ui/icons/DateRange'
import ClearIcon from '@material-ui/icons/Clear'
import moment from 'moment'
import { useSelector } from 'react-redux'
import 'react-date-range/dist/styles.css'
import 'react-date-range/dist/theme/default.css'
import { getLocaleDateString } from '../../../utils/date'
import './style.css'


const styles = {
    calendarWrapper: {
        padding: '16px',
    },
}


const BasicDateRangePicker = ({ onChange, label, onClear, value }) => {

    const { countryCode } = useSelector(state => state.authentication)
    const formatDate = date => moment(date).format(getLocaleDateString(countryCode, 'date'))
    const initialState = {
        anchorEl: null,
        calendarConfig: [ value ],
        displayCalendar: false,
        focusedRange: [ 0, 0 ],
        inputValue: value.startDate !== null ? formatDate(value.startDate) + '         to        ' + formatDate(value.endDate) : ''
    }
    const divRef = React.useRef()
    const [ state, setState ] = useState(initialState)

    const handleClear = useCallback(() => {
        onClear({clear: true})
        setState(state => {
            return {
                ...state,
                calendarConfig: [ {
                    endDate: new Date(),
                    key: 'selection',
                    startDate: new Date()
                } ],
                inputValue: '',
            }
        })
        // setState(initialState)

    })

    const setFocusedRange = useCallback(focusedRange => {
        setState(state => {
            return { ...state, focusedRange }
        })
    })

    const handleOnChange = useCallback(item => {
        const startDate = formatDate(item.selection.startDate)
        const endDate = formatDate(item.selection.endDate)
        const inputValue = `${startDate}         to         ${endDate}`
        onChange(item)
        setState(state => {
            return {
                ...state,
                calendarConfig: [ item.selection ],
                inputValue: inputValue,
            }
        })
    })
    const onAdornmentClick = useCallback(() => {
        setState(state => {
            return {
                ...state,
                anchorEl: divRef.current,
                displayCalendar: true,
            }
        })
    })

    const onPopoverClose = useCallback(() => {
        setState(state => {
            return {
                ...state,
                anchorEl: null,
                displayCalendar: false,
            }
        })
    })

    return (
        <div style={{ display: 'flex', flexDirection: 'column' }} ref={divRef}>
            <TextField
                label={label}
                value={state.inputValue}
                InputProps={{
                    endAdornment: (
                        <InputAdornment position='end'>
                            <IconButton style={{ padding: '3px' }}>
                                {state.inputValue?.length > 1 ? (
                                    <ClearIcon onClick={handleClear} />
                                ) : (
                                    <DateRangeIcon onClick={onAdornmentClick} />
                                )}
                            </IconButton>
                        </InputAdornment>
                    ),
                }}
            />
            <Popover
                open={state.displayCalendar}
                anchorEl={state.anchorEl}
                anchorOrigin={{
                    horizontal: 'center',
                    vertical: 'bottom',
                }}
                transformOrigin={{
                    horizontal: 'center',
                    vertical: 'top',
                }}
                onClose={onPopoverClose}
            >
                <DateRange
                    focusedRange={state.focusedRange}
                    onRangeFocusChange={setFocusedRange}
                    onChange={handleOnChange}
                    showSelectionPreview={false}
                    moveRangeOnFirstSelection={false}
                    ranges={state.calendarConfig}
                    editableDateInputs={false}
                    months={1}
                />
            </Popover>
        </div>
    )
}

export default withStyles(styles, { name: 'BasicDateRangePicker' })(
    BasicDateRangePicker
)

I have resolve the auto close popover after selecting date reange selection by applying condition on datechange event in the following way我通过以下方式在 datechange 事件上应用条件来解决选择日期范围选择后的自动关闭弹出框

       if (startDate !== endDate) {
            const inputValue = `${startDate}         to         ${endDate}`
            onChange(item)
            setState(state => {
                return {
                    ...state,
                    anchorEl: null,
                    calendarConfig: [ item.selection ],
                    displayCalendar: false,
                    inputValue: inputValue,
                }
            })
        } else {
            setState(state => {
                return {
                    ...state,
                    calendarConfig: [ item.selection ],
                }
            })
        }

complete code:完整代码:

import React, { useState, useCallback } from 'react'
import { DateRange } from 'react-date-range'
import { withStyles } from '@material-ui/styles'
import {
    TextField,
    Popover,
    InputAdornment,
    IconButton,
} from '@material-ui/core'
import DateRangeIcon from '@material-ui/icons/DateRange'
import ClearIcon from '@material-ui/icons/Clear'
import moment from 'moment'
import { useSelector } from 'react-redux'
import 'react-date-range/dist/styles.css'
import 'react-date-range/dist/theme/default.css'
import { getLocaleDateString } from '../../../utils/date'
import './style.css'


const styles = {
    calendarWrapper: {
        padding: '16px',
    },
}


const BasicDateRangePicker = ({ onChange, label, onClear, value }) => {

    const { countryCode } = useSelector(state => state.authentication)
    const formatDate = date => moment(date).format(getLocaleDateString(countryCode, 'date'))
    const initialState = {
        anchorEl: null,
        calendarConfig: [ value ],
        displayCalendar: false,
        focusedRange: [ 0, 0 ],
        inputValue: value.startDate !== null ? formatDate(value.startDate) + '         to        ' + formatDate(value.endDate) : ''
    }
    const divRef = React.useRef()
    const [ state, setState ] = useState(initialState)

    const handleClear = useCallback(() => {
        onClear({clear: true})
        setState(state => {
            return {
                ...state,
                calendarConfig: [ {
                    endDate: new Date(),
                    key: 'selection',
                    startDate: new Date()
                } ],
                inputValue: '',
            }
        })
        // setState(initialState)

    })

    const setFocusedRange = useCallback(focusedRange => {
        setState(state => {
            return { ...state, focusedRange }
        })
    })

    const handleOnChange = useCallback(item => {
        const startDate = formatDate(item.selection.startDate)
        const endDate = formatDate(item.selection.endDate)
        if (startDate !== endDate) {
            const inputValue = `${startDate}         to         ${endDate}`
            onChange(item)
            setState(state => {
                return {
                    ...state,
                    anchorEl: null,
                    calendarConfig: [ item.selection ],
                    displayCalendar: false,
                    inputValue: inputValue,
                }
            })
        } else {
            setState(state => {
                return {
                    ...state,
                    calendarConfig: [ item.selection ],
                }
            })
        }
    })
    const onAdornmentClick = useCallback(() => {
        setState(state => {
            return {
                ...state,
                anchorEl: divRef.current,
                displayCalendar: true,
            }
        })
    })

    const onPopoverClose = useCallback(() => {
        setState(state => {
            return {
                ...state,
                anchorEl: null,
                displayCalendar: false,
            }
        })
    })

    return (
        <div style={{ display: 'flex', flexDirection: 'column' }} ref={divRef}>
            <TextField
                label={label}
                value={state.inputValue}
                InputProps={{
                    endAdornment: (
                        <InputAdornment position='end'>
                            <IconButton style={{ padding: '3px' }}>
                                {state.inputValue?.length > 1 ? (
                                    <ClearIcon onClick={handleClear} />
                                ) : (
                                    <DateRangeIcon onClick={onAdornmentClick} />
                                )}
                            </IconButton>
                        </InputAdornment>
                    ),
                }}
            />
            <Popover
                open={state.displayCalendar}
                anchorEl={state.anchorEl}
                anchorOrigin={{
                    horizontal: 'center',
                    vertical: 'bottom',
                }}
                transformOrigin={{
                    horizontal: 'center',
                    vertical: 'top',
                }}
                onClose={onPopoverClose}
            >
                <DateRange
                    focusedRange={state.focusedRange}
                    onRangeFocusChange={setFocusedRange}
                    onChange={handleOnChange}
                    showSelectionPreview={false}
                    moveRangeOnFirstSelection={false}
                    ranges={state.calendarConfig}
                    editableDateInputs={false}
                    months={1}
                />
            </Popover>
        </div>
    )
}

export default withStyles(styles, { name: 'BasicDateRangePicker' })(
    BasicDateRangePicker
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM