用vue3做一个todoList

一、具体功能

1.用户输入新增的事项点击回车或者添加,事项列表中显示当前添加的事项。

2.事项分为,所有事项、未办事项、已完成事项。新增的事项默认为未办事项。

3.事项的状态:已完成和未办可相互转换。

4.事项可删除。

二、实现的效果

1.修改任务状态
修改事项状态

2.删除任务
删除事项

三、具体实现

给input框绑定一个enter事件,同时给button按钮绑定一个点击事件

<el-input v-model="inputValue" @keyup.enter="addList" placeholder="请输入"/>
<el-button type="primary" @click="addList">添加</el-button>
// 在setup函数中定义变量,实现新增事项功能。
 const state = reactive({
      todoList: [{ name: "我", checked: false, isDelete: false }], // 所有列表
      list1: [], //未办事项列表
      list2: [], //已办事项列表
      inputValue: "", //输入框的值
    });

//新增事项
const addList = () => {
    if (state.inputValue) {
        state.todoList.push({
            name: state.inputValue,
            checked: false,
            isDelete: false,
        });
        state.inputValue = null;
        changeListDelete();
    }
};
功能实现说明

实现事项的状态相互转换以及事项的删除操作。 按照一般操作,实现事项删除肯定会想到用splice(),然后拿到index对todoList数组删除。但这样如果在已办事项中选中某条事项拿到的index有可能会和todoList数组中的那一条对不上。 所以这里采用的是vue的响应式原理,改变当前事项的状态,todoList中的事项也会随之改变。

template代码如下
 <el-tabs @tab-change="tabChange">
      <el-tab-pane label="全部">
        <el-card class="box-card" shadow="always">
          <template #header>
            <div class="card-header">
              <span>所有任务</span>
            </div>
          </template>

          <div v-for="(item, i) in todoList" :key="i" class="list">
            <div class="text">
              <div>
                <span>{{ item.name }}</span>
              </div>
              <div>
                <el-button type="text" @click="changeStatus(item)"
                  >{{ item.checked ? "取消" : "完成" }}
                </el-button>
                <el-button type="text" @click="deleteList(item)"
                  >删除
                </el-button>
              </div>
            </div>
            <el-divider />
          </div>
        </el-card>
      </el-tab-pane>

      <el-tab-pane label="未完成的任务">
        <el-card class="box-card" shadow="always">
          <template #header>
            <div class="card-header">
              <span>未办理的任务</span>
            </div>
          </template>

          <div v-for="(item, i) in list1" :key="i" class="list">
            <div class="text">
              <div>
                <span>{{ item.name }}</span>
              </div>

              <div>
                <el-button type="text" @click="changeStatus(item)"
                  >完成
                </el-button>

                <el-button type="text" @click="deleteList(item)"
                  >删除
                </el-button>
              </div>
            </div>
            <el-divider />
          </div>
        </el-card>
      </el-tab-pane>
      <el-tab-pane label="已完成的任务">
        <el-card class="box-card" shadow="always">
          <template #header>
            <div class="card-header">
              <span>已完成的任务</span>
            </div>
          </template>
          <div v-for="(item, i) in list2" :key="i" class="list">
            <div class="text">
              <div>
                <span>{{ item.name }}</span>
              </div>

              <div>
                <el-button type="text" @click="changeStatus(item)"
                  >取消
                </el-button>

                <el-button type="text" @click="deleteList(item)"
                  >删除
                </el-button>
              </div>
            </div>
            <el-divider />
          </div>
        </el-card>
      </el-tab-pane>
    </el-tabs>
setup()代码如下
//删除事项
    const deleteList = (item) => {
    item.isDelete = !item.isDelete;
    changeListDelete();
};
const changeListDelete = () => {
    state.list1 = state.todoList.filter(key => !key.checked && !key.isDelete);
    state.list2 = state.todoList.filter(key => key.checked && !key.isDelete);
    state.todoList = state.todoList.filter((key) => !key.isDelete);
};

// 已办事项和代办事项的相互转换
const changeStatus = (item) => {
    item.checked = !item.checked;
    state.list1 = state.todoList.filter(key => !key.checked);
    state.list2 = state.todoList.filter(key => key.checked);
};
const tabChange = (e) => {
    changeListDelete();
};
return {
    changeStatus,
    deleteList,
    addList,
    tabChange,
    ...toRefs(state),
};
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的 Vue3.0 Todolist 示例代码: ```html <template> <div> <h1>Todolist</h1> <form @submit.prevent="addTodo"> <input type="text" v-model="newTodo" placeholder="Add a new todo"> <button>Add</button> </form> <ul> <li v-for="(todo, index) in todos" :key="index"> <input type="checkbox" v-model="todo.completed" @change="toggleTodoStatus(index)"> <span :class="{completed: todo.completed}">{{ todo.text }}</span> <button @click="removeTodo(index)">X</button> </li> </ul> </div> </template> <script> import { reactive } from 'vue'; export default { setup() { const state = reactive({ newTodo: '', todos: [], }); const addTodo = () => { if (state.newTodo.trim() !== '') { state.todos.push({ text: state.newTodo, completed: false }); state.newTodo = ''; } }; const toggleTodoStatus = (index) => { state.todos[index].completed = !state.todos[index].completed; }; const removeTodo = (index) => { state.todos.splice(index, 1); }; return { newTodo: state.newTodo, todos: state.todos, addTodo, toggleTodoStatus, removeTodo, }; }, }; </script> <style> .completed { text-decoration: line-through; } </style> ``` 这是一个基本的 Todolist 组件,使用了 Vue3.0 的 Composition API 和响应式数据。在模板中,使用了 v-model 指令来双向绑定输入框和数据,使用 v-for 指令来循环渲染列表项。在 setup 函数中,使用了 reactive 函数来创建响应式数据对象,使用了箭头函数来定义组件的方法。在样式中,使用了伪类选择器 :class 来动态添加类名,实现对已完成的任务的样式修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值