#javascript #reactjs
Вопрос:
У меня есть форма с флажками. Мне нужно отключить флажок, когда установлено максимальное количество флажков. Это то, что я пробовал до сих пор:
const maxOptions = 2;
const optionChecked = []
const checkedCount = optionChecked.length;
function handleChecked(e) {
let index;
if (e.target.checked) {
optionChecked.push(
e.target.value
)
} else {
index = optionChecked.indexOf( e.target.value)
optionChecked.splice(index, 1)
}
console.log(optionChecked.length)
}
//my checkbox
{Opcoes.map((a) => (
<section className='product-options'>
<a>
<text> {a.Nome} </text>
<input type='checkbox'
value = {a.ID}
onChange = {(e) => handleChecked(e) }
disabled = {!optionChecked[a.ID] amp;amp; checkedCount === maxOptions ? true: false}
></input>
</a>
</section>
))}
Ответ №1:
const maxOptions = 2;
const [checkedCount, setCheckedCount] =useState(0)
function handleChecked(e) {
e.target.checked?setCheckedCount(prevCount=>prevCount 1):setCheckedCount(prevCount=>prevCount-1)
}
console.log(checkedCount)
//my checkbox
{Opcoes.map((a) => (
<section className='product-options'>
<a>
<text> {a.Nome} </text>
<input type='checkbox'
value = {a.ID}
onChange = {(e) => handleChecked(e) }
disabled = { checkedCount ===maxOptions}
></input>
</a>
</section>
))}
Комментарии:
1. Спасибо, но этот код отключит все флажки, я хочу отключить только тот флажок, который не установлен, потому что, если пользователю нужно изменить параметры, установленные флажки нельзя отключить
2. @MatheusMartins мой новый ответ должен решить ваши требования прямо сейчас.
Ответ №2:
Если вы хотите включить отмеченные элементы, вы можете сделать что-то вроде этого:
import { useState, useRef, createRef } from "react";
function App() {
const maxOptions = 1;
const [checkedCount, setCheckedCount] = useState(0);
function handleChecked(e) {
e.target.checked
? setCheckedCount((prevCount) => prevCount 1)
: setCheckedCount((prevCount) => prevCount - 1);
}
const Opcoes = [
{ Nome: "pepita", ID: "1" },
{ Nome: "pepito", ID: "2" },
];
let items = useRef(Opcoes.map(() => createRef()));
return (
<>
<div>
{Opcoes.map((a, ind) => (
<section className="product-options" key={ind}>
<a>
<text> {a.Nome} </text>
<input
type="checkbox"
value={a.ID}
onChange={(e) => handleChecked(e)}
ref={items.current[ind]}
disabled={
checkedCount === maxOptions amp;amp;
!items?.current[ind]?.current.checked
}
></input>
</a>
</section>
))}
</div>
</>
);
}
export default App;