React Hooks - сбросить раскрывающийся список

Я тестирую несколько элементов select / option с помощью React Hooks. Мне удалось заполнить раскрывающиеся меню из локального списка, а также использовать метод получения API-интерфейса axios. Наконец, я создал кнопку сброса, чтобы сбросить эти раскрывающиеся значения в исходные значения (например, «выбрать состояние» и «выбрать автора»), но не смог заставить это работать, я не уверен, как лучше всего сбросить эти значения. ценности.

Вместо того, чтобы размещать здесь код, я добавил сюда ссылку на этот пример проекта. Любые советы / указатели очень ценятся.

CodeSanbox ссылка на проект

import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import axios from "axios";
import StateSelector from "./StateSelector";
import Footer from "./Footer";

const SelectTesting = () => {
const reqUrl = "https://hn.algolia.com/api/v1/search?query=redux";

const initialStateValue = [{ id: 0, value: " --- Select A State --- " }];
const initialAuthorValue = [" --- Select an Author --- "];

const allowedState = [
  { id: 1, value: "Alabama" },
  { id: 2, value: "Georgia" },
  { id: 3, value: "Missisippi" }
];

const [authors, setAuthors] = useState(initialAuthorValue);
const [allStates, setAllSelected] = useState(initialStateValue);
const [stateSelected, setStateSelected] = useState(initialStateValue[0].value);

let authorComponent = null;

// useEffect to get states
useEffect(() => {
  console.info("Inside effect");
  const stateValues = initialStateValue;
  allowedState.map(sel => {
    stateValues.push(sel);
    return setAllSelected(stateValues);
  });
}, []);

// useEffect to get Authors
useEffect(() => {
  console.info("Inside effect 2");
  axios(reqUrl).then(result =>
    result.data.hits.map(res => {
      initialAuthorValue.push(res.author);
      return setAuthors(initialAuthorValue);
    })
  );
}, []);

authorComponent = (
  <select>
    {authors.map((author, index) => (
      <option key = {index}>{author}</option>
    ))}
  </select>
);

const stateSelectionHandler = event => {
  const value = event.target.value;
  console.info(allStates);
  const stateIndex = allStates.findIndex(state => state.value === value);
  console.info(event.target.value, allStates, "index:", stateIndex);
  setStateSelected(event.target.value);
};

const resetClickHandler = () => {
  console.info("reset was clicked");
  setStateSelected(initialStateValue[0].value);
};

console.info("Inside Index.js Main");

return (
  <div>
    <hr />
      <StateSelector
      selectedState = {stateSelected}
      allStates = {allStates}
      onStateSelection = {stateSelectionHandler}
      />
    <hr />
    <label>Author:</label>
    {authorComponent}
   <hr />
   <Footer onResetClick = {resetClickHandler} />
  </div>
);
};

const rootElement = document.getElementById("root");
ReactDOM.render(<SelectTesting />, rootElement);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
5 843
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Единственное, чего вам не хватает, это на самом деле только атрибут value в вашем элементе select <select onChange = {onStateSelection} value = {props.selectedState}>.

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

https://codesandbox.io/s/j7zwxnn65w

Спасибо!! Черт, я бился головой об стену. Изначально у меня был компонент StateSelector как без состояния, я часто менял этот компонент, чтобы заставить его работать. Я исходил из предположения, что если я могу изменить одну из переменных statefull, она повторно отобразит dom в StateSelector ... :)

shavi 18.12.2018 20:11

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