[react] 使用react写一个todo应用,说说你的思路
- 拆分组件:应用 + 表单部分(input + button)、列表部分(checkbox + ul>li + delete button)
- 数据设计:表单的待输入字段 + 列表中的List数据(List item中有content isCompleted)
- 数据存放:所有的数据都存放到“应用”组件,事件和子数据都通过props往下传递
下面是简单的实现
import React, { useState, useRef } from 'react';
function useTodoList(initialList) {
const id = useRef(0);
const [list, setList] = useState(initialList);
// 增加Todo
const add = text => {
id.current++;
setList(
list.concat({
id: id.current,
text,
isCompleted: false
})
);
};
// 删除Todo
const del = id => {
setList(
list.filter(e => {
return e.id !== id;
})
);
};
// 设置已完成
const toggleStatus = id => {
setList(
list.map(e => {
if (e.id === id) {
return {
...e,
isCompleted: !e.isCompleted
};
} else {
return { ...e };
}
})
);
};
return [
list,
{
add,
del,
toggleStatus
}
];
}
const Form = ({ onAdd }) => {
const [value, setValue] = useState('');
const onChange = event => {
const value = event.target.value;
setValue(value);
};
const onSubmit = () => {
onAdd(value);
setValue('');
};
return (
<React.Fragment>
<input value={value} onChange={onChange} />
<button onClick={onSubmit}>提交</button>
</React.Fragment>
);
};
const TodoList = ({ list, onChange, onDel }) => {
const setItemStyle = isCompleted => {
return isCompleted ? { 'text-decoration': 'line-through' } : {};
};
return (
<ul>
{list.map(e => {
return (
<li key={e.id} style={setItemStyle(e.isCompleted)}>
<input
type="checkbox"
checked={e.isCompleted}
onChange={() => onChange(e.id)}
/>
<span>{e.text}</span>
<button onClick={() => onDel(e.id)}>删除</button>
</li>
);
})}
</ul>
);
};
export default function App() {
const [todoList, { add, del, toggleStatus }] = useTodoList([
{ text: 'text', id: 123, isCompleted: false }
]);
return (
<div>
<Form onAdd={add} />
<TodoList list={todoList} onChange={toggleStatus} onDel={del} />
</div>
);
}
个人简介
我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!