Получить данные в раскрывающемся списке на основе другого значения раскрывающегося списка

Пример данных API — http://demo6007276.mockable.io/test

У меня есть три раскрывающихся списка:

  1. From Release
  2. To Release
  3. 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

Любое предложение, пожалуйста?

Можете ли вы разместить это на codeandbox?

Prathamesh Koshti 14.12.2020 18:48

@PrathameshKoshti проверьте codeandbox.io/s/wandering-cache-4q4pk?file=/src/…

Nitin Bisht 14.12.2020 19:00

В вашем коде так много ошибок. Можете ли вы попробовать решить эти проблемы! Я не могу видеть пользовательский интерфейс из-за ошибок

Prathamesh Koshti 14.12.2020 19:11

От API я получаю в ответ undefined, из-за чего метод фильтрации не работает

Prathamesh Koshti 14.12.2020 19:13

@PrathameshKoshti да, я только что проверил. Однако он работает в коде визуальной студии. Можете ли вы сказать, почему это происходит? Вот путь к API demo6007276.mockable.io/test

Nitin Bisht 14.12.2020 19:24

Я смог запустить его в своей локальной системе. Можете ли вы рассказать мне о вещи? КОГДА я выбираю один вариант из «Выпустить», что должно отображаться в третьем раскрывающемся списке? Совместимость, которая связана с релизом? Верно? Так вам действительно нужен этот второй вариант? Вы можете просто показать текстовое поле только для чтения для совместимости, где вы можете показать текст в соответствии с опцией «Выпустить».

Prathamesh Koshti 15.12.2020 06:54

@PrathameshKoshti да, ты прав. Мне нужно отобразить совместимость, связанную с «toRelease». Вы можете сделать это в текстовом поле, в этом случае нам не нужен третий раскрывающийся список. Я сохранил его, учитывая другие вещи. Кстати, спасибо, что уделили время и настроили что-то в вашей системе. Любая помощь приветствуется. Еще раз спасибо!!

Nitin Bisht 15.12.2020 16:54

Ладно посмотрю на это

Prathamesh Koshti 15.12.2020 17:36

@PrathameshKoshti, не могли бы вы проверить codeandbox.io/s/github/abiodunsulaiman694/excel-app/tree/… Не удалось правильно добавить в него несколько строк. Любая помощь будет оценена спасибо

Nitin Bisht 29.12.2020 11:55

Можете ли вы создать новый вопрос и, пожалуйста, добавьте в него описание

Prathamesh Koshti 29.12.2020 12:12

@PrathameshKoshti вот ссылка на вопрос stackoverflow.com/questions/65494848/…

Nitin Bisht 29.12.2020 16:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
11
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал несколько изменений в вашем коде. Я создал новое состояние для массива совместимости, который будет содержать совместимости на основе выбранного 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.

Другие вопросы по теме