# react-redux-todoListDemo
**Repository Path**: nanmooo/react-redux-todo-list-demo
## Basic Information
- **Project Name**: react-redux-todoListDemo
- **Description**: 初学react和redux所写的一个todoListDemo
- **Primary Language**: Unknown
- **License**: Unlicense
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-07-13
- **Last Updated**: 2022-07-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
> 安装依赖: yarn
>
> 启动::yarn start
## 项目界面

## TODOLIST基本流程
常爱蕊组
constants声明常量 -> action配置对象 -> reducer里更新action定义的state数据 -> UI组件中触发
声明常量(constans)后,在Action你创建要改变的对象类型,接着在reduce里操作state和action并返回新的state,接着在UI界面组件编写dispatch触发逻辑事件。
```jsx
//常量
export const TODO_ADD = "TODO_ADD";
//action对象
export const todoAdd = (name) => ({
type: TODO_ADD,
id: Date.now(),
name,
done: false,
});
//reducer
case TODO_ADD:
const { type, ...rest } = action;
return [rest, ...state];
//UI组件
const [name, setName] = useState("");
const dispatch = useDispatch();
const handleAdd = (e) => {
setName(e.target.value);
};
const handleChange = (e) => {
if (name.trim() === "") {
return false;
}
if (e.key === "Enter") {
dispatch(todoAdd(name));
setName("");
}
};
```
## 功能分析
#### 添加label项:id唯一,获取内容,添加到数组
需要个时间对象作为key,在更新数据时,不需要对type进行更新,所以解构时采用后三种类型`{ type, ...rest } = action` 在赋值`[rest, ...state]`。
标签内通过value拿到输入框内容`value={name}` ,change事件监听改变 ` onChange={handleAdd}` ,拿到输入内容后通过`dispatch(todoAdd(name));` 传递过reduce进行数据更新。
监听keyUP,对输入内容做去除空格trim()去除空格,非空不允许输入,Enter添加。
#### 删除label项:对数据源进行filter的id过滤即可

```js
state.filter((item) => item.id !== action.id);
```
#### 编辑label项

- 使用`handleDblClick(item.id)`找到要修改的label项,用`useState` 保存个待修改label项的状态变量,选中时,给classname添加该样式名`样式名: 变量 === item.id`
- 获取焦点`s1Ref.current.focus()` , 失去焦点`handleBlue`事件
- 修改时通过获取`value/onChange/ref`输入内容
- 最后`onKeyUp`对`e.key` 是 enter保存还是 esc 退出做判断
#### 状态全选或反选
对数组所有item进行状态遍历,全部为真才是真,全选后做取反操作即可
```js
const nowDone = arryList.every((item) => item.done);
dispatch(todoCheck(!nowDone));
```
#### 切换状态栏
底部组件将选到的状态栏传递给主组件 `dispatch(filterCheck(active));` ,主组件对原始数据进行不同选项的过滤,匹配根据传来的`active` 选项名响应不同数据
```js
if (state.filter.active === "FINISH") {
return state.todo.filter((item) => item.done);
}
```
#### 显示剩下代办数量和无任务完成时清除已完成任务按钮不显示
剩下数量只需计算状态为FALSE的label项目数量即可
```js
const noFinishLength = list.filter((item) => !item.done).length;
```
状态按钮不显示:利用数组的 `some` 方法,有真为真,绑定按钮的显示。
```jsx
{isShow && ( )}
```
#### 数据持久化
根据`redux-persist` 配置即可