Вывод элементов после сортировки Redux

244
14 марта 2017, 15:28

Есть вот такой смарт компонент

import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import Filter from '../Filter';
import Sort from '../Sort';
import { getItems, selectItem, reverseItems, findItems } from '../../actions/items';
import './app.css';
const App = ({filterList, sortList,  onGetItems, onFindItems, reverseItems, onSelectItem}) => {
onGetItems();
return (
    <div>
        <Filter items={filterList} findText={onFindItems} reverseItems={reverseItems} selectItem={onSelectItem} />
        <Sort items={sortList} selectItem={onSelectItem} />
    </div>
)}

function mapStateToProps(state) {
    return {
        filterList: state.items.filter(item => item.name.includes(state.filter.toLowerCase())),
        sortList: state.items,
    }
  }

 function matchDispatchToProps(dispatch) {
     return bindActionCreators({
    onGetItems: getItems,
    onSelectItem: selectItem,
    onFindItems: findItems,
    reverseItems: reverseItems
}, dispatch)}
export default connect(mapStateToProps, matchDispatchToProps)(App);

Есть вот такие экшны:

            let items = [];
            (function onGetItems() {
                let xhr = new XMLHttpRequest();
                xhr.open('GET', '/items.json', false);
                xhr.send();
                if (xhr.status !== 200) {
                    console.log(xhr.status + ': ' + xhr.statusText);
                } else {
                    items = JSON.parse(xhr.responseText.toLowerCase());
                    items.sort(function(a, b) {
                        if (a.name > b.name) return 1;
                        if (a.name < b.name) return -1;
                        return 0;
                    });
                }
            })();
            export const getItems = () => dispatch => {
                dispatch({ type: 'ADD_ITEMS', payload: items });
            }
            export const selectItem = (item)  => {
                console.log(item);
                return {
                    type: "ITEM_SELECTED",
                    payload: item
                }
            };
            export const reverseItems = (items)  => {
                console.log(items)
                return {
                    type: "REVERSE_ITEMS",
                    payload: items.reverse()
                }
            };
            export const findItems = (items)  => {
                return {
                    type: "FIND_ITEMS",
                    payload: items
                }
            };

И конечно же есть пара редьюсеров:

            const initialState = '';
            export default function filter(state = initialState, action) {
                switch (action.type) {
                    case 'FIND_ITEMS': return action.payload;
                    default: return state
                }
            }
            const initialState = [];
            export default function items(state = initialState, action) {
                switch (action.type) {
                    case 'ADD_ITEMS': return action.payload;
                    default: return state
                }
            }

А проблема в том, что action reverseItems делает реверс массива, всё ок. Но я не могу понять как сделать так, чтобы передать данные в state и чтобы он перерендарил компонент.

Я понимаю, что вопрос из разряда "это же основы". Но я только учусь и не могу увязать всё это в одну кучу) Бьюсь уже пару дней и не могу уловить как это сделать.

Answer 1
 export const reverseItems = (items)  => {
   console.log(items)
   return {
     type: "REVERSE_ITEMS",
     payload: items.reverse()
   }
 };
 export default function filter(state = initialState, action) {
   switch (action.type) {
     case 'FIND_ITEMS': return action.payload;
     default: return state
   }
 }

В action в payload вы передает items.reverse(), соответственно в reducer вы можете получить этот массив из action.payload.
Добавить в этот reducer обработку события "REVERSE_ITEMS":

export default function filter(state = initialState, action) {
  switch (action.type) {
    case 'FIND_ITEMS': return action.payload;
    case 'REVERSE_ITEMS': return action.payload;
    default: return state
  }
}
READ ALSO
Как изменять цвет текста в зависимости от результатов AJAX

Как изменять цвет текста в зависимости от результатов AJAX

У меня есть стандартный AJAX (Без всяких JQuery)Функция, которая записывает полученный ответ в нужное мне поле выглядит так:

232
AngularJS + Turbolinks

AngularJS + Turbolinks

Приветик

223
Ссылки на аудио в VK

Ссылки на аудио в VK

Есть страница со списком аудиозаписей в ВКонтактеНапример, вот её кусочек: К сожалению, ВК с середины декабря закрыл доступ к работе с аудио,...

334
Uncaught TypeError: Cannot read property &#39;contact_name&#39; of null

Uncaught TypeError: Cannot read property 'contact_name' of null

В зависимости от того, что вернет определенный метод в res, там может быть contact_name или нетЕсли нет, приходит ошибка "Cannot read property 'contact_name' of null"

242