#javascript #json #reactjs
Вопрос:
У меня есть некоторые данные json, которые выглядят так:
{
"author1": {
"books": [{
"title": "title1"
},
{
"title": "title2"
}
],
"movies": [{
"title": "movie1"
},
{
"title": "movie2"
}
]
}
}
Я хочу, чтобы выпадающий список был заполнен авторами (например, author1). Когда этот раскрывающийся список выбран, я затем хочу заполнить другой раскрывающийся список ключами для этого автора (книги и фильмы).
Итак. если мой json находится в переменной с именем data, я хочу заполнить первый раскрывающийся data.keys()
список, а затем второй, data[author].keys()
где автор-значение, выбранное в первом раскрывающемся списке.
Я видел много примеров заполнения с помощью json, но не с помощью ключей. Я очень новичок в реагировании на JS, поэтому я не уверен, как это сделать.
Спасибо
Комментарии:
1. Я говорю это наилучшим из возможных способов. Я хотел бы задать хорошие вопросы, которые могут принести пользу сообществу. Однако, когда люди голосуют за закрытие, не оставляя комментариев о том, почему они так проголосовали, это очень затрудняет написание лучших вопросов в будущем. Я понимаю, что некоторые вопросы не являются хорошими вопросами, пожалуйста, оставьте комментарий, чтобы помочь запрашивающему (и не только мне). Спасибо
Ответ №1:
вы можете использовать следующий поток.
const AuthorData = ({ symtomsData }) => {
const [data] = useState({
author1: {
books: [
{
title: "title1"
},
{
title: "title2"
}
],
movies: [
{
title: "movie1"
},
{
title: "movie2"
}
]
},
author2: {
books: [
{
title: "titleasd"
},
{
title: "titleqweqw"
}
],
movies: [
{
title: "movieqwewq"
},
{
title: "movieqweqwe"
}
]
}
});
const [authorWroks, setAuthorWorks] = useState({});
const [selectedData, setSelectedData] = useState([]);
const onChangeAuthor = useCallback(
(e) => {
const authorSelected = e.target.value;
if (authorSelected) {
setAuthorWorks(data[authorSelected]);
} else {
setAuthorWorks([]);
}
},
[data]
);
const changeItem = useCallback(
(e) => {
const itemSelected = e.target.value;
console.log("itemSelected", itemSelected);
if (itemSelected) {
console.log("authorWroks", authorWroks[itemSelected]);
setSelectedData(authorWroks[itemSelected]);
} else {
setSelectedData([]);
}
},
[authorWroks]
);
return (
<Grid>
<Col>
<select onChange={onChangeAuthor}>
<option value="">select</option>
{Object.keys(data).map((key, i) => (
<option value={key}>{key}</option>
))}
</select>
<br />
<div>
{Object.keys(authorWroks).length ? (
<select onChange={changeItem}>
<option value="">select</option>
{Object.keys(authorWroks || []).map((key, i) => (
<option onChange={changeItem} value={key}>
{key}
</option>
))}
</select>
) : undefined}
</div>
<div>
{selectedData.length ? (
<select>
<option value="">select</option>
{(selectedData || []).map((data, i) => (
<option onChange={changeItem} value={data.title}>
{data.title}
</option>
))}
</select>
) : undefined}
</div>
</Col>
</Grid>
);
};