简体   繁体   English

在 Redux-React 应用程序中排序时出错

[英]Error at the moment sorting in Redux-React app

I have app wrote on pure React where I make request to server and get response - category list .我在pure React上编写了应用程序,我在其中向服务器发出请求并获取响应category list This list I can sort by asc-desc when I click by title table id .I needed to remake small part of my React app to Redux.当我单击标题表id时,我可以按asc-desc排序此列表。我需要将我的 React 应用程序的一小部分重新制作为 Redux。

But when I remake this part to redux I have error:但是当我将此部分重新制作为redux时出现错误:

Cannot read property 'sortAscDesc' of undefined - in reducer.无法读取减速器中未定义的属性“sortAscDesc”。

Also error in Table.js in line: Table.js 中也有错误:

<th className="th-id" onClick={() => dispatch(changeSortAscDesc())}>ID <small>{sortAscDesc}</small></th>

First in my question I'll write code that I remake to Redux and below after _______________________________ I'll write small part my app which wrote on pure React(before remake to redux) and work well.首先,在我的问题中,我将编写代码,将其重新制作为 Redux 及以下之后 _______________________________ 我将编写我的应用程序的一小部分,它在纯 React 上编写(在重新制作为 redux 之前)并且运行良好。

Wrote on REDUX:写在 REDUX 上:

filterList.js(action): filterList.js(动作):

export const changeSortAscDesc = (prev) => ({
    type: "SORT_ASC_DESC",
    payload: prev
});

filterList.js(reducer): filterList.js(减速器):

const initialState = {
  sortAscDesc: "asc",
};

export function filterList(state = initialState, action) {
  switch (action.type) {
    case "SORT_ASC_DESC": {
      const { payload } = action;
      return {
        ...state,
        sortAscDesc: payload.sortAscDesc == 'asc' ? 'desc' : 'asc'
      };
    }
    default:
      return state;
  }
}

Table.js:表.js:

export default (props) => {
    
const sortAscDesc = useSelector(state => state.filterListReducer.sortAscDesc);
const dispatch = useDispatch();
    
 return (
  <table>
    <thead>
      <tr>
        <th></th>
        <th onClick={() => dispatch(changeSortAscDesc())}>ID <small>{sortAscDesc}</small></th>  
        <th>TITLE</th>
      </tr>
    </thead>
    <tbody className="table-body">
       {props.dataAttribute.map(item => (
        <tr key={item.id}>
          <td>{item.id} </td>
          <td>{item.title} </td>
        </tr>
      ))}
    </tbody>
  </table>
);}

_______________________________________________________ _______________________________________________________

Wrote on pure React (before remake to redux):写在纯 React 上(在 remake 到 redux 之前):

Home.js:主页.js:

const Home = () => {
    
const [value, setValue] = useState({
     listCategory: [],
     sortAscDesc: "asc",
});

// Here useEffect and fetch function, but I dont write it, because it not related with my question

 const changeSortAscDesc = () => {    
      setValue((prev) => ({
       ...prev,
       sortAscDesc: prev.sortAscDesc == 'asc' ? 'desc' : 'asc'
     }));
    }; 
return (
    <div>
   <Table dataAttribute={value.listCategory} 
             changeSortAscDesc={changeSortAscDesc} 
             sortAscDesc={value.sortAscDesc}   
      />
    </div>
);

Table.js:表.js:

export default (props) => {
    
const sortAscDesc = useSelector(state => state.filterListReducer.sortAscDesc);
const dispatch = useDispatch();
    
 return (
  <table>
    <thead>
      <tr>
        <th></th>
        <th onClick={props.changeSortAscDesc}>ID <small>{props.sortAscDesc}</small></th>  
        <th>TITLE</th>
      </tr>
    </thead>
    <tbody className="table-body">
       {props.dataAttribute.map(item => (
        <tr key={item.id}>
          <td>{item.id} </td>
          <td>{item.title} </td>
        </tr>
      ))}
    </tbody>
  </table>
);}

You are not dispatching any payload with your action -您没有通过您的操作发送任何有效负载 -

<th onClick={() => dispatch(changeSortAscDesc(dataThatNeedsToBePassed))}>ID <small>{sortAscDesc}</small></th> //pass data as parameter

EDIT- You can make it work in this way -编辑-您可以以这种方式使其工作-

const initialState = {
  sortAscDesc: "asc",
};

export function filterList(state = initialState, action) {
  switch (action.type) {
    case "SORT_ASC_DESC": {
      const { payload } = action; // no need //
      return {
        ...state,
        sortAscDesc: state.sortAscDesc == 'asc' ? 'desc' : 'asc'
      };
    }
    default:
      return state;
  }
}

And you can remove payload from your action -您可以从您的操作中删除有效负载 -

export const changeSortAscDesc = () => ({
    type: "SORT_ASC_DESC",
    payload: prev// no need //
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM