07.Vue3.x 实现一个完整的toDoList(待办事项) 【前面知识综合练习】

一、Vue中集成Sass/Scss
1.1 安装sass-loader node-sass
npm install -D sass-loader node-sass

安装完启动项目如果出现"Syntax Error: TypeError: this.getOptions is not a function"的错误,可能是sass-loader版本太高

卸载了重新安装低版本

# 卸载当前sass-loader
npm uninstall --save sass-loader
# 重新安装低版本
npm install -D [email protected]
1.2 style中配置sass/scss

lang可以配置scss,scoped表示这里写的css只有当前组件有效

现在style中就支持嵌套了。

<style lang="scss" scoped>
  h2 {
    
    text-align: center;
  }
  .todolist {
    
    width: 600px;
    border: 1px solid #eee;
    margin: 0 auto;
    padding: 20px;
    h3 {
    
      color: red;
      font-size: 40px;
    }
  }
</style>
二、实现一个完整的toDolist(待办事项)以及类似京东App搜索缓存数据的功能

功能:

  1. 在文本框中输入待办事项,敲回车,就将事项添加到正在进行列表;
  2. 勾选正在进行列表项,则该项移动到已经完成;
  3. 勾选已经完成列表项,则该项移动回正在进行;
  4. 点击正在进行或已经完成项末尾的删除,则删除该项

示例效果图:
在这里插入图片描述

逻辑实现:

export default {
   
    name: "App",
    data
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2.删除待办事项 3.标记已完成待办事项 4.编辑待办事项 首先,需要安装Vue、ElementUI和Vuex。 ``` npm install vue npm install element-ui npm install vuex ``` 在main.js中引入Vue、ElementUI和Vuex: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import Vuex from 'vuex' import App from './App.vue' Vue.use(ElementUI) Vue.use(Vuex) Vue.config.productionTip = false new Vue({ render: h => h(App), }).$mount('#app') ``` 接下来,创建store.js文件,定义state、mutations、actions和getters: ```javascript import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { todos: [ { id: 1, text: '写代码', done: false }, { id: 2, text: '看电影', done: true }, { id: 3, text: '做饭', done: false } ] }, mutations: { addTodo (state, todo) { state.todos.push(todo) }, deleteTodo (state, id) { state.todos = state.todos.filter(todo => todo.id !== id) }, toggleTodo (state, id) { state.todos = state.todos.map(todo => { if (todo.id === id) { todo.done = !todo.done } return todo }) }, editTodo (state, todo) { state.todos = state.todos.map(item => (item.id === todo.id ? todo : item)) } }, actions: { addTodo ({ commit }, todo) { commit('addTodo', todo) }, deleteTodo ({ commit }, id) { commit('deleteTodo', id) }, toggleTodo ({ commit }, id) { commit('toggleTodo', id) }, editTodo ({ commit }, todo) { commit('editTodo', todo) } }, getters: { todos: state => state.todos, doneTodos: state => state.todos.filter(todo => todo.done), activeTodos: state => state.todos.filter(todo => !todo.done) } }) ``` 在App.vue中,使用ElementUI的组件实现待办事项页面: ```vue <template> <div class="container"> <h1 class="title">Todo List</h1> <div class="add-todo"> <el-input v-model="newTodo" placeholder="请输入待办事项"></el-input> <el-button type="primary" @click="addTodo">添加</el-button> </div> <el-divider></el-divider> <el-card v-for="todo in activeTodos" :key="todo.id" class="todo-card"> <div class="todo-content"> <el-checkbox v-model="todo.done" @change="toggleTodo" class="todo-checkbox">{{ todo.text }}</el-checkbox> <el-button-group> <el-button type="text" @click="editTodo">编辑</el-button> <el-button type="text" @click="deleteTodo">删除</el-button> </el-button-group> </div> </el-card> <el-divider></el-divider> <h2 class="subtitle">已完成</h2> <el-card v-for="todo in doneTodos" :key="todo.id" class="todo-card"> <div class="todo-content"> <el-checkbox v-model="todo.done" @change="toggleTodo" class="todo-checkbox">{{ todo.text }}</el-checkbox> <el-button-group> <el-button type="text" @click="editTodo">编辑</el-button> <el-button type="text" @click="deleteTodo">删除</el-button> </el-button-group> </div> </el-card> <el-dialog :visible.sync="editVisible" title="编辑待办事项"> <el-input v-model="editTodoText" placeholder="请输入待办事项"></el-input> <div slot="footer"> <el-button @click="editVisible = false">取消</el-button> <el-button type="primary" @click="saveEdit">保存</el-button> </div> </el-dialog> </div> </template> <script> import { mapGetters, mapActions } from 'vuex' export default { name: 'App', computed: { ...mapGetters(['activeTodos', 'doneTodos']) }, data () { return { newTodo: '', editTodoId: null, editTodoText: '', editVisible: false } }, methods: { ...mapActions(['addTodo', 'deleteTodo', 'toggleTodo', 'editTodo']), addTodo () { if (this.newTodo.trim()) { this.addTodo({ id: Date.now(), text: this.newTodo, done: false }) this.newTodo = '' } }, deleteTodo (todo) { this.deleteTodo(todo.id) }, toggleTodo (todo) { this.toggleTodo(todo.id) }, editTodo (todo) { this.editTodoId = todo.id this.editTodoText = todo.text this.editVisible = true }, saveEdit () { if (this.editTodoText.trim()) { this.editTodo({ id: this.editTodoId, text: this.editTodoText, done: false }) this.editVisible = false } } } } </script> <style> .container { max-width: 800px; margin: 0 auto; padding: 20px; } .title { text-align: center; margin-bottom: 20px; } .add-todo { display: flex; align-items: center; margin-bottom: 20px; } .todo-card { margin-bottom: 10px; } .todo-content { display: flex; align-items: center; justify-content: space-between; } .todo-checkbox { flex: 1; margin-right: 10px; } .subtitle { margin-top: 20px; margin-bottom: 10px; } </style> ``` 最后,在index.html中添加id为app的div: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Todo List</title> </head> <body> <div id="app"></div> <script src="./dist/js/app.js"></script> </body> </html> ``` 这样,就完成了一个基于Vue、ElementUI和Vuex的待办事项页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值