I have a component that contains a Checkbox
component from the @fluentui/react-components
library, and I am using an onChange
event on the Checkbox
component.
const ContactText = ({ contact, contactKey, selectedContacts, setSelectedContacts }) => {
return (
<div>
<img src={contactIcon} alt="Contact Icon" />
<div>
<Checkbox
labelPosition="before"
label={`${contact.firstname} ${contact.surname}`}
checked={selectedContacts.filter((contact) => contact.key == contactKey).checked}
//@ts-ignore - Ignore event parameter on onChange
onChange={(event, data) => {
setSelectedContacts((prevState: SelectedContactModel[]) =>
data.checked
? [
...prevState,
{
key: contactKey,
checked: data.checked,
companyKey: contact.companyKey,
companyName: contact.companyName,
individual: contact.individual,
title: contact.title,
firstname: contact.firstname,
surname: contact.surname,
telephone: contact.telephone,
mobile: contact.mobile,
retired: contact.retired,
address: contact.address,
postcode: contact.postcode,
email: contact.email,
},
]
: prevState.filter((contact) => contact.key !== contactKey)
);
}}
/>
{contact.email != "" ? <SecondaryText text={contact.email} /> : <></>}
{contact.telephone != "" ? <TertiaryText text={contact.telephone} /> : <></>}
{contact.mobile != "" ? <TertiaryText text={contact.mobile} /> : <></>}
</div>
</div>
);
};
I want to have the onChange to happen when I click the outermost div of the ContactText component. I have seen people using useRef
although I am wondering if there are different ways of doing this.
2
Answers
You can either add a
onClick
etc on thediv
element and do what you do inside theonChange
in theCheckbox
(although you will need to computechecked
like you do in the render), or you can just change the<div>
into a<label>
as clicking on a label will delegate the click to whichever<input>
element it wraps (or has afor
with a matching ID).Try this
useImperativeHandle
enables you to expose methods that only you want to be available outside of your component.