当前位置: 首页 > news >正文

Vue3 + Vite + TS,使用 Pinia

安装pinia
pnpm add pinia

Pinia 官网 传送门

main.js引入
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } 'pinia'
const app = createApp(App);
app.use(createPinia())
app.mount("#app")
创建一个pinia,scr/stores/index
import { defineStore } from 'pinia'
import { res } from 'vue'
export default defineStore('store',{
    const name = ref('名称')
    const items = ref([])

    return { name, items }
})
vue组件使用
import useStore from "@/stores/index"
import { storeToRefs } from 'pinia'
const store = useStore()
console.log(useStore.name)

// 解决解构后丢失响应式,引用 storeToRefs
const { name } = storeToRefs(store);

// 取值
store.name 

// 单个修改
store.name = "Abalam"

// 修改普通数据类型
store.$patch({
//   counter: store.counter + 1,
  name: 'Abalam',
})

// 修改普通数据类型 + 复杂数据类型
cartStore.$patch((state) => {
  state.items.push({ name: 'shoes', quantity: 1 })
  state.name = 'Abalam'
})

// 替换state,源码底层也是通过store.$patch去修改的
store.$state = { name:'Abalam', }
pinia 组合式API reset实现 main.js
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } 'pinia'
const app = createApp(App);
const pinia = createPinia();
pinia.use(store => {
    const beforeStore = store.$state; // 需要深度拷贝
    store.$reset = () => {
        store.$state = beforeStore // 需要深度拷贝
    }
})
app.use(pinia)
app.mount("#app")
订阅pinia的监听
import useStore from "@/stores/index"
const store = useStore()
store.$subscribe((mutation, state) => {
  // import { MutationType } from 'pinia'
  mutation.type // 'direct' | 'patch object' | 'patch function'
  // 与 cartStore.$id 相同
  mutation.storeId // 'cart'
  // 仅适用于 mutation.type === 'patch object'
  mutation.payload // 补丁对象传递给 to cartStore.$patch()

  // 每当它发生变化时,将整个状态持久化到本地存储
  localStorage.setItem('store', JSON.stringify(state))
})

// 此订阅将在组件卸载后保留
store.$subscribe(callback, { detached: true })

相关文章:

  • 程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图(水文,勿三)
  • 通过 python3 指令如何建立虚拟环境的办法
  • React + TypeScript 实现 SQL 脚本生成全栈实践
  • 数据集笔记:新加坡 一些交通的时间序列统计量
  • 不同版本的BLE和WiFi有什么区别?
  • 【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)、CT(匀速转弯)和CA(匀加速),滤波使用EKF。附完整代码
  • LeetCode 每日一题 2025/2/24-2025/3/2
  • 如何把word文档整个文档插入到excel表格里?
  • 内存管理技巧与任务堆栈优化详解(结合六足机器人项目)
  • 火山引擎 DeepSeek R1 API 使用小白教程
  • 从入门到精通:Linux 权限管理(rwx/chmod/chown)
  • CosyVoice2整合包 特殊声音标记,声音克隆更逼真,新增批量生成
  • ARMv8架构缓存一致性协议同步速度评估
  • 【MySQL】表空间丢失处理(Tablespace is missing for table 错误处理)
  • Git与GitHub实战指南:从入门到高效协作
  • GitCode 助力 python-office:开启 Python 自动化办公新生态
  • 为AI聊天工具添加一个知识系统 之127 详细设计之68 编程 核心技术:Cognitive Protocol Language 之2
  • 【零基础C语言】第三节 控制结构
  • 012 rocketmq事务消息
  • 安当全栈式PostgreSQL数据库安全解决方案:透明加密、动态凭据与勒索防护一体化实践
  • 上海最繁华的五个区/aso安卓优化公司
  • 如何注册域名?成本多少/seo网站制作优化
  • 网站怎样做排名靠前/seo优化网站推广专员招聘
  • 网站可以建几个人/市场调研的方法
  • 网站设计怎么做图片透明度/网店交易平台
  • 金昌市建设工程质量监督站网站/十大嵌入式培训机构