基础todolist 实现增删改查

数据构造:json-server

[
    {
        "id": 1,
        "taskname": "吃饭",
        "time": "2020/01/01",
        "status": "1",
        "flag": "checked"
    },
    {
        "id": 2,
        "taskname": "睡觉",
        "time": "2023/10/26",
        "status": "0",
        "flag": "false"
    },
    {
        "id": 3,
        "taskname": "打豆豆",
        "time": "2023/10/25",
        "status": "0",
        "flag": "false"
    }
]

或(status为0/1或者finished/unfinished 区别)

[
    {
        "id": "1",
        "name": "吃饭",
        "date": "2023/10/26",
        "status": "finished"
    },
    {
        "id": "2",
        "name": "睡觉",
        "date": "2023/10/26",
        "status": "finished"
    }
]

底部输入的待办事项默认未完成,根据待办事项的截止日期显示不同的样式,已过期背景色为红色,未过期背景色为正常。日期项可以使用h5新增表单。

//设置style样式 
.back .con .activa {
     background-color: rgb(231, 76, 60);
}
                      
// 使用模版字符串,new Date时间戳的差大于0
<p class="back_c <% if ( new Date() - new Date(data[i].time) - 24 *60 *60 * 1000 > 0) { %> active  <% } %>"
 data-id="<%=data[i].id%>">

正确显示已完成、未完成、全部的代办事项的数目。

前端使用模版字符串
  <p>
     总待办事项数:
     <span class="total">
          <%=total%>
     </span>
</p>
<p>
     已完成待办事项数:
     <span class="finished">
           <%=num2%>
     </span>
</p>
<p>
     未完成待办事项数:
     <span class="unfinished">
           <%=num1%>
     </span>
</p>

后端发送响应
router.get('/', async (ctx, next) => {
  const data = JSON.parse(fs.readFileSync('./data/data.json', 'utf8'))
  const total = data.length
  //未完成完成
  const num1 = data.filter(item => item.status == 0).length
  //已完成
  const num2 = data.filter(item => item.status == 1).length
  const flag = data.flag
  await ctx.render('todoList', {
    data, total, num1, num2, flag
  })
})

点击待办事项左侧可以选中该待办事项,修改后台数据,刷新后选中状态不变。

·用模板字符串进行判断
 <input type="checkbox" name="" data-id="<%= data[i].id %>" 
 <% if ( data[i].status=='finished' ) { %>
           checked
 <% } %>>
 
 ·//render渲染用三元进行判断
 <tr ${new Date() - new Date(item.date) - 24 * 60 * 60 * 1000 > 0 ? "class='active'" : ""}>
 //或者
 <p class='back_c' 
 ${new Date() - new Date(data[i].time) - 24 * 60 * 60 * 1000 > 0 ? 'id="active"' : ""}  
 data-id="${data[i].id}">
 
 ·//前端:绑定点击事件    
 //修改状态
        if (e.target.nodeName == 'INPUT') {
            let id = e.target.dataset.id * 1
            axios.post('/change', {
                id
            })
                .then(function (response) {
                    console.log(response);
                    if (response.data.code == 200) {
                        render(response.data.data)
                    }
                })
                .catch(function (error) {
                    console.log(error);
                });

        }
·//后端接收数据
// 处理修改状态请求
router.post("/change", async (ctx, next) =>{
  const data = JSON.parse( fs.readFileSync("./data/data.json", "utf-8") )

  // 2.1 接收前端转值 
  const { id } = ctx.request.body 
  const index = data.findIndex((item)=>{
    return item.id == id
  })
  //修改数据库里的数据
  data[index].status = 'finished'
  fs.writeFileSync("./data/data.json", JSON.stringify(data))
  ctx.body = {
    code: 200,
    msg: "修改成功",
    data
  }
})

头部下拉菜单可以过滤数据,可以分别显示:已完成,未完成和全部事项

//css样式 注意!:option的value必须有相对应的内容
<p><input type="text" placeholder="搜索" class="search"></p>
<p class="sel">
      <span>
         过滤: <select name="" id="se">
              <option value="全部">全部</option>
              <option value="1">已完成</option>
              <option value="0">未完成</option>
              </select>
      </span>
</p>

//前端
$('#se').on('change', function (data) {
        //获取输入框内容
        let taskname = $('.search').val()
        let status = $('#se').val()
        console.log(taskname, status);
        axios.post('/selTask', {
            taskname, status
        })
            .then(function (response) {
                if (response.data.code == 200) {
                    // console.log( response.data.data )
                    render(response.data.data)
                  
                }
            })
            .catch(function (error) {
                console.log(error);
            });
    })
    
//后端
//筛选
router.post("/selTask", async (ctx, next) => {
  const data = JSON.parse(fs.readFileSync("./data/data.json", "utf-8"))
  // 2.1 接收前端转值 
  const { taskname, status } = ctx.request.body
  let res = []
  for (let i = 0; i < data.length; i++) {
    //设置一个变量flag
    var flag = true;
    // 否定式判断1
    //taskname的内容不为空,数据里的taskname查找不到 flag的值为false
    if (taskname != "" && data[i].taskname.indexOf(taskname) == -1) {
      flag = false;
    }
    // 否定式判断2
   //status的内容为全部,数据里的status和option的value不一样,flag的值为false
    if (status != "全部" && data[i].status != status) {
      flag = false
    }
    //如果status不为全部,并且value一样的话就位true
    if (flag) {
      res.push(data[i])
    }
    console.log(res);
    ctx.body = {
      code:200,
      msg:'成功',
      data:res
    }
  }
})

头部搜索栏可以按照关键字搜索相关的待办事项,呈现的搜索结果为搜索内容和过滤数据相结合后检索的待办项。

//搜索输入框
    $('.search').on('blur',()=>{
        //获取输入框内容
        let taskname = $('.search').val()
        let status = $('#se').val()
        console.log(taskname, status);
        axios.post('/selTask', {
            taskname, status
        })
            .then(function (response) {
                if (response.data.code == 200) {
                    // console.log( response.data.data )
                    render(response.data.data)
                  
                }
            })
            .catch(function (error) {
                console.log(error);
            });
    })
    //其他同上

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为你提供一个简单的示例代码,用于展示如何使用Vue组件化、Vue路由、Vuex和Axios来实现增删功能。 首先,我们需要安装Vue、Vue Router、Vuex和Axios,你可以使用npm或yarn来安装它们。 接下来,我们创建一个Vue组件,用于显示数据列表和执行增删操作。在这个组件中,我们将使用Vuex来管理数据状态和执行异步操作,使用Axios来进行HTTP请求。 ```html <template> <div> <h1>Todo List</h1> <form @submit.prevent="addTodo"> <input v-model="newTodo" placeholder="Add new todo" /> <button type="submit">Add</button> </form> <ul> <li v-for="(todo, index) in todos" :key="todo.id"> <input type="checkbox" :checked="todo.completed" @change="toggleTodo(todo)" /> <span>{{ todo.text }}</span> <button @click="removeTodo(index)">Remove</button> </li> </ul> </div> </template> <script> import { mapGetters, mapActions } from 'vuex'; export default { computed: { ...mapGetters(['todos']), }, methods: { ...mapActions(['addTodo', 'removeTodo', 'toggleTodo']), }, data() { return { newTodo: '', }; }, }; </script> ``` 接下来,我们使用Vue Router来创建路由和路由组件,用于在不同的URL路径下显示不同的组件。在这个例子中,我们将创建一个路由,用于显示TodoList组件。 ```javascript import Vue from 'vue'; import VueRouter from 'vue-router'; import TodoList from './components/TodoList.vue'; Vue.use(VueRouter); const routes = [ { path: '/', component: TodoList, }, ]; const router = new VueRouter({ mode: 'history', routes, }); export default router; ``` 最后,我们使用Vuex来管理TodoList组件的状态和操作。我们将创建一个store对象,包含state、mutations、actions和getters。 ```javascript import Vue from 'vue'; import Vuex from 'vuex'; import axios from 'axios'; Vue.use(Vuex); const store = new Vuex.Store({ state: { todos: [], }, mutations: { SET_TODOS(state, todos) { state.todos = todos; }, ADD_TODO(state, todo) { state.todos.push(todo); }, REMOVE_TODO(state, index) { state.todos.splice(index, 1); }, TOGGLE_TODO(state, todo) { todo.completed = !todo.completed; }, }, actions: { async fetchTodos({ commit }) { const response = await axios.get('/api/todos'); commit('SET_TODOS', response.data); }, async addTodo({ commit }, text) { const response = await axios.post('/api/todos', { text, completed: false }); commit('ADD_TODO', response.data); }, async removeTodo({ commit }, index) { await axios.delete(`/api/todos/${state.todos[index].id}`); commit('REMOVE_TODO', index); }, async toggleTodo({ commit }, todo) { await axios.patch(`/api/todos/${todo.id}`, { completed: !todo.completed }); commit('TOGGLE_TODO', todo); }, }, getters: { todos: state => state.todos, }, }); export default store; ``` 现在我们已经完成了使用Vue组件化、Vue路由、Vuex和Axios实现增删功能的示例代码。当然,这只是一个简单的示例,你可以根据自己的需求进行修和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值