TASK-OA项目reduxt实现
TASK项目
1.搭建项目
2.ANTD
3.数据处理
4.redux
create-react-app 脚手架
$ npm i create-react-app -g
$ create-react-app xxx
或者
$ npx create-react-app xxx 【yarn】
向配置less
1.-->$ git init -y (在一个大仓库就直接提交到历史区)
(如果项目不在一个仓库或者本身也不是一个仓库,则需要把项目初始化成一个git仓库,代码提交到历史区 )
$ git add .
$ git commit -m'eject'
2.-->$ yarn eject
$ npm run eject
(暴露配置文件)
3.$ yarn add less less-loader
4.config/webpack.config.js 配置less
// style files regexes
const cssRegex = /\.(css|less)$/;
const cssModuleRegex = /\.module\.(css|less)$/;
两处 use: getStyleLoaders({...},'less-loader')
5.安装所使用模块
antd moment axios qs react-router-dom
redux
react-redux
redux-logger
redux-thunk
redux-promise
6.package.json 跨域代理
"proxy": "http://127.0.0.1:9999"
7. $ npm run start 启动项目服务
8.页面架构的基础配置
src -|
|
|-assets-|-css -common.less
| | -reset.min.css
| |-lib -utils.js
|
|-api -|axios.js
| -|task.js
| -|index.js
|-views -|Task.jsx
| -|Task.less
App.jsx 根组件
index.jsx 总入口
9.页面布局
table 唯一的id设置
---》rowKey="id"
---》每条数据加唯一的key
/* 指定了dataIndex,则text是具体的一个值,
不指定dataIndex,则跟record一样 都是这行的数据 */
表格里每行 每列的取值
columns render(text,record)
text 当前列的值
record当前行的值
模态框
输入框
onChange={ev => {
let value = ev.target.value.trim();
this.setState({ taskText: value });
}}
页卡切换
10:数据请求的准备
axions二次封装
11:基于redux构建store相关文件
store -|index.js //创建一个Store,应用中间件applyMiddleware用来发送异步请求
|action-types.js 派发的行为标识
|reducers-|index.js(task.js)合并每个板块的reducer
|task.js TASK项目的管控的任务板块(状态方法)
|actions -|index.js(task.js)合并每个板块的action行为的
|task.js(action-types.js)TASK板块派发的action行为,里面都有方法,方法返回对应的对象
view -|Task.jsx (action)
index.js 主入口 导入store 并且把store注入到根组件上
/* store */
import store from './store/index';
import { Provider } from 'react-redux';
ReactDOM.render(<ConfigProvider locale={zhCN}>
<Provider store={store}>
<App />
</Provider>
</ConfigProvider>,
document.getElementById('root')
);
react-redux 一共提供两个组件
Provider 通过他可以把store注册到上下文里面
connect 通过他就可以公共状态的属性和操作通过属性传给当前组件
export default store= createStore(reducer, applyMiddleware(
reduxLogger,
reduxThunk,
reduxPromise
));
reducers用来存储公共数据,和改变公共数据
actions 用来存放方法,这些方法都是返回一个action对象
connect 用来将reducers和actions中的数据和方法全都以属性的方式传递给对应的组件
组件调用使用this.props.对应的方法名即可,也可以带参数 传递给actions里面的方法
actions里的方法受到参数即可传给对应的actions.payload,然后派发到reducers中改变数据
请求拦截器 手写方法
axios.defaults.transformRequest = function (data) {
if (!data) return data;
let result = ``;
for (let attr in data) {
if (!data.hasOwnProperty(attr)) break;
result += `&${attr}=${data[attr]}`;
}
return result.substring(1);
};
使用qs
axios.defaults.transformRequest = data => qs.stringify(data);
reducers
// state : store容器中的状态(state.xxx=xxx直接就修改了,我们想return的时候再修改,所以我们需要在最开始把state克隆一份【深拷贝】)
// action : dispatch派发的行为对象(需要有成员type)
/* export default connect(state => {
// state:公共状态 {computed:{},task:{}...}
return {
...state.computed
};
})(Test);
*/
/*
* connect高阶组件:返回一个代理组件
* connect([mapStateToProps],[mapDispatchToProps])([组件])
* =>不需要的可以写null/或者不传递
* =>mapStateToProps:把store容器中的公共状态进行遍历,把遍历后的结果(公共状态)当做属性传递给对应的组件
* =>mapDispatchToProps:把需要派发的行为任务进行遍历,最后也是基于属性传递给对应的组件
*
* 默认帮我们基于subscribe向redux事假池中加入一个方法,当状态更新,会默认通知这个方法执行,并且让当前组件重新渲染
*/