新闻中心
如何用J*aScript实现一个待办事项列表_如何管理状态和更新UI?
待办事项列表的核心是状态与UI同步:状态统一存于todos数组,增删改操作均返回新数组,render函数负责重绘UI,事件委托处理动态元素。

用 J*aScript 实现待办事项列表,核心是让数据(状态)和界面(UI)保持同步:添加、完成、删除任务时,既要更新内部数组,又要实时反映在页面上。关键不在写多少代码,而在理清“状态在哪”“谁负责更新”“怎么触发重绘”。
状态统一存放在一个数组里
别把任务散落在 DOM 节点的属性或多个变量中。用一个干净的数组(比如 todos)集中管理所有任务对象:
let todos = [
{ id: 1, text: '买牛奶', completed: false },
{ id: 2, text: '回邮件', completed: true }
];
每个任务带 id(方便精准定位)、text(内容)、completed(完成状态)。增删改都只操作这个数组,不碰 DOM。
用函数封装 UI 渲染逻辑
写一个 render() 函数,它读取当前 todos 数组,清空容器,再遍历生成所有任务的 HTML 并插入:
立即学习“J*a免费学习笔记(深入)”;
function render() {
const listEl = document.getElementById('todo-list');
listEl.innerHTML = todos.map(todo => `
<li data-id="${todo.id}">
<input type="checkbox" ${todo.completed ? 'checked' : ''}>
<span ${todo.completed ? 'style="text-decoration: line-through;"' : ''}>
${todo.text}
</span>
<button class="delete">×</button>
</li>
`).join('');
}
每次状态变化后调用 render(),UI 就自动更新。不用手动找节点改文字或加 class —— 整个列表“重画”更可靠。
晓象AI资讯阅读神器
晓象-AI时代的资讯阅读神器
72
查看详情
事件委托处理动态元素
新添加的任务,其复选框和删除按钮是后来生成的,直接绑事件会失效。用事件委托,在父容器(如 #todo-list)监听,再判断目标:
document.getElementById('todo-list').addEventListener('click', e => {
const li = e.target.closest('li');
if (!li) return;
const id = Number(li.dataset.id);
if (e.target.classList.contains('delete')) {
todos = todos.filter(todo => todo.id !== id);
} else if (e.target.type === 'checkbox') {
todos = todos.map(todo =>
todo.id === id ? { ...todo, completed: e.target.checked } : todo
);
}
render(); // 状态变了,立刻重绘
});
添加任务也一样:输入框 + 按钮触发,push 新对象进 todos,再调 render()。
避免直接修改原数组,优先用不可变方式
用 filter、map、concat 等返回新数组的方法,而不是 push、splice 原地修改。这样能减少意外副作用,也方便未来接入 React 或 Vue 的响应机制:
- 添加:todos = [...todos, { id: nextId++, text: input.value, completed: false }];
- 切换完成:todos = todos.m
ap(t => t.id === id ? {...t, completed: !t.completed} : t); - 删除:todos = todos.filter(t => t.id !== id);
基本上就这些。状态管住、渲染包圆、事件兜底,待办列表就稳了。
以上就是如何用J*aScript实现一个待办事项列表_如何管理状态和更新UI?的详细内容,更多请关注其它相关文章!
# 相关文章
# 南阳新站关键词排名优化
# 眉山展示网站建设服务
# 如何找网站推广
# 营销推广成本包括什么内容
# 广东社交媒体营销推广怎么做
# 如何做国外网站推广
# 抚州电商seo推广
# 安徽锅炉网站建设
# seo sem简单含义
# 广东seo优化价格比较
# 在一
# 解决问题
# 又要
# 中文网
# vue
# 而在
# 遍历
# 多个
# 有何不同
# 如何用
# 重绘
# render函数
# ai
# ssl
# html
# java
# javascript
# react
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
mc.js免安装版 mc.js一键畅玩入口
J*aScript中赋值与自增运算符的复杂交互与执行机制
抖音创作助手登录入口_抖音创作辅助工具官网直达
Centos/Linux 系统下安装 composer 的完整步骤
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
在Go Martini框架中高效服务动态生成图像的实践指南
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
C++指针和引用有什么区别_C++内存管理核心概念深度解析
126邮箱网页版官方入口 126邮箱账号在线登录平台
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
新手怎么开始学化妆 零基础化妆入门教程
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
不同用户不同价格! 索尼开启账户个性化定价测试
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
PHP 枚举:根据字符串获取枚举案例的策略与实现
PostgreSQL海量数据高效导入策略:Python与Django实践指南
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
163邮箱官方主页登录 直达网易邮箱登录核心页面
Go语言JSON解析深度指南:动态访问与结构体映射实践
小米Civi 4录制视频过暗_小米Civi 4亮度优化
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
单射、满射与双射的关系 一文理清所有逻辑
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
J*aScriptWebpack优化_J*aScript构建工具实战
C++ explicit关键字防止隐式转换_C++构造函数安全规范
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
b站怎么删除评论_b站评论管理与删除操作
Django模型中自动计算可用余额的实现方法
微信客户端如何收红包_微信客户端接收红包使用教程
Go RPC HTTP服务正确实现与常见陷阱解析
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
J*aScript中安全有效地处理localStorage字符串数据
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
解决深度学习模型训练初期异常高损失与完美验证准确率问题
FullCalendar 自定义按钮样式定制指南
在Socket.IO连接中实现Access Token自动更新与动态重连
Golang如何使用new_Go new分配内存机制讲解
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!


2025-12-16
浏览次数:次
返回列表
ap(t => t.id === id ? {...t, completed: !t.completed} : t);