Реализация Redux-Search с компонентами - PullRequest
0 голосов
/ 05 июля 2018

Резюме:

Теперь, когда эта проблема решена, я сделаю пост в блоге с повторным созданием и решением

Добавление Redux-Search в мое приложение. У меня правильно настроен магазин, мои инструменты для создания редукса показывают, что поисковое действие начинается с init и получается правильный результат, но когда я на самом деле пытаюсь найти ресурс, используя значение, указанное в поле ввода, я Я ничего не получаю. Я полностью застрял, и я попробовал кучу различных структур, чтобы попытаться получить ЛЮБОЙ результат для возврата в компоненте console.log. Полагаю, я просто не понимаю, как работает пакет повторного выбора, как правильно передать ему текст и как получить результат в моем компоненте. Если я смогу преодолеть это препятствие и увидеть, что что-то вернуло создателем действия, я смогу оттуда избавиться.

Вот мой код:

Переходники / Data.js Чтобы дать представление об этом файле. У меня есть два редуктора. Один называется Auth, другой называется Data (в отдельных файлах). У каждого свое начальное состояние. Начальное состояние, показанное здесь, является частью того, что определено в data.js.

import things from '../data/things';

const initialState = {
  statusText: null,
  thing: null,
  resources: {
    things,
  },
}

Данные / Things.js Это пример данных, которые я импортирую в initialState в файле data.js.

const things = [
  {
    id: 1,
    name: "example name 1",
  },
...

Переходники / index.js

import auth from './auth';
import data from './data';

const rootReducer = combineReducers({
  routing: routerReducer,
  /* your reducers */
  search: searchReducer,
  auth,
  data,
});

export default rootReducer;

Магазин / ConfigureStore.js

import rootReducer from '../reducers'; 

const enhancer = composeWithDevTools(
  applyMiddleware(thunkMiddleware, ...debugware),
  reduxSearch({
    resourceIndexes: {
      things: ['name'],
    },
    resourceSelector: (resourceName, state) => {
      return state.data.resources[resourceName];
    },
  }),
);

export default function configureStore(initialState) {
  const store = createStore(
    rootReducer,
    initialState,
    enhancer,
  );

Компонент

console.log console.log(`explore search: ${selectors.thingIds}`); действительно единственная часть, которая мне нужна для работы. Я просто пытаюсь вернуть ЛЮБЫЕ результаты, полученные от создателя действия searchThings и которые должны привести меня в правильном направлении.

const actions = {
  searchThings: createSearchAction('things'),
};

@connect(selectors, actions)
export class ExploreSearch extends Component {
  render() {
    console.log(`explore search: ${selectors.thingIds}`);

    return (
      <div>
        <Search
          placeholder="input search text"
          enterButton="Search"
          onSearch={(value) => actions.searchThings(value)}
          style={{ width: 200 }}
        />
      </div>
    );
  }
}

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

const resources = (state) => state.data.resources;
const things = createSelector([resources], (resources) => resources.things);

const { text, result } = getSearchSelectors({
  resourceName: 'things',
  resourceSelector: (resourceName, state) => state.data.resources[resourceName],
});

const selectors = createSelector(
  [result, things, text],
  (result, things, text) => ({
    thingIds: result,
    things,
    searchText: text,
  }),
);

Примеры, за которыми я следовал / полезные ресурсы:

Вот инициализация, возвращающаяся правильно ... насколько я могу судить, я правильно настроил хранилище?:

Picture of the receiveResult

Вот изображение состояния моего магазина, позвонив по номеру console.log(store.getState()); на верхнем уровне. Это показывает, что он находится под data.resources, насколько я могу судить. enter image description here

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

1 Ответ

0 голосов
/ 06 июля 2018

Первая проблема заключается в том, что редукторный поиск SEARCH не запускается при нажатии кнопки "Поиск" в вашем приложении. (Я вижу отладку и вижу, что она никогда не достигается.) Это потому, что ваш обработчик кликов вызывает неподключенный метод actions.searchThings(value) вместо использования connected метода this.props.searchThings(value).

Вторая проблема связана. Журнал вашей консоли ссылается на неподключенный selectors.thingIds, а не на подключенный this.props.thingIds.

Итак, исправление: enter image description here

После этого я вижу идентификаторы, которые я ожидаю, чтобы войти в консоль.

Вы можете подключить это к своему списку следующим образом: enter image description here

...