Ad
Unable To Setstate In React
I am trying to use function components in which eventoffset value is initially set to -1. when user clicks "ok" to save the values in backend func saveEvent is called and in that calOffsetUTC is calculating the new offset and utc values which set the state values accordingly. I am trying to call addTimeline() with new offset and utc values but it seems state values are not updated.
where am i going wrong.
Any help appreciated.
const Dialog = (props: Props) => {
let currentdate = new Date(Date.now());
const [eventDate, seteventDate] = React.useState(currentdate);
const [eventOffset, seteventOffset] = React.useState(-1);
const [eventUTC, seteventUTC] = React.useState();
const calcOffsetUTC = (date) => {
var selectedDate = date;
if (eventOffset == -1) {
var offset = selectedDate.getTimezoneOffset() * 60;
var utc = selectedDate.valueOf();
seteventOffset(offset); //trying to set state of "eventoffset"
seteventTime(utc);
}
}
const saveEvent = () => {
calcOffsetUTC(eventDate);
props.addTimeline(eventUTC, eventOffset); //latest eventoffset value is not found here.
}
const buttons = [];
buttons.push({ text: translate("ok"), icon: "ok", callback: () => saveEvent() });
return <Dialog buttons={buttons} ></Dialog>;
}
Ad
Answer
Few options to use correct updated state values
Return the next state computed values
const Dialog = (props: Props) => {
let currentdate = new Date(Date.now());
const [eventDate, seteventDate] = React.useState(currentdate);
const [eventOffset, seteventOffset] = React.useState(-1);
const [eventUTC, seteventUTC] = React.useState();
const calcOffsetUTC = (date) => {
var selectedDate = date;
if (eventOffset === -1) {
var offset = selectedDate.getTimezoneOffset() * 60;
var utc = selectedDate.valueOf();
seteventOffset(offset);
seteventTime(utc);
return { offset, utc }; // return computed values
}
return {}; // return defined object for unhappy path
}
const saveEvent = () => {
const { offset, utc } = calcOffsetUTC(eventDate);
offset && utc && props.addTimeline(utc, offset); // use returned values
}
const buttons = [];
buttons.push({ text: translate("ok"), icon: "ok", callback: () => saveEvent() });
return <Dialog buttons={buttons}></Dialog>;
}
Do it all in the handler
const Dialog = (props: Props) => {
let currentdate = new Date(Date.now());
const [eventDate, seteventDate] = React.useState(currentdate);
const [eventOffset, seteventOffset] = React.useState(-1);
const [eventUTC, seteventUTC] = React.useState();
const saveEvent = () => {
var selectedDate = eventDate;
if (eventOffset === -1) {
var offset = selectedDate.getTimezoneOffset() * 60;
var utc = selectedDate.valueOf();
seteventOffset(offset);
seteventTime(utc);
props.addTimeline(utc, offset);
}
}
const buttons = [];
buttons.push({ text: translate("ok"), icon: "ok", callback: () => saveEvent() });
return <Dialog buttons={buttons}></Dialog>;
}
Use effect hook
const Dialog = (props: Props) => {
let currentdate = new Date(Date.now());
const [eventDate, seteventDate] = React.useState(currentdate);
const [eventOffset, seteventOffset] = React.useState(-1);
const [eventUTC, seteventUTC] = React.useState();
useEffect(() => {
props.addTimeline(eventUTC, eventOffset); // use latest values here
}, [eventOffset, eventUTC]);
const calcOffsetUTC = (date) => {
var selectedDate = date;
if (eventOffset === -1) {
var offset = selectedDate.getTimezoneOffset() * 60;
var utc = selectedDate.valueOf();
seteventOffset(offset);
seteventTime(utc);
}
}
const saveEvent = () => {
calcOffsetUTC(eventDate);
}
const buttons = [];
buttons.push({ text: translate("ok"), icon: "ok", callback: () => saveEvent()
});
return <Dialog buttons={buttons} ></Dialog>;
}
NOTE: With the effect you may as well just make calcOffsetUTC
the callback since as this point saveEvent
is merely proxying the date.
Ad
source: stackoverflow.com
Related Questions
- → How to update data attribute on Ajax complete
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → Octobercms Component Unique id (Twig & Javascript)
- → Passing a JS var from AJAX response to Twig
- → Laravel {!! Form::open() !!} doesn't work within AngularJS
- → DropzoneJS & Laravel - Output form validation errors
- → Import statement and Babel
- → Uncaught TypeError: Cannot read property '__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED' of undefined
- → React-router: Passing props to children
- → ListView.DataSource looping data for React Native
- → Can't test submit handler in React component
- → React + Flux - How to avoid global variable
- → Webpack, React & Babel, not rendering DOM
Ad