首页 > 其他分享 >vue3学习之Pinia状态管理

vue3学习之Pinia状态管理

时间:2023-12-26 16:59:07浏览次数:34  
标签:count text 学习 state store Pinia vue3 todos doubleCount

状态管理

 src/views/Pinia.vue

<script setup>
import { ref } from "vue";
import { storeToRefs } from "pinia";
import { useCounterStore } from "../stores/counter";
import { useTodos } from "../stores/todos";

// 可以在组件中的任意位置访问 `store` 变量
const store = useCounterStore();

// const { count, doubleCount } = store; // `count` 和 `doubleCount` 没有响应式
let { count, doubleCount } = storeToRefs(store); // `count` 和 `doubleCount` 是响应式的 ref

// 作为 action 的 increment 可以直接解构
const { increment } = store;

store.count++;
setTimeout(() => {
  count.value++;
}, 2000);
setTimeout(() => {
  increment();
}, 4000);

const todoStore = useTodos();
const text = ref("");

function addTodo() {
  if (text != "") {
    todoStore.addTodo(text.value);
    text.value = "";
  }
}

function updateStatus(item) {
  todoStore.$patch((state) => {
    for (var i in state.todos) {
      if (item == state.todos[i]) {
        state.todos[i]["isFinished"] = !state.todos[i]["isFinished"];
      }
    }
  });
}

function delTodo(item) {
  let tmp = [];
  for (var i in todoStore.todos) {
    if (item != todoStore.todos[i]) {
      tmp.push(todoStore.todos[i]);
    }
  }
  todoStore.$patch({ todos: tmp });
}

todoStore.$subscribe((mutation, state) => {
  // 每当状态发生变化时,将整个 state 持久化到本地存储。
  localStorage.setItem("todos", JSON.stringify(state));
});
</script>
<template>
  <div>
    <div>
      <p>count:{{ count }}</p>
      <p>doubleCount:{{ doubleCount }}</p>
      <p>store.count:{{ store.count }}</p>
      <p>store.doubleCount:{{ store.doubleCount }}</p>
      <!-- 重置 state -->
      <button @click="store.$reset">重置</button>
    </div>

    <div>
      <p><input v-model="text" placeholder="edit me" @keyup.enter="addTodo" /></p>
      <ul>
        <li v-for="item in todoStore.filteredTodos" :key="item.id">
          {{ item.text }}
          <a v-if="item.isFinished">完成</a>
          <a v-else @click="updateStatus(item)">未完成</a>
          <a @click="delTodo(item)">删除</a>
        </li>
      </ul>
      <!-- 变更 state -->
      <button @click="todoStore.$patch({ filter: 'all' })">All</button>
      <button @click="todoStore.$patch({ filter: 'finished' })">Finished</button>
      <button @click="todoStore.$patch({ filter: 'unfinished' })">Unfinished</button>
      <!-- 重置 state -->
      <button @click="todoStore.$reset">重置</button>
    </div>
  </div>
</template>

<style scoped>
span,
a {
  margin-left: 1rem;
}

a {
  cursor: pointer;
}
</style>

 

src/stores/counter.js

import { defineStore } from "pinia";
import { ref, computed } from "vue";

export const useCounterStore = defineStore("counter", () => {
  const count = ref(0);
  function increment() {
    count.value++;
  }
  const doubleCount = computed(() => count.value * 2);

  //在 Setup Stores 中,需要创建自己的 $reset() 方法,Option Store不需要手段创建
  function $reset() {
    count.value = 0;
  }

  return { count, doubleCount, increment, $reset };
});

 

src/stores/todos.js

import { defineStore } from "pinia";

export const useTodos = defineStore("todos", {
  state: () => ({
    /** @type {{ text: string, id: number, isFinished: boolean }[]} */
    todos: [],
    /** @type {'all' | 'finished' | 'unfinished'} */
    filter: "all",
    // 类型将自动推断为 number
    nextId: 0,
  }),
  getters: {
    finishedTodos(state) {
      // 自动补全! ✨
      return state.todos.filter((todo) => todo.isFinished);
    },
    unfinishedTodos(state) {
      return state.todos.filter((todo) => !todo.isFinished);
    },
    /**
     * @returns {{ text: string, id: number, isFinished: boolean }[]}
     */
    filteredTodos() {
      if (this.filter === "finished") {
        // 调用其他带有自动补全的 getters ✨
        return this.finishedTodos;
      } else if (this.filter === "unfinished") {
        return this.unfinishedTodos;
      }
      return this.todos;
    },
  },
  actions: {
    // 接受任何数量的参数,返回一个 Promise 或不返回
    addTodo(text) {
      // 你可以直接变更该状态
      this.todos.push({ text, id: this.nextId++, isFinished: false });
    },
  },
});

 

标签:count,text,学习,state,store,Pinia,vue3,todos,doubleCount
From: https://www.cnblogs.com/caroline2016/p/17928488.html

相关文章

  • vue3学习之逻辑复用
    逻辑复用-组合式函数 src/views/ad/User.vue<scriptsetup>import{useMouse}from"../../js/mouse.js";import{useFetch}from"../../js/fetch.js";import{ref,computed}from"vue";//组合式函数const{x,y}=useMouse();/......
  • 测试开发 | TensorFlow:深度学习的引擎
    深度学习框架是支持深度学习模型开发和训练的关键工具,而TensorFlow作为其中一枚耀眼的明星,凭借其强大的功能和灵活性,成为深度学习领域的首选之一。本文将深入探讨TensorFlow的起源、基本原理、关键特性以及在人工智能领域中的应用。TensorFlow的起源与发展TensorFlow是由GoogleBra......
  • 测试开发 | PyTorch:深度学习的艺术之选
    深度学习框架是推动人工智能技术发展的关键工具,而PyTorch以其灵活的设计、直观的界面和强大的动态计算图而备受欢迎。本文将深入探讨PyTorch的起源、基本原理、关键特性以及在人工智能领域中的广泛应用。PyTorch的起源与发展PyTorch是由Facebook的人工智能研究团队开发的开源深度学......
  • HTML学习第五天:深入理解CSS与样式
    在今天的HTML学习中,我深入了解了CSS和样式的重要性。早上,我开始学习CSS的基础知识。CSS是一种用于描述网页样式的语言,它可以使网页更加美观和易于阅读。通过使用CSS,我可以控制网页中元素的布局、颜色、字体和许多其他样式属性。我学习了如何将CSS与HTML结合使用,以及如何使用不同的......
  • vue3学习基础之组件
    组件Comp.vue<scriptsetup>import{ref,provide,readonly,defineAsyncComponent}from"vue";importDemoCompfrom"../../components/simple/DemoComp.vue";importErrorComponentfrom"../../components/simple/ErrorComp.vue&......
  • Spring学习记录之Spring对IoC的实现
    Spring学习记录之Spring对IoC的实现前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使......
  • FPGA学习笔记---verilog学习(2)--过程块always@(*)
    在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。1、always语句有两种触发方式。第一种是电平触发,例如always@(aorborc),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。2、第二种是沿触发,例如always......
  • vue3学习基础之响应式状态
    响应式状态<scriptsetup>import{ref,reactive,computed,watch,watchEffect}from"vue";//reactive响应式对象只能用于对象、数组和集合类型constauthor=reactive({name:"JohnDoe",books:["Vue2-AdvancedGuide","Vue3-......
  • 深度学习:人工智能的前沿探索
    人工智能(ArtificialIntelligence,简称AI)是近年来科技领域最为引人注目的发展方向之一。在AI的众多技术中,深度学习(DeepLearning)无疑是最为引人瞩目和取得重大突破的领域之一。深度学习是一种模拟人脑神经网络结构和功能的机器学习方法,通过多层次的神经网络对数据进行学习和分析,以实......
  • 测试开发 | 深度学习的引擎:神经网络结构探析
    在人工智能领域中,深度学习的崛起被认为是推动技术革命的重要引擎之一。而深度学习的核心,则是建立在强大而灵活的神经网络结构之上。本文将深入探讨神经网络结构的关键组成部分,揭示其背后的原理和功能。神经网络的基本构成神经网络是深度学习的基石,其基本构成包括输入层、隐藏层和输......