Автозаполнение пользовательского интерфейса материала getOptionSelected Несоответствие между жестко заданными параметрами и состоянием - PullRequest
0 голосов
/ 07 августа 2020

У меня есть этот Material UI Autocomplete Component, и всякий раз, когда я выбираю элемент, (1) его значение устанавливается в состояние. (2) Когда он выбран, он больше не должен отображаться в качестве опции в компоненте Autocomplete.

Однако обратите внимание на свойство options, которое я передал компоненту Autocomplete. Вы заметите, что у меня их 2, и 1 из них закомментирован. Проблема в том, что когда я использую подход, основанный на состоянии, моя реализация работает так, как ожидалось (т. Е. Удовлетворяет требованиям 1 и 2). Однако, когда я не использую подход на основе состояний и использую жестко запрограммированный массив, проверка равенства в методе handleGetOptionSelected кажется неуспешной.

Обратите внимание, что у меня уже есть решение этой проблемы, просто проверяя language. Мне больше интересно узнать, почему это происходит.

const handleGetOptionSelected = (option, value) => {
  return option.language === value.language;
}; /* I already know about this */

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

Журналы массивов на основе состояний:
enter image description here

Hardcoded array logs:
enter image description here

options={[{ language: "C" }, { language: "C#" }, { language: "C++" }]} // this causes error in equality checking

options={availableLanguages} // this approach works fine

import React, { useState } from "react";
import TextField from "@material-ui/core/TextField";
import { Autocomplete } from "@material-ui/lab";

export default function App() {
  const [languages, setLanguages] = useState([]);

  const [availableLanguages] = useState([
    { language: "C" },
    { language: "C#" },
    { language: "C++" }
  ]);

  const handleGetOptionSelected = (option, value) => {
    console.log(`option`, option);
    console.log(`value`, value);
    console.log(`is equal`, option === value);
    return option === value;
  };

  return (
      Выбранные языки  {languages.map ((элемент, индекс) => ( {item.language} ))} handleGetOptionSelected (параметр, значение)} onChange = {(событие, значение) => setLanguages ​​(значение)} ChipProps = {{style: {backgroundColor: "# 2EC5B6", borderRadius: "5px", color: "#fff", fontFamily : "Source Sans Pro"}}} id = "tags-standard" options = {[{language: "C"}, {language: "C#"}, {language: "C ++"}]} / / это вызывает ошибку при проверке равенства // options = {availableLanguages} // этот подход работает нормально getOptionLabel = {(option) => option.language} renderInput = {(params) => ( )} /> ); } 

CodeSandBox: https://codesandbox.io/s/so-material-ui-autocomplete-question-gen4q?file= / src / App. js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...