Как использовать startWith с отправкой формы при фильтрации данных массива из API в React?

Извините за нубский вопрос, только начинаю работать с React. Итак, моя страница обращается к списку округов, отформатированному как массив, из API с использованием этого компонента:

class FetchRandomCounty extends React.Component {
  state = {
    loading: true,
    county: null,
  };

  async componentDidMount() {
    const url = "http://localhost:5000/api/counties";
    const response = await fetch(url);
    const data = await response.json();
    this.setState({ county: data, loading: false });
  }

  render() {
    return (
      <div>
        {this.state.loading || !this.state.county ? (
          <div> loading... </div>
        ) : (
          <div>
            <div>
              {" "}
              {this.state.county
                .filter((item) => item.startsWith("J"))
                .map((item) => (
                  <li key = {item}>{item}</li>
                ))}{" "}
            </div>
          </div>
        )}
      </div>
    );
  }
}

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

["Aransas", "Austin", "Bastrop", "Bee", "Brazoria", "Burleson", "Caldwell", "Calhoun", "Chambers", "Colorado", "Comal", "De Witt", "Fayette", "Fort Bend", "Galveston", "Goliad", "Gonzales", "Grimes", "Guadalupe", "Hardin", "Harris", "Jackson", "Jasper", "Jefferson", "Jim Wells"]

И вывод в настоящее время таков:

  • Джексон
  • Джаспер
  • Джефферсон
  • Джим Уэллс

Как предложить пользователю ввести букву и отфильтровать массив, чтобы отображались только данные, начинающиеся с этой буквы? Сейчас я использую item.startsWith('J')) и хочу, чтобы он реагировал на ввод пользователя. Это мой компонент пользовательского ввода:

class LetterForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = { value: "" };
    this.handleChangeEvent = this.handleChangeEvent.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChangeEvent(event) {
    this.setState({ value: event.target.value });
  }

  handleSubmit(event) {
    alert("A letter was submitted: " + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit = {this.handleSubmit}>
        <label>
          StartsWith:
          <input
            type = "text"
            value = {this.state.value}
            onChange = {this.handleChangeEvent}
          />
        </label>
        <input type = "submit" value = "Submit" />
      </form>
    );
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Пример

const data = [
  "Aransas",
  "Austin",
  "Bastrop",
  "Bee",
  "Brazoria",
  "Burleson",
  "Caldwell",
  "Calhoun",
  "Chambers",
  "Colorado",
  "Comal",
  "De Witt",
  "Fayette",
  "Fort Bend",
  "Galveston",
  "Goliad",
  "Gonzales",
  "Grimes",
  "Guadalupe",
  "Hardin",
  "Harris",
  "Jackson",
  "Jasper",
  "Jefferson",
  "Jim Wells"
];

class FetchRandomCounty extends React.Component {
  state = {
    loading: true,
    county: null
  };

  componentDidMount() {
    // const url = "http://localhost:5000/api/counties";
    // const response = await fetch(url);
    // const data = await response.json();
    this.setState({ county: data, loading: false });
  }

  render() {
    const { loading, county } = this.state;
    const selectedLetter = this.props.selectedLetter.toLowerCase();

    return (
      <div>
        {loading || !county ? (
          <div> loading... </div>
        ) : (
          <div>
            <div>
              {county
                .filter((item) => item.toLowerCase().startsWith(selectedLetter))
                .map((item) => (
                  <li key = {item}>{item}</li>
                ))}
            </div>
          </div>
        )}
      </div>
    );
  }
}

class LetterForm extends React.Component {
  state = { value: "" };

  handleChangeEvent = (event) => {
    this.setState({ value: event.target.value.slice(0, 1) });
  };

  handleSubmit = (event) => {
    event.preventDefault();
    this.props.onChange(this.state.value);
  };

  render() {
    return (
      <form onSubmit = {this.handleSubmit}>
        <label>
          StartsWith:
          <input
            type = "text"
            value = {this.state.value}
            onChange = {this.handleChangeEvent}
          />
        </label>
        <input type = "submit" value = "Submit" />
      </form>
    );
  }
}


class App extends React.Component {
  state = { selectedLetter: "J" };

  updateLetter = (selectedLetter) => {
    this.setState({ selectedLetter });
  };

  render() {
    return (
      <div>
        <FetchRandomCounty selectedLetter = {this.state.selectedLetter} />
        <LetterForm onChange = {this.updateLetter} />
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>

<div id = "root"></div>

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