Пример данных API — http://demo6007276.mockable.io/test
У меня есть три раскрывающихся списка:
From Release
To Release
Compatability
Как только я выберу конкретный from release
, все to releases
, связанные с этим from release
, должны быть доступны в раскрывающемся списке To Release
, который работает. Теперь я не могу выбрать конкретный to release
из раскрывающегося списка To release
, и он должен показать свою совместимость в раскрывающемся списке «Совместимость». Вот мой код:
const URL = "http://demo6007276.mockable.io";
export const fetchRelease = async () => {
try {
const { data } = await axios.get(`${URL}/test`);
return data;
} catch (error) {
console.info(error);
}
}
function HomeFragement() {
const classes = Styles();
const [releases, setReleases] = React.useState([]);
const [fromRelease, setFromRelease] = React.useState('Release1');
const [toRelease, setToRelease] = React.useState('');
const [compatability, setCompatability] = React.useState('');
React.useEffect(() => {
let unmounted = false;
const handleFetchReleases = async () => {
const response = await fetchRelease();
if (!unmounted) {
setReleases(response);
}
}
handleFetchReleases();
return () => {
unmounted = true;
};
}, [])
let tRelease = releases.filter(item => {
return item.fromRelease === fromRelease
})
let compt = releases.filter(item => {
return item.fromRelease === fromRelease
})
const handleChangeEventFromRelease = (e) => {
setFromRelease(e.target.value);
}
const handleChangeEventToRelease = (e) => {
setToRelease(e.target.value);
}
const handleChangeEventCompatability = (e) => {
setCompatability(e.target.value);
}
return (
<div>
<Box bgcolor = "#fff" boxShadow = {1} p = {2}>
<form className = {classes.root} autoComplete = "off">
<Grid container spacing = {3}>
<Grid item xs = {3}>
<InputLabel>From Release</InputLabel>
<Select value = {fromRelease} onChange = {(e) => handleChangeEventFromRelease(e)}>
{
releases.map((pvalue, i) => {
return <MenuItem key = {i} value = {pvalue.fromRelease}> {pvalue.fromRelease} </MenuItem>
})
}
</Select>
</Grid>
<Grid item xs = {3}>
<InputLabel>To Release</InputLabel>
<Select value = {toRelease} onChange = {(e) => handleChangeEventToRelease(e)}>
{
tRelease[0] && tRelease[0].releases.map((pvalue, i) => {
return <MenuItem key = {i} value = {pvalue.toRelease}> {pvalue.toRelease} </MenuItem>
})
}
</Select>
</Grid>
<Grid item xs = {3}>
<InputLabel>Compatability</InputLabel>
<Select value = {compatability} onChange = {(e) => handleChangeEventCompatability(e)}>
{
compt[0] && compt[0].releases.map((pvalue, i) => {
return <MenuItem key = {i} value = {pvalue.compatability}> {pvalue.compatability} </MenuItem>
})
}
</Select>
</Grid>
</Grid>
</form>
</Box>
</div>
)
}
export default HomeFragement
Любое предложение, пожалуйста?
@PrathameshKoshti проверьте codeandbox.io/s/wandering-cache-4q4pk?file=/src/…
В вашем коде так много ошибок. Можете ли вы попробовать решить эти проблемы! Я не могу видеть пользовательский интерфейс из-за ошибок
От API я получаю в ответ undefined, из-за чего метод фильтрации не работает
@PrathameshKoshti да, я только что проверил. Однако он работает в коде визуальной студии. Можете ли вы сказать, почему это происходит? Вот путь к API demo6007276.mockable.io/test
Я смог запустить его в своей локальной системе. Можете ли вы рассказать мне о вещи? КОГДА я выбираю один вариант из «Выпустить», что должно отображаться в третьем раскрывающемся списке? Совместимость, которая связана с релизом? Верно? Так вам действительно нужен этот второй вариант? Вы можете просто показать текстовое поле только для чтения для совместимости, где вы можете показать текст в соответствии с опцией «Выпустить».
@PrathameshKoshti да, ты прав. Мне нужно отобразить совместимость, связанную с «toRelease». Вы можете сделать это в текстовом поле, в этом случае нам не нужен третий раскрывающийся список. Я сохранил его, учитывая другие вещи. Кстати, спасибо, что уделили время и настроили что-то в вашей системе. Любая помощь приветствуется. Еще раз спасибо!!
Ладно посмотрю на это
@PrathameshKoshti, не могли бы вы проверить codeandbox.io/s/github/abiodunsulaiman694/excel-app/tree/… Не удалось правильно добавить в него несколько строк. Любая помощь будет оценена спасибо
Можете ли вы создать новый вопрос и, пожалуйста, добавьте в него описание
@PrathameshKoshti вот ссылка на вопрос stackoverflow.com/questions/65494848/…
Я сделал несколько изменений в вашем коде. Я создал новое состояние для массива совместимости, который будет содержать совместимости на основе выбранного toRelease (хотя сейчас вы получаете только одну совместимость, в будущем вы можете получить много, поэтому лучше иметь массив).
const [compatibilities, setCompatabilities] = React.useState([]);
Затем измененный ниже метод:
const handleChangeEventToRelease = (e) => {
const value = e.target.value;
setToRelease(value);
// first get the selected fromRelease
const fromReleaseObj = releases.find(release => release.fromRelease === fromRelease);
// by using fromRelease object get the selected toRelease object
const toReleaseObj = fromReleaseObj.releases.find(release => release.toRelease === value);
// now set the array we defined earlier using react hook to `toReleaseObj`'s compatibility
setCompatibilities([toReleaseObj.compatability])
};
В своем методе рендеринга убедитесь, что вы используете массив совместимости, который был определен ранее в этом ответе.
<Grid item xs = {3}>
<InputLabel>Compatability</InputLabel>
<Select
value = {compatability}
onChange = {(e) => handleChangeEventCompatability(e)}
>
{compatibilities.map((compatability, i) => {
return (
<MenuItem key = {i} value = {compatability}>
{" "}
{compatability}{" "}
</MenuItem>
);
})}
</Select>
</Grid>
Вот ссылка на песочницу кода: https://codesandbox.io/s/happy-bird-bme2u, это не сработает, потому что вы можете получить ошибку CORS, а в консоли вы можете увидеть Failed to fetch
. Поэтому убедитесь, что вы экспортируете его с помощью меню файлов и загрузите в свою систему.
После загрузки с помощью терминала установите пакеты npm с помощью команды npm run install
и запустите его с помощью npm start
.
Можете ли вы разместить это на codeandbox?