pinia实现todos

store/todos.js

javascript 复制代码
//导入defineStore
import {defineStore} from 'pinia'
const userTodosStore=defineStore('todos',{
state:()=>({
    // list:[
    //     {id:1,name:'吃饭',done:false},
    //     {id:2,name:'睡觉',done:true},
    //     {id:3,name:'打豆豆',done:false}
    // ],
    list:JSON.parse(localStorage.getItem('todos')|| '[]'),
    filters:['全部','未完成','已完成'],
    active:'全部'
}),
actions:{
    //修改状态
    changeDone(id){
        const todo=this.list.find(item=>item.id===id)
        todo.done=!todo.done
    },
    //删除
    delTask(id){
        this.list=this.list.filter(item=>item.id !== id)
    },
    //添加
    addTask(taskname){
        this.list.push({
            id:Date.now(),
            name:taskname,
            done:false
        })
    },
    //全选
    changeAll(e){
        this.list.forEach(item=>item.done=e.target.checked)
    },
    //清除已完成
    clearDone(){
        this.list=this.list.filter(item=>!item.done)
    },
    //点击状态
    changeActive(active){
        this.active=active
    }

},
getters:{

    isAll(){
        return this.list.every(item=>item.done)
    },
    leftCount(){
        return this.list.filter(item=>!item.done).length
    },
    showList(){
        if(this.active==='已完成'){
            return this.list.filter(item=>item.done)
        }else if(this.active==='未完成'){
            return this.list.filter(item=>!item.done)
        }else{
            return this.list
        }
    }
}
    
})
export default userTodosStore

App.vue

html 复制代码
<script setup>
import TodoHeader from './components/TodoHeader.vue'
import TodoMain from './components/TodoMain.vue'
import TodoFooter from './components/TodoFooter.vue'
</script>

<template>
  <section class="todoapp">
    <TodoHeader></TodoHeader>
    <TodoMain></TodoMain>
    <TodoFooter></TodoFooter>
  </section>
</template>

<style></style>

TodoMain.vue

html 复制代码
<script setup>
import userTodosStore from '../store/todos'
// import {watch} from 'vue'
//获取store对象
const todos=userTodosStore()
//$subscribe 作用是监视store数据的变化,变化后会触发回调函数执行

// watch(todos.list,()=>{
//   localStorage.setItem('todos',JSON.stringify(todos.list))
// })
todos.$subscribe(()=>{
  localStorage.setItem('todos',JSON.stringify(todos.list))
})




</script>

<template>
  <section class="main">
    <input @change="todos.changeAll($event)" :checked="todos.isAll" id="toggle-all" class="toggle-all" type="checkbox" />
    <label for="toggle-all">Mark all as complete</label>
    <ul class="todo-list">
      <li v-for="item in todos.showList" :key="item.id" :class="{completed:item.done}">
        <div class="view">
          <input class="toggle" type="checkbox" :checked="item.done"
          @change="todos.changeDone(item.id)"
          />
          <label>{{ item.name }}</label>
          <button class="destroy" @click="todos.delTask(item.id)"></button>
        </div>
        <input class="edit" value="Create a TodoMVC template" />
      </li>
      <!-- <li>
        <div class="view">
          <input class="toggle" type="checkbox" />
          <label>Buy a unicorn</label>
          <button class="destroy"></button>
        </div>
        <input class="edit" value="Rule the web" />
      </li> -->
    </ul>
  </section>
</template>

<style lang="less" scoped></style>

ToDoHeader.vue

html 复制代码
<script setup>
import {ref} from 'vue'
import userTodosStore from '../store/todos'

//获取store对象
const todos=userTodosStore()
const taskname=ref('')
const hKeydown=()=>{
if(taskname.value.length===0)return

  todos.addTask(taskname.value)
  taskname.value=''
}
</script>


<template>
  <header class="header">
    <h1>todos</h1>
    <input class="new-todo" 
    placeholder="What needs to be done?" 
    autofocus 
    v-model.trim="taskname"
    @keydown.enter="hKeydown"
    />
  </header>
</template>

<style lang="less" scoped></style>

ToDoFooter.vue

html 复制代码
<script setup>
import userTodosStore from '@/store/todos';
const todos=userTodosStore()

</script>

<template>
  <footer class="footer">
    <span class="todo-count">还有<strong>{{todos.leftCount}}</strong> 个未完成</span>
    <ul class="filters">
      <li v-for="item in todos.filters" :key="item">
        <a @click="todos.changeActive(item)" :class="{selected:item === todos.active}" >{{item}}</a>
      </li>
      <!-- <li>
        <a href="#/active">Active</a>
      </li>
      <li>
        <a href="#/completed">Completed</a>
      </li> -->
    </ul>
    <button class="clear-completed " @click="todos.clearDone">清除已完成</button>
  </footer>
</template>

<style lang="less" scoped></style>
相关推荐
小白小白从不日白6 分钟前
react 组件通讯
前端·react.js
c4fx16 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
罗_三金16 分钟前
前端框架对比和选择?
javascript·前端框架·vue·react·angular
Redstone Monstrosity23 分钟前
字节二面
前端·面试
东方翱翔30 分钟前
CSS的三种基本选择器
前端·css
鸽芷咕39 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构