|
1 |
| -### 记录 |
| 1 | +## React练手项目-todolist |
| 2 | +### 所用技术 |
| 3 | +框架:React |
| 4 | +路由:react-router@V4 |
| 5 | +图标:font-awesome |
| 6 | + |
| 7 | +### 项目结构 |
| 8 | +``` |
| 9 | +. |
| 10 | +├── README.md |
| 11 | +├── build |
| 12 | +├── package-lock.json |
| 13 | +├── package.json |
| 14 | +├── public |
| 15 | +│ ├── favicon.ico |
| 16 | +│ ├── index.html |
| 17 | +│ └── manifest.json |
| 18 | +├── src |
| 19 | +│ ├── App.css |
| 20 | +│ ├── App.js //主页面 |
| 21 | +│ ├── App.test.js |
| 22 | +│ ├── component |
| 23 | +│ │ ├── AddTodo.css |
| 24 | +│ │ ├── AddTodo.js //新增todo组件 |
| 25 | +│ │ ├── TodoDetail.css |
| 26 | +│ │ └── TodoDetail.js //todo详情组件 |
| 27 | +│ ├── index.css |
| 28 | +│ ├── index.js //页面入口 |
| 29 | +│ └── registerServiceWorker.js |
| 30 | +└── yarn.lock |
| 31 | +
|
| 32 | +8 directories, 31 files |
| 33 | +
|
| 34 | +``` |
| 35 | + |
| 36 | +### overview |
| 37 | +{ :width="50%"} |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +## 如何运行 |
| 43 | + |
| 44 | +### 安装 |
| 45 | +$npm install |
| 46 | + |
| 47 | +### 启动 |
| 48 | +$npm start |
| 49 | + |
| 50 | + |
| 51 | +### 项目记录 |
2 | 52 | - npm全局安装的模块放在 /usr/local/lib/node_modules/ 目录下
|
3 | 53 | - 不要直接对state进行修改,例如数组的一些方法会直接修改原数组
|
4 | 54 | - react-router4.*版本使用browerHistory的方法:[https://github.com/brickspert/blog/issues/3](https://github.com/brickspert/blog/issues/3)
|
5 | 55 | - 安装history[https://github.com/ReactTraining/history](https://github.com/ReactTraining/history)
|
6 | 56 | ```
|
7 |
| - const history = createHistory({ |
8 |
| - forceRefresh: true, |
| 57 | + const history = createHistory({ |
| 58 | + forceRefresh: true, |
9 | 59 | })
|
10 | 60 | ```
|
11 | 61 | 这样可以方便使用history,但页面跳转时是自动刷新的;
|
|
16 | 66 | - 划分组件时,由于各个组件之前是有联系的,即 可能相互传数据,如果把其纳入一个组件会减少组件间通信,但是又会让组件显得在UI上划分不合理。如何做一个平衡?
|
17 | 67 |
|
18 | 68 | ### 项目逻辑
|
19 |
| -1. 组件划分 |
| 69 | +1. 组件划分(根据UI) |
20 | 70 | 2. 状态state考虑(涉及到页面数据展示和页面变化)
|
21 | 71 | 1)页面展示的数据需要state来维护,即todo数组,数组每个对象会维护多个属性;
|
22 | 72 | 2)页面task,completed,active图标和相关todolist的展示,可以用一个状态来维护,即classify,这样可以同时控制图标的展示和相应todolist的展示;
|
23 |
| -3) 状态isAdd,表示是否新增todo,控制css类名变化,即控制页面的显示; |
| 73 | +3) 状态isAdd,表示是否新增todo,控制css类名变化,即控制页面的显示; |
| 74 | +3. 路由 |
| 75 | +页面路由采用react-router@V4,即不同UI组件的显示,就需要路由,而页面底部页面task,completed,active图标三种界面显示,都是相同组件源,可用state控制其显示,就不用路由。 |
| 76 | + 涉及路由的页面:todos清单页面 / 增加todo页面 / 单个todo详情页面 |
| 77 | + 路由思路:将三个页面放在主页面Router的Route组件下,设置其path,当页面发生点击事件时,利用history修改path,react-router便会根据页面的path无刷新跳转相应组件 |
| 78 | +4. 涉及state的逻辑处理 |
| 79 | +将todo对象数组的所有状态维护在主页面,由于这些状态会在三个路由页面进行状态交互,所以维护在共同祖先组件,便于通信。在子组件中绑定元素的响应事件,通知到主页面进行state的更新,同时更新本地化存储localStorage。 |
24 | 80 |
|
25 | 81 | ### 踩坑
|
26 |
| -1. 描述:history.push之后页面路径会变化,但没有跳转。所以加了forceRefresh:true的初始化参数,强制每次路径变化刷新页面。这样页面就才会有刷新。 |
27 |
| -解决方法:主要我之前采用的import { BrowserRouter as Router } 加 ```<Router></Router>```的方式,现在采用```<Router history={history}></Router>```这种方式,就可以默认跳转了。 |
28 |
| - |
| 82 | +1. 描述:history.push之后页面路径会变化,但没有跳转。所以加了forceRefresh:true的初始化参数,强制每次路径变化刷新页面。这样页面就才会有刷新。 |
| 83 | + 解决方法:主要我之前采用的import { BrowserRouter as Router } 加 ```<Router></Router>```的方式,现在采用```<Router history={history}></Router>```这种方式,就可以默认跳转了。 |
| 84 | + |
29 | 85 |
|
0 commit comments