Удаление параметров из выбора при выборе

Попытка сделать что-то в реакции, где у меня есть дни недели с опциями выбора.

Когда вариант выбран в понедельник (например), я хочу, чтобы он не был включен в список для вторника и среды.

Быстрый визуальный макет, чтобы помочь визуализировать. https://i.imgur.com/3KhHAyn.png

Мысли до сих пор заключались в том, чтобы создать новый массив состояний под названием «доступный», затем выполнить функцию при изменении выбора, чтобы удалить его из массива и обновить состояние до этого.

Хотя это работает, оно также удаляет его из выбранного…

// function to remove from the list and update state

removeFromList = event => {
    let updatedList = this.state.availableMeals;
    console.info(event.target.value);
    updatedList = updatedList.filter(function(item) {
      return (
        item.fields.Name.toLowerCase().search(
          event.target.value.toLowerCase()
        ) === -1
      );
    });
    this.setState({ availableMeals: updatedList });
// from inside the component

<select onChange = {this.props.removeFromList}>
            <option>select an option…</option>
            {this.props.meals.map(meal => (
              <option key = {meal.id}>{meal.fields.Name}</option>
            ))}
          </select>

Любые идеи о том, как подойти к чему-то подобному?

Мысли, которые у меня были, были о том, чтобы сохранять каждый день и выбранный вариант для указания, а затем ссылаться на это после того, как выбор был сделан?

простая тройка на карте return availablesIncludesOption() ? <option /> : null

xadm 20.05.2019 23:20
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
868
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Будет лучше не удалять опцию из списка в состоянии, а фильтровать ваши опции, когда вы их рендерите:

  1. Дочерний компонент с раскрывающимся списком:
class DropDown extends React.Component {
    onSelect = event => {
        this.props.selectItem(this.props.name, event.target.value);
    };

    render() {
        return (
            <select onChange = {this.onSelect}>
                <option>select an option…</option>
                {this.props.meals.map(meal => (
                    <option key = {meal.id} value = {meal.id}>{meal.value}</option>
                ))}
            </select>
        );
    }
}
  1. Родительский компонент:
class ParentComponent extends React.Component {
    constructor() {
        super();
        this.state = {
            selectedItems: {}
        };
    }

    getFilteredMeals(name) {
        const removedItems = { ...this.state.selectedItems };
        delete removedItems[name];
        const removedItemsList = Object.values(removedItems);
        return this.props.meals.filter(item => {
            return !removedItemsList.includes(item.id);
        });
    }

    getValue(name) {
        return this.state.selectedItems[name];
    }

    selectItem = (name, value) => {
        this.setState({
            selectedItems: {
                ...this.state.selectedItems,
                [name]: value
            }
        });
    };

    render() {
        return (
            <div>
                <DropDown
                    name = "monday"
                    selectItem = {this.selectItem}
                    meals = {this.getFilteredMeals("monday")}
                    value = {this.getValue("monday")}
                />
                <DropDown
                    name = "tuesday"
                    selectItem = {this.selectItem}
                    meals = {this.getFilteredMeals("tuesday")}
                    value = {this.getValue("tuesday")}
                />
                <DropDown
                    name = "wednesday"
                    selectItem = {this.selectItem}
                    meals = {this.getFilteredMeals("wednesday")}
                    value = {this.getValue("wednesday")}
                />
            </div>
        );
    }
}

Я создал для вас рабочий пример: https://codesandbox.io/embed/галантный-мурдок-vsibi

@xadm Я обновил свой ответ примером для многих элементов.

Andrii Golubenko 21.05.2019 00:05

@AndriiGolubenko спасибо за это! Все еще довольно новичок в реагировании, поэтому интересно узнать рекомендуемые шаблоны для таких вещей.

Craig 21.05.2019 22:14

Это может быть немного удивительно... и смешно

У вас есть отфильтрованный список this.state.availableMeals - вероятно, инициализирован из this.props.meals...

тогда почему бы не использовать это для рендера?

{this.state.availableMeals.map(meal => (
  <option key = {meal.id}>{meal.fields.Name}</option>
))}

Хранение отфильтрованного списка может быть более эффективным - не нужно пересчитывать во время render.

Если вы отфильтруете параметры для всех раскрывающихся списков, выбранный вами вариант исчезнет в раскрывающемся списке, где вы выбрали этот параметр.

Andrii Golubenko 21.05.2019 00:09

Вы правы... но не всегда нужно, т.е. визуализировать <Chip/> (или что-то еще, одно или несколько) перед <Select/> - таким образом мы выбираем набор опций, доступных для добавления (добавления) или замены выбранных в данный момент опций.

xadm 21.05.2019 00:16

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