Вероятно, здесь три отдельных ответа:
Я бы просто использовал файл useState
calls
Поскольку вы сказали, что все обработчики разделены, и вы пишете кнопки отдельно , Я бы просто использовал пять useState
звонков. Просто, понятно, избегает перекрестных помех между кнопками.
Но вы сказали, что не хотите этого делать, так что для ответа на # 2 ...: -)
Используйте массив обработчиков и объект для флагов
(на самом деле, мне не нравится этот, как следующий; поэтому прочтите его, но потом продолжайте читать.)
Вы могли бы поместить эти функции в массив и, вероятно, сделать флаги объектом с ключом id
кнопки, который мы можем создать из индекса:
function Mata() {
const [isCopied, setIsCopied] = useState({});
// ...create handlers...
const buttonHandlers = [handleBtn1, handleBtn2, handleBtn3, handleBtn4, handleBtn5];
return (
<div className="container">
{buttonHandlers.map((handleBtn, index) => {
const flag = isCopied[index];
return <button id={index} style={{ backgroundColor: flag ? '#262626' : '#F3F3F3'}} className={`btn${index+1} ${flag && activeTab}`} onClick={handleBtn}>Copy anything</button>;
})}
</div>
);
}
В функции-обработчике:
function handleBtn1(evt) {
// ...logic...
if (/*...need to set the flag...*/) {
setIsCopied(isCopied => ({...isCopied, [evt.target.id]: true}));
} else if (/*...need to clear the flag...*/) {
setIsCopied(isCopied => ({...isCopied, [evt.target.id]: true}));
}
}
Кто-то может вам сказать, что id
значения не могут начинаться с цифр. Это неправильно, могут. Это селекторы CSS ID, которые не могут начинаться с неэкранированного di git, но мы здесь не используем CSS.
Используйте объект для флагов, введенных ключом id
button
Или полностью отказаться от массива, так как он больше не покупает вас:
function Mata() {
const [isCopied, setIsCopied] = useState({});
// ...create handlers...
return (
<div className="container">
<button id="btn1" style={{ backgroundColor: isCopied.btn1 ? '#262626' : '#F3F3F3'}} className={`btn1 ${isCopied.btn1 && activeTab}`} onClick={handleBtn1}>Copy anything</button>
<button id="btn2" style={{ backgroundColor: isCopied.btn2 ? '#262626' : '#F3F3F3'}} className={`btn2 ${isCopied.btn2 && activeTab}`} onClick={handleBtn2}>Copy something</button>
<button id="btn3" style={{ backgroundColor: isCopied.btn3 ? '#262626' : '#F3F3F3'}} className={`btn3 ${isCopied.btn3 && activeTab}`} onClick={handleBtn3}>Copy Imgae</button>
<button id="btn4" style={{ backgroundColor: isCopied.btn4 ? '#262626' : '#F3F3F3'}} className={`btn4 ${isCopied.btn4 && activeTab}`} onClick={handleBtn4}>Copy text</button>
<button id="btn5" style={{ backgroundColor: isCopied.btn5 ? '#262626' : '#F3F3F3'}} className={`btn5 ${isCopied.btn5 && activeTab}`} onClick={handleBtn5}>Copy Link</button>
</div>
);
}