本节代码对应 GitHub 分支: chapter5
# 数据层开发
# axios 请求代码
在 api/request.js 中,添加以下代码:
export const getRankListRequest = () => {
return axiosInstance.get (`/toplist/detail`);
};
@前端进阶之旅: 代码已经复制到剪贴板
# redux 层开发
排行榜单可以说是整个应用中就数据层而言最简单的一个组件。因此 redux 的代码我们集中在一个文件中。
//rank/store/index.js
import { fromJS } from 'immutable';
import { getRankListRequest } from '../../../api/request';
//constants
export const CHANGE_RANK_LIST = 'home/rank/CHANGE_RANK_LIST';
export const CHANGE_LOADING = 'home/rank/CHANGE_LOADING';
//actionCrreator
const changeRankList = (data) => ({
type: CHANGE_RANK_LIST,
data: fromJS (data)
})
export const getRankList = () => {
return dispatch => {
getRankListRequest ().then (data => {
let list = data && data.list;
dispatch (changeRankList (list));
dispatch (changeLoading (false));
})
}
}
const changeLoading = (data) => ({
type: CHANGE_LOADING,
data
})
//reducer
const defaultState = fromJS ({
rankList: [],
loading: true
})
const reducer = (state = defaultState, action) => {
switch (action.type) {
case CHANGE_RANK_LIST:
return state.set ('rankList', action.data);
case CHANGE_LOADING:
return state.set ('loading', action.data);
default:
return state;
}
}
export { reducer };
@前端进阶之旅: 代码已经复制到剪贴板
# 组件连接 redux
先在全局 store 注册:
//src/store/reducer.js
import { combineReducers } from 'redux-immutable';
import { reducer as recommendReducer } from '../application/Recommend/store/index';
import { reducer as singersReducer } from '../application/Singers/store/index';
import { reducer as rankReducer } from '../application/Rank/store/index';
export default combineReducers ({
// 之后开发具体功能模块的时候添加 reducer
recommend: recommendReducer,
singers: singersReducer ,
rank: rankReducer
});
@前端进阶之旅: 代码已经复制到剪贴板
然后让 rank 组件连接 redux,
import React, { useEffect } from 'react';
import { connect } from 'react-redux';
function Rank (props) {
}
// 映射 Redux 全局的 state 到组件的 props 上
const mapStateToProps = (state) => ({
rankList: state.getIn (['rank', 'rankList']),
loading: state.getIn (['rank', 'loading']),
});
// 映射 dispatch 到 props 上
c