Reputation: 829
Trying to update the state of a react-date-range object (next.js) in a component with useState / setState
. Not sure what I'm doing wrong, but I keep getting an error that dateRange.startDate is undefined
.
import {useState, React} from 'react'
import { DefinedRange } from 'react-date-range'
import PropTypes from 'prop-types'
export const DataCard = ({...props}) => {
let [dateRange, setDateRange] = useState([{
startDate: props.dateRange.startDate,
endDate: props.dateRange.endDate,
key: 'selection'
}])
const updateDateRange = (dateRange) => {
props.dateRange = {startDate: dateRange.startDate, endDate: dateRange.endDate}
setDateRange([props.dateRange.startDate, props.dateRange.endDate])
}
return (
<div>
<div>
<button>
<DefinedRange onChange={item=> {updateDateRange([item.selection])}} ranges={dateRange}/>
</button>
</div>
</div>
)}
DataCard.propTypes = {
header: PropTypes.string,
dateRangeComponent: PropTypes.element,
dateRange: PropTypes.object
}
DataCard.defaultProps = {
header: "Graph Name",
dateRange: {startDate: new Date(), endDate: new Date()}
}
Upvotes: 1
Views: 2534
Reputation: 1
Your initial status is an array of 1 object but when you setDateRange
, you provide an array of two objects
Your init data:
[{
startDate: props.dateRange.startDate,
endDate: props.dateRange.endDate,
key: 'selection'
}] // an array of a object
setDateRange([props.dateRange.startDate, props.dateRange.endDate]) // setDateRange([a, b]), array of two objects
It should be:
setDateRange((prevState) => ({ startDate: props.startDate, endDate: props.endDate, key: prevState.key }));
Upvotes: 0
Reputation: 7661
Your dispatch code is a bit problematic.
const updateDateRange = (dateRange) => {
console.log(dataRange)
props.dateRange = {startDate: dateRange.startDate, endDate: dateRange.endDate}
setDateRange([props.dateRange.startDate, props.dateRange.endDate])
}
I suspect two things therefore i suggest to add a console.log
.
Maybe your input isn't an array, instead it's a e
from event handler. So first need to confirm that by printing it onto screen.
When you change something, you'd like to take changes from your input, not prop
. So you need to think of why you are using props in the dispatch. Props are coming from parent, not children. Use local variable instead.
Normally we don't render stuff inside a <button>
element. It might be irrelevant to your problem, but might complicate your other parts of work. Use <div>
instead.
Upvotes: 1