美文网首页
用 vue3 写的简洁的 todolist 案例

用 vue3 写的简洁的 todolist 案例

作者: 小小前端搬运工 | 来源:发表于2022-03-15 01:53 被阅读0次

整体效果

vue3-todolist.png

父子组件传值
父组件

父子传值-父组件.png
子组件
父子传值-子组件.png
父子传值--子组件.png

mutations 处理操作

mutations 处理操作.png

Home.vue 接收来自 store 中的数据

接收store的数据.png

代码展示

状态管理index.js

import { createStore } from 'vuex'
export default createStore({
  state: {
    list:[
      {
          title:'吃饭',
          complete:false
      },
      {
          title:'睡觉',
          complete:true
      },
      {
          title:'敲代码',
          complete:false
      },
  ]
  },
  mutations: {
    addTodo(state, payload){
      state.list.push(payload)
    },
    delTodo(state,payload){
      state.list.splice(payload,1)  // 删除任务 splice(下标,个数)
    },
    clear(state,payload){
      state.list = payload
    }
  },
  actions: {
  },
  modules: {
  }
})

组件App.vue

该组件作为入口组件

<template>
  <div>
      <router-view/>
  </div>
</template>

<style lang="scss" scoped>
*{
  margin: 0;
  padding: 0;
}
div{
  width: 800px;
  margin: 50px auto;
}
</style>

组件Home.vue

<template>
  <div>
    <nav-header @add="add"></nav-header>
    <nav-main :list="list" @del="del"></nav-main>
    <nav-footer :list="list" @clear="clear"></nav-footer>
  </div>
</template>

<script>
  import NavHeader from '@/components/navHeader/NavHeader';
  import NavMain from '@/components/navMain/NavMain';
  import NavFooter from '@/components/navFooter/NavFooter';
  import { computed, ref } from 'vue';
  import { useStore } from 'vuex';
 export default {
    components:{
      NavHeader,
      NavMain,
      NavFooter
    },
    setup() {
      let store = useStore()
      let list = computed(()=>{
        return store.state.list
      })
      let value = ref('')
      let add = (val) =>{
        value.value = val
        let flag = true
        list.value.map(item=>{
          if(item.title == value.value){
            flag =false
            alert('任务已存在')
          }
        })
        if(flag){
          store.commit('addTodo',{   // 调用mutations
          title:value.value,
          complete:false
        })
        }
      }
      let del = (val) => {
        store.commit('delTodo',val)
      }
      let clear = (val) => {
        store.commit('clear',val)
      }
      return {
        add,
        value,
        list,
        del,
        clear
      }
    }
 }
</script>

组件NavHeader.vue

<template>
    <div>
        <input type="text"
         placeholder="请输入任务名称" @keydown.enter = "enter" v-model="value">
    </div>
</template>
<script>
import { defineComponent,ref } from 'vue'
export default defineComponent({
    setup(props, ctx) {
        let value = ref('')
        let enter = () => {
            ctx.emit('add',value.value)
            console.log(value.value);
            value.value = ''
        }
        return{
            value,
            enter
        }
    }
});
</script>
<style lang="scss" scoped>
    input{
        margin-bottom: 10px;
    }
</style>

组件NavMain.vue

<template>
    <div>
        <div v-if="list.length>0">
            <div v-for="(item,index) in list" :key="index">
                <div class="item">
                    <input type="checkbox" name="" id="" v-model="item.complete">
                    {{item.title}}
                    <button class="del" @click="del(item, index)">删除</button>
                </div>
            </div>
        </div>
        <div v-else>
            暂无任务
        </div>
    </div>
</template>
<script>
    import { defineComponent, ref } from 'vue'
   export default defineComponent({
       props:{
           list:{
               type:Array,
               required:true
           }
       },
       emits:['del'], // 放分发事件的属性名字  没有这句浏览器控制台有报错
       setup(props,ctx){
            
            let del = (item,index)=>{
                ctx.emit('del',index)
            }
            return{
                del
            }
       }
   })
</script>
<style lang="scss">
    .item{
        height: 35px;
        line-height: 35px;
        position: relative;
        width: 160px;
        cursor: pointer;
        button{
            position: absolute;
            right: 20px;
            top: 6px;
            display: none;
            z-index: 99;
        }
        &:hover{
            background-color: #ddd;
            button{
                display: block;
            }
        }
    }
</style>

组件NavFooter.vue

<template>
    <div class="container">
        <div>
            已完成{{isComplete}} / 全部{{list.length}}
        </div>
        <div v-if="isComplete > 0" class="btn">
            <button @click="clear">清除已完成</button>
        </div>
    </div>
</template>
<script>
    import { defineComponent, ref, computed } from 'vue'
   export default defineComponent({
    props:{
           list:{
               type:Array,
               required:true
           }
       },
       setup(props,ctx){
           let isComplete = computed(()=>{
               let arr = props.list.filter(item => {
                   return item.complete    // 过滤已完成
               })
               return arr.length
           })
            let clear = () =>{
                let arr = props.list.filter(item => {
                   return item.complete === false   // 过滤未完成的
               })
                ctx.emit('clear',arr)
            }
           return {
               isComplete,
               clear
           }
       }
   })
</script>
<style lang="scss" scoped>
    .container{
        display: flex;
        align-items: center;
        .btn{
            margin-left: 10px;
        }
    }
</style>

相关文章

  • 用 vue3 写的简洁的 todolist 案例

    整体效果 父子组件传值父组件 子组件 mutations 处理操作 Home.vue 接收来自 store 中的数...

  • mobx-react简明教程

    mobx是很好,很容易理解的状态管理工具 先讲一下这个案例是做TODOlist的案例,利用antd样式,用mobx...

  • 用 vue2 写的一个 todolist 案例

    整体效果图 此案例涉及到的知识点 在子组件中需要向父组件传值处使用this.$emit("function",pa...

  • toDoList案例

    1.组件化编码流程(1)拆分静态组件:组件要按照功能点拆分,命名不要与 html 元素冲突(2)实现动态组件:考虑...

  • Vuex案例ToDoList

    Vuex学习 使用UI:ant-design-vue 修改main.js 修改App.vue组件,完善功能 创建 ...

  • react案例todoList

    项目结构 效果图 app.js app.css Foot.js Head.js Item.js List.js

  • toDoList 案例分析

    1.8.1 案例:案例介绍 鼠标按下keydown ;鼠标弹起 keyup ; keyCode 记录键盘按下事件...

  • vue todoList 案例

    添加,修改,删除 Footer组件 Head组件 List 组件 MyItem 组件 App 主组件 main.js

  • 用vue3开发一个打砖块小游戏

    前言 用vue3写了几个实例,感觉Vue3的composition Api设计得还是很不错,改变了一下习惯,但写多...

  • Vue3(一) CDN方式的安装以及简单使用

    简介 感觉vue3的新特性很舒服,这样才是写软件的感觉嘛。打算用Vue实现自己的一些想法。 Vue3还有几个必备库...

网友评论

      本文标题:用 vue3 写的简洁的 todolist 案例

      本文链接:https://www.haomeiwen.com/subject/ksyedrtx.html