一个vue3的待办列表组件

ops/2024/10/31 20:56:05/

一个vue3的待办列表组件, 仿企业微信的待办列表
TodoList.vue

<template><div><el-input v-model="todoInput" placeholder="写下你的待办事项..." class="el-input" @keyup.enter="addTodo"input-style="background-color: #EBECED;" /><el-table :data="todos" size="small" :show-header="false" @row-dblclick="editTodo"><el-table-column width="30"><template #default="scope"><el-checkbox v-model="scope.row.completed" @change="toggleTodo(scope.row)">check</el-checkbox></template></el-table-column><el-table-column prop="text" /></el-table><div @click="showCompleted = !showCompleted" style="cursor: pointer; text-align: center; margin: 10px 0;"><el-divider v-if="!showCompleted">已完成 (点击展开)</el-divider><el-divider v-else>已完成 (点击折叠)</el-divider></div><el-table :data="completedTodos" size="small" :show-header="false" v-if="showCompleted"><el-table-column width="30"><template #default="scope"><el-checkbox v-model="scope.row.completed" @change="toggleTodo(scope.row)">check</el-checkbox></template></el-table-column><el-table-column prop="text" /></el-table><el-dialog title="修改" v-model="editDialogVisible"><el-form :model="editingTodo"><el-form-item label="内容"><el-input ref="inputRef" v-model="editingTodo.text"></el-input></el-form-item><el-form-item label="状态"><el-checkbox v-model="editingTodo.completed">已完成</el-checkbox></el-form-item></el-form><template #footer><el-button @click="editDialogVisible = false">取 消</el-button><el-button type="primary" @click="confirmEdit()">确 定</el-button></template></el-dialog></div>
</template><script setup lang="ts">
// 通用的待办列表
// 使用<TodoList :todoList="todoList" :save="save"></TodoList>
import { ref } from 'vue';interface Todo {id: number;text: string;completed: boolean;
}defineOptions({name: 'TodoList'
})const props = defineProps({todoList: Array<Todo>,save: Function  //外部传入的保存方法,入参是Todo[]
});const todoInput = ref('');
const todos = ref<Todo[]>([]);
const completedTodos = ref<Todo[]>([]);
const editDialogVisible = ref(false);
const editingTodo = ref({} as Todo);
const showCompleted = ref(false);
const inputRef = ref();watch(() => props.todoList, (newValue) => {if (newValue) {newValue.sort((a, b) => b.id - a.id);todos.value = newValue.filter(t => !t.completed);completedTodos.value = newValue.filter(t => t.completed);}
})const addTodo = () => {if (todoInput.value.trim() === '') return;todos.value.unshift({id: Date.now(),text: todoInput.value,completed: false});todoInput.value = '';saveTodoList();
};const toggleTodo = async (todo: Todo) => {await new Promise(resolve => setTimeout(() => resolve("delay"), 300)); //产生一个点击后动画效果if (todo.completed) {if (!completedTodos.value.find(t => t.id == todo.id)) {completedTodos.value.unshift(todo);}todos.value = todos.value.filter(t => t.id !== todo.id);} else {if (!todos.value.find(t => t.id == todo.id)) {todo.id = Date.now();//更新时间到最新,所以每个todo其实是没有唯一值的todos.value.unshift(todo);}completedTodos.value = completedTodos.value.filter(t => t.id !== todo.id);}saveTodoList();
};const editTodo = (todo: Todo) => {editingTodo.value = { ...todo };editDialogVisible.value = true;//组件focus的正确方式 setTimeoutsetTimeout(() => {inputRef.value?.focus();})
};const confirmEdit = () => {editDialogVisible.value = false;var todo = todos.value.find(t => t.id == editingTodo.value.id)if (todo) {todo.text = editingTodo.value.texttodo.completed = editingTodo.value.completed;toggleTodo(todo);}
};const saveTodoList = () => {if (props.save) { // 添加空值检查props.save(todos.value.concat(completedTodos.value));}
}</script>
<style scoped>
.el-input {--el-input-bg-color: #EBECED;
}
</style>

http://www.ppmy.cn/ops/129950.html

相关文章

Chromium HTML Input 类型password 对应c++

一、密码字段&#xff1a; 密码字段通过标签 <input type"password"> 来定义: <form> Password: <input type"password" name"pwd"> </form> 二、password 对应c定义&#xff1a; third_party\blink\renderer\core\…

VR动捕数据手套如何配合头显装置进行机器臂遥操作?

早期的遥操作机器人主要通过直接控制结构实现&#xff0c;用户通过主机通讯接口直接控制机器人的运动。然而&#xff0c;随着应用场景的复杂化&#xff0c;直接控制结构的局限性逐渐显现。进入21世纪&#xff0c;随着5G、AI和VR等新兴技术的融入&#xff0c;遥操作机器人变得更…

记录一个跳跃的小游戏

记录一个跳跃的小游戏 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

Lua语法基础全面剖析(中篇)

接上篇&#xff0c; 今天我们来进行Lua语法全面剖析。 由于篇幅过长&#xff0c;将分为上中下三篇进行讲解&#xff0c;本篇为中篇。 6.字符串 6.1 string 类型变量 字符串&#xff08;即string&#xff09;&#xff0c;就是一串文本数据&#xff0c;可以存储你要的文本。 …

前端代码注释

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言类注释属性注释函数注释函数参数注释解构 & 函数返回结果 注释Vue Props 注释注释建议注释内容要清晰简洁注释类型避免不必要的注释采用一致的风格版本与更…

PHP+REDIS设置请求限流(设置1秒内最大请求数1000QPS)

双十一期间要做活动&#xff0c;设置商品请求限流&#xff0c;护航秒杀活动正常进行&#xff01;#设置1秒内最多同时1000请求 $maxNum 1000; $redisKey GoldMall:Huodong:gid.$g_id._.date(s); $onlineNum (int)$this->redis->get($redisKey); if($onlineNum){$online…

ToDesk远程连接Ubuntu无法载入桌面

仅用于记录自己解决Ubuntu下ToDesk无法打开桌面。 问题描述 Ubuntu的ToDesk可以远程其他设备&#xff0c;一切正常&#xff1b; 其他设备远程Ubuntu时&#xff0c;卡在“正在链接100%”界面&#xff0c;但无法显示。 除此之外&#xff0c;Ubuntu下打开ToDesk客户端&#xff…

算法的基本概念@性能分析初步@复杂度分析初步

文章目录 abstract算法的基本概念算法指标 算法的效率问题规模(输入规模)语句频度 复杂度频度例输入数据状态 算法的时间复杂度&#x1f47a;定义基本语句渐进性能符号O和渐进时间复杂度 数量级严格定义符号O理解符号O 相关描述分析算法时间复杂度的基本方法&#x1f47a;对于给…