React — MUI — не удается отменить выбор всех элементов в режиме множественного выбора

#javascript #reactjs #material-ui

#javascript #reactjs #материал-пользовательский интерфейс

Вопрос:

Я работаю с MUI «множественный выбор» / «множественный выбор флажков».

Моя цель -> Открыть модальное значение, установить некоторое начальное значение, а затем иметь полный контроль над выбором.

Мои проблемы -> В настоящее время начальные элементы могут быть выбраны повторно, и после их выбора их нельзя отменить.

Вот изолированная среда кода, созданная из-за проблемы MUI, связанной с этой проблемой MUI

На данный момент ->Я включил 3 набора состояний в изолированную среду

 newOptions is equal to [options[1]]

1 - value: [options[1]]  -> Success
2 - value: options.slice(0,1)  -> Success
3 - value: newOptions  -> Failure
  

Отключив комментарии к различным состояниям, вы можете увидеть описанное поведение, и элементы не будут удалены из режима множественного выбора.

Мне интересно, может ли кто-нибудь описать это поведение и его решение => хотя я смог добиться некоторого успеха (используя [options[x]]), однако это не поддерживает то, что я делаю в своем проекте.

Ответ №1:

Как указано в https://github.com/mui-org/material-ui/issues/16775 , Вы можете как бы исправить это, используя ссылку на объект в качестве значения по умолчанию, например https://codesandbox.io/s/create-react-app-vgyz6

Я думаю, что при использовании ссылки на объект компонент выбора по умолчанию использует проверку равенства ссылок, поэтому отмена выбора работает.

Когда вы используете третий способ, «3 — value: newOptions -> Сбой», в Javascript даже свойства и значения 2 объектов идентичны, но сами объекты не считаются равными.

 var jangoFett = {
    occupation: "Bounty Hunter",
    genetics: "superb"
};

var bobaFett = {
    occupation: "Bounty Hunter",
    genetics: "superb"
};

// Outputs: false
console.log(bobaFett === jangoFett);
  

Комментарии:

1. Спасибо за ваш ответ, я думаю о том, как использовать это в будущем -> Я хочу сделать что-то вроде ` useEffect(() => { setState({value:arrayOfObjects})}, []) `, если я пытаюсь использовать select в качестве контролируемого компонента,Я не уверен, как я могу передать информацию в виде ссылки, как у вас, в мой useState. Хотя я адаптировал эту изолированную среду кода, я все еще не совсем уверен, как использовать это «динамически», по сути, используя то, что есть в изолированной среде, однако параметры будут с сервера

2. Я добавил пример для использования ссылки на object. codesandbox.io/s/create-react-app-forked-j6xyr

3. Извините, я не вижу разницы между связанной вами песочницей и той, которую я изначально опубликовал. Не могли бы вы дать мне номер строки, о котором вы говорите? Спасибо

4. ОК. Предположим, что ваш список параметров получен с сервера, и вы используете setState в useEffect, мы все равно можем называть его переменными options . Тогда у вас может быть список выбранных элементов, и мы назовем его selectedOptions . Ключ в том, что вам нужно заполнить selectedOptions, связав каждый выбранный элемент с соответствующим в переменных options . codesandbox.io/s/create-react-app-forked-jbqbr