Как использовать состояние Redux сразу после установки - PullRequest
1 голос
/ 29 октября 2019

Я беру ввод для пользователя, создаю фильтр и добавляю фильтр в redux, но сразу после добавления фильтра мне нужно создать поисковый запрос для отправки в бэкэнд ... поэтому, когда я создаю поискзапросить и добавить его в redux, другие мои компоненты не видят обновления до 3-х повторных визуализаций позже

Я пытался изменить способ установки данных в редукторе, но, похоже, ничего не помогло

//reducer.ts
switch (action.type) {
    case LOAD_PRODUCT_DATA:
      return Object.assign({}, state, {
        products: {
          productList: state.products.productList = action.payload.productList.slice(0),
          count: state.products.count = action.payload.count
        }
      });
    case ADD_FILTER:
      const duplicateFilter: Array<any> = state.filteringItems.map((filter: any, index: number) => {
        if (filter.header === action.payload.header) {
          console.log('duplicate');
          const filterList = [state.filteringItems, action.payload];
          filterList.splice(index, 1);
          return filterList;
        }
      });
      if (duplicateFilter.length) {
        return Object.assign({}, state, {
          filteringItems: state.filteringItems = duplicateFilter[0].splice(0)
        });
      } else {
        console.log('no duplicate');
        return Object.assign({}, state, {
          filteringItems: state.filteringItems.concat(action.payload)
        });
      }
    case REMOVE_FILTER:
      const filterList = state.filteringItems.filter((item, itemIndex) => {
        return action.payload !== itemIndex;
      });
      return Object.assign({}, state, {
        filteringItems: filterList
      });
    case CLEAR_ALL:
      return Object.assign({}, state, {
        filteringItems: []
      });
    case FILTER_QUERY:
      return Object.assign({}, state, {
        filteringQuery: action.payload
      });
    default:
      return state;
  }
//ProductDashboard.tsx
  const { products, filteringQuery } = useSelector(
    (state: InitialState): StateProps => ({
      filteringQuery: state.filteringQuery,
      products: {
        productList: state.products.productList,
        count: state.products.count
      }
    })
  );

  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(getProductDashboard(filteringQuery));
  }, [filteringQuery]);

//FilterCompponent.tsx
  const [input, setInput] = useState<string>('');
  const [queryParams, setQueryParams] = useState<string>('?limit=50&page=0');
  const [open, setOpen] = useState<boolean>(false);
  const dispatch: Dispatch = useDispatch();
  const { filteringItems } = useSelector(
    (state: InitialState): StateProps => ({
      filteringItems: state.filteringItems
    })
  );

  const handleQueryParams = () => {
    if (filteringItems.length > 0) {
      filteringItems.map((filter: Filter) =>
        setQueryParams(`${queryParams}&${filter.header}=${filter.name}`)
      );
    }
    dispatch(queryFilter(queryParams));
  };

  const handleFilter =  (e?: any) => {
    const cleanedUpInput = input.trim();
    dispatch(addFilteringItem({ name: cleanedUpInput, header: props.header }));
    handlePopup();
    handleQueryParams();
  };

когда я console.log (filteringQuery) в productDashboard, я получаю пустой массив, пока я не добавлю еще 3 фильтра, чем в третий фильтр, filterQuery вернет первый фильтр, который я ввел.

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