I have a modal with a list of answers. I can either click an answer to select it, then click a button to confirm my choice. Or I can double-click an answer to select it and confirm.
I’m having trouble properly handling the double-click case.
With React class components, I would have used setState()
‘s callback like this:
JavaScript
x
2
1
setState({selectedAnswer: answer}, confirm)
2
But right now, I only figured out the following:
JavaScript
1
37
37
1
const MyModal = ({hide, setAnwser}) => {
2
const [selectedAnswer, setSelectedAnswer] = useState(null);
3
const [isSelectionDone, setIsSelectionDone] = useState(false);
4
5
const confirm = () => {
6
if (!selectedAnswer) {
7
return;
8
}
9
10
setAnwser(selectedAnswer);
11
hide();
12
};
13
14
const handleAnswerOnClick = (answer) => {
15
setSelectedAnswer(answer);
16
};
17
18
const handleAnswerOnDoubleClick = (answer) => {
19
setSelectedAnswer(answer);
20
setIsSelectionDone(true);
21
};
22
23
useEffect(confirm, [isSelectionDone]);
24
25
return (
26
<div>
27
<div>{answers.map((answer) => <MyAnswer
28
isSelected={answer.id === selectedAnswer?.id}
29
key={answer.id}
30
answer={answer}
31
onClick={handleAnswerOnClick}
32
onDoubleClick={handleAnswerOnDoubleClick}/>)}</div>
33
<button onClick={confirm}>Confirm</button>
34
</div>
35
);
36
}
37
I strongly suspect that there’s a nicer/better way of doing it.
Maybe a simple:
JavaScript
1
34
34
1
const MyModal = ({hide, setAnwser}) => {
2
const [selectedAnswer, setSelectedAnswer] = useState(null);
3
4
const confirm = () => {
5
if (!selectedAnswer) {
6
return;
7
}
8
9
setAnwser(selectedAnswer);
10
hide();
11
};
12
13
const handleAnswerOnClick = (answer) => {
14
setSelectedAnswer(answer);
15
};
16
17
const handleAnswerOnDoubleClick = (answer) => {
18
setAnwser(answer);
19
hide();
20
};
21
22
return (
23
<div>
24
<div>{answers.map((answer) => <MyAnswer
25
isSelected={answer.id === selectedAnswer?.id}
26
key={answer.id}
27
answer={answer}
28
onClick={handleAnswerOnClick}
29
onDoubleClick={handleAnswerOnDoubleClick}/>)}</div>
30
<button onClick={confirm}>Confirm</button>
31
</div>
32
);
33
}
34
Which way is better?
Advertisement
Answer
There is no similar set state in hooks (which fires callback after state is set). But, you could apply following refactor:
JavaScript
1
9
1
const confirm = (sAnswer = selectedAnswer) => {
2
if (!sAnswer) {
3
return;
4
}
5
6
setAnwser(sAnswer);
7
hide();
8
};
9
And then
JavaScript
1
5
1
const handleAnswerOnDoubleClick = (answer) => {
2
setSelectedAnswer(answer);
3
confirm(answer);
4
};
5