Отправка не срабатывает в React Redux

#javascript #reactjs #redux

Вопрос:

Я пытаюсь создать компонент панели поиска, который позже вызовет api и сохранит результаты в redux. однако у меня возникли проблемы с правильной работой метода onChange. Мой текст на экране не меняется, но я вижу в консоли, что он продолжает выводить начальное состояние плюс последнюю букву, которую я ввел. Я сделал несколько журналов консоли, но, похоже, я вообще не могу запустить свой searchReducer.

 // Searchbar.js

const Searchbar = ({ query, results }) => {
  const onSubmit = (e) => {
    e.preventDefault();
  };

  const onChange = (e) => {
    UpdateQuery(e.target.value);
  };

  return (
    <form onSubmit={onSubmit}>
      <label htmlFor="search">Search Bar</label>
      <input
        className="search-input"
        name="search"
        type="text"
        placeholder="Search Meals..."
        value={query}
        onChange={onChange}
      />
      <input className="search-btn" type="submit" value="Search" />
    </form>
  );
};

const mapStateToProps = (state) => {
  return {
    query: state.search.query,
    results: state.search.results,
  };
};

const mapDispatchToProps = (dispatch) => {
  return {
    UpdateQuery: (query) => dispatch(UpdateQuery(query)),
    UpdateResults: (results) => dispatch(UpdateResults(results)),
  };
};

export default connect(mapStateToProps, mapDispatchToProps)(Searchbar);
 
 // search-actions.js

import * as actionTypes from "./search-types";

export const UpdateQuery = (query) => {
  console.log("query >>> "   query);
  return {
    type: actionTypes.UPDATE_QUERY,
    payload: query,
  };
};

export const UpdateResults = (results) => {
  console.log("results >>> "   results);
  return {
    type: actionTypes.UPDATE_RESULTS,
    payload: results,
  };
};
 
 // search-reducer.js 

import * as actionTypes from "./search-types";

const INITIAL_STATE = {
  query: "test",
  results: ['test'],
};

const searchReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case actionTypes.UPDATE_QUERY:
      return {
        ...state,
        query: action.payload,
      };

    case actionTypes.UPDATE_RESULTS:
      return {
        ...state,
        results: action.payload,
      };
    default:
      return state;
  }
};

export default searchReducer;

 
 // rootReducer.js

const rootReducer = combineReducers({
    shop: shopReducer,
    search: searchReducer,
});

export default rootReducer;
 

Ответ №1:

Вам нужно его уничтожить

 const Searchbar = ({ query, results, UpdateQuery, UpdateResults }) => {
 

Аналогично mapStateToProps mapDispatchToProps тому, что будет доступно подключенному компоненту в качестве Props

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

1. Спасибо! Не могу поверить, что я пропустил что-то такое простое.

Ответ №2:

Вам нужно будет получить UpdateQuery и UpdateResults из реквизита, а не напрямую использовать их, чтобы это работало так :-

 const Searchbar = ({ query, results,UpdateQuery, UpdateResults  }) => {
  const onSubmit = (e) => {
    e.preventDefault();
  };

  const onChange = (e) => {
    UpdateQuery(e.target.value);
  };