Я пытаюсь получить проверенные значения флажка, а затем отобразить их в поле. У меня есть два файла: индекс с полем ввода, а затем флажок установлен в модальном режиме, который является другим компонентом, selectlanguage
. Я хочу, чтобы, когда пользователь устанавливает один или несколько флажков, значение (я) появлялось на входе, а когда оно не было отмечено, значение покидало поле.
В настоящее время я могу добиться только одного значения, отображаемого в поле ввода.
Вот фрагмент кода.
index.js
import React, { useState } from "react";
import SelectLanguage from "../../components/modal/selectLanguage";
const index = () => {
const [chosenLanguage, setChosenLanguage] = useState([]);
function checkLanguage(e) {
setChosenLanguage(e.target.name);
};
<label className="relative block p-3 border-b-2 border-gray-200 w-full" for="languages">
<span for="languages">languages</span>
<input
id="languages"
type="text"
placeholder="Spanish, Arabic"
autoComplete="off"
onClick={languageShowModal}
value={chosenLanguage}
/>
</label>
}
export default index;
selectlanguage.js
import { useState } from "react";
export default function SelectLanguage({ open, handleClose, checkLanguage }) {
const handleCheckbox = (e) => {
alert(e.target.name);
};
return open ? (
<div>
<label>
<input type="checkbox" name="spanish" onChange={checkLanguage} />
<span>spanish</span>
</label>
<label>
<input type="checkbox" name="spanish" onChange={checkLanguage} />
<span>french</span>
</label>
<label>
<input type="checkbox" name="spanish" onChange={checkLanguage} />
<span>arabic</span>
</label>
</div>
) : (
""
);
}
@szczocik, спасибо за это, в какой-то степени это работает, но теперь, когда я устанавливаю флажок, он добавляет его в список, а я снимаю флажок, он все равно добавляет его в список. Как я могу добавить только проверенные элементы?
Мне не совсем понятно, как вы все подключили, но хорошей стратегией является отражать состояние DOM в ваше состояние React (Управляемые компоненты), а затем иметь способ отображения этого состояния. В вашем случае вы хотите сохранить состояние набора флажков, и один из способов сделать это — с помощью карты.
export const MyComponent = () => {
const [ chosenLanguages, setChosenLanguages ] = useState({})
const checkLanguage = (e) => {
setChosenLanguages(prev => ({
...prev,
[e.target.value]: e.target.checked,
}))
}
const showLanguages = () => {
return Object.entries(chosenLanguages)
.filter(([_, checked]) => checked)
.map(([name, _]) => name)
.join(', ')
}
return (
<input value={showLanguages()} />
)
}
Вместо массива chosenLanguages
— это отображение названий языков в их проверенное состояние, например:
{
arabic: true,
spanish: false,
french: true,
}
Когда вы сохранили свое состояние таким образом, вы можете преобразовать его любым способом при рендеринге.
Спасибо за ответ. Использование «e.target.value» не сработало, так как я только «включался» в поле, мне пришлось изменить его на «e.target.name», так как у меня уже был атрибут имени в разных входных тегах. . Это был хороший способ сделать это?
Кроме того, я хотел бы спросить, у меня есть первое значение входных тегов, которое должно быть проверено по умолчанию, как я могу убедиться, что оно уже указано в поле, или мне нужно жестко закодировать его в состоянии «chosenLanguage». .
Хорошие вопросы, обычно флажки, которые связаны друг с другом, имеют одинаковые name
, но разные value
, поэтому я использовал здесь значение. См.: developer.mozilla.org/en-US/docs/Web/HTML/Element/Input/…
Что касается второго вопроса, ссылка, которую я предоставил на Controlled Components, должна дать подсказку. Предоставление состояния по умолчанию для chosenLanguage
является хорошей практикой, если вы заставляете входы флажка также иметь его состояние, например checked={chosenLanguages.arabic}
.
Я думаю, что то, как вы называете
setChosenLanguage(e.target.name)
, неправильно. Сначала вы устанавливаете его в массив, но затем просто переопределяете его одним значением. Вместо этого вы можете добавить/удалить значение в массив.setChosenLanguage([...chosenLanguage, e.target.name]);