pinia实战 购物车(自定义插件实现pinia持久化)

news2024/11/29 12:51:27

目录

一、实例

二、需求

三. 代码解析

shop.vue 

shop.ts

四、持久化插件

插件介绍

持久化实现思路


一、实例

二、需求

  •  单选全选功能,并且可以互相联动
  •  小计功能
  •  总计功能
  •  商品加减,数量为零时不能在减

三. 代码解析

shop.vue 

1.获取shop模块实例

2.updateNum实现商品加减函数

3.allSelectChange 实现全选函数

4.singChange实现单选函数

<template>
    <div>我是购物车</div>
    <div>全选 <input type="checkbox" v-model="ShopStore.isAllSelect" @change="allSelectChange"></div> 
    <div v-for="(item,index) in ShopStore.goods" :key="index">
    <input @change="singChange" v-model="item.select" type="checkbox" name="" id="">
    商品名:{{ item.name }}  ----
    商品价格:{{ item.price }}  ----
    <button @click="updateNum(index,1)">+</button>
    {{ item.num||1 }}
    <button @click="updateNum(index,-1)" >-</button>
    小记 {{ item.price*(item.num||1) }}
    </div>
    <div>总价:{{ ShopStore.total }}</div>
</template>
<script setup lang="ts">
import { userShopStore } from "./store/shop";
const ShopStore = userShopStore()
const updateNum = (index: number, num: number) => {
    ShopStore.updateNum(index,num)
}
const allSelectChange = () => {
    ShopStore.allSelectChange()
}
const singChange = () => {
    ShopStore.singChange()
}
</script>

shop.ts

导入 defineStore函数  interface 定义接口类  导出模块实例

state存放数据  goods商品数组实现接口 isAllSelect全选状态

getters 计算属性。通过filter过滤出选择项 reduce累加计算总计

actions 存放方法

        updateNum 加减操作 初始化num 进行数值操作

        allSelectChange 每次点击全选,都需要同步单选状态 控制全选

        singChange:判断全选状态

import { defineStore } from "pinia";

interface IGoods {
    name: string,
    price: number,
    num?: number,
    select?: boolean
}
export const userShopStore = defineStore('shop', {
    state() {
        return {
            goods: [
                {
                    name: '羊肉串',
                    price: 20
                },
                {
                    name: '猪肉串',
                    price: 15
                },
                {
                    name: '鸡翅',
                    price: 10
                }
            ] as IGoods[],
            isAllSelect: false
        }
    },
    getters: {
        total(): number {
            return this.goods
                .filter(item => item.select)
                .reduce((total, item) => total += (item.num || 1) * item.price, 0)
        }
    },
    actions: {
        updateNum(index: number, num: number) {
            //初始化num
            this.goods[index].num = this.goods[index].num || 1

            //进行数值操作
            this.goods[index].num! += num
        },
        allSelectChange() {
            //每次点击全选,都需要同步单选状态
            this.goods.forEach((item) => {
                item.select = this.isAllSelect
            })
        },
        singChange() {
            this.isAllSelect = this.goods.every(item => item.select)
        }
    }
})

四、持久化插件

插件介绍

Pinia 插件是一个函数,可以选择返回要添加到 store 的属性。 它需要一个可选参数,一个 context

export function myPiniaPlugin(context) {
  context.pinia // 使用 `createPinia()` 创建的 pinia
  context.app // 使用 `createApp()` 创建的当前应用程序(仅限 Vue 3)
  context.store // 插件正在扩充的 store
  context.options // 定义存储的选项对象传递给`defineStore()`
  // ...
}

持久化实现思路

监听state的变化,把每次变化的结果放到localStorage里面。初始化的时候回显数据

import { PiniaPluginContext } from "pinia";


export function persistedstate(context: PiniaPluginContext) {
  // 初始化回显数据
  const shop = JSON.parse(localStorage.getItem(context.store.$id) || "{}");
  context.store.$patch(shop);


  // 订阅每次state的变化
  context.store.$subscribe(
    (_mutation, state) => {
      localStorage.setItem(_mutation.storeId, JSON.stringify(state));
    },
    {
      detached: true,
    }
  );
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AttributeError: module ‘lib‘ has no attribute ‘OpenSSL_add_all_algorithms

pip安装crackmapexec后,运行crackmapexec 遇到报错 AttributeError: module lib has no attribute OpenSSL_add_all_algorithms 直接安装 pip3 install crackmapexec 解决 通过 python3 -m pip install --upgrade openssl 或者 python3 -m pip install openssl>22.1.…

YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别

YOLOv7 Flask Web 车牌识别图片效果展示 本篇博文只包含源码以及使用方式,目前不同提供详细开发教程。 YOLOv7 Flask Web 车牌识别视频效果展示 YOLOv7 + EasyOCR 实现车牌识别 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更…

【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)

导语 哈喽大家好呀&#xff01;我是每天疯狂赶代码的木木子吖&#xff5e;情人节快乐呀&#xff01; 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 我们都知道&#xff0c;有很多经典的老照片…

云原生时代顶流消息中间件Apache Pulsar部署实操-上

文章目录安装运行时Java版本推荐Locally Standalone集群启动验证部署分布式集群部署说明初始化集群元数据部署BookKeeper部署BrokerAdmin客户端和验证Tiered Storage(层级存储)概述支持分级存储何时使用工作原理安装 运行时Java版本推荐 Locally Standalone集群 启动 # 下载…

Eureka集群搭建教程

前言&#xff1a; 为了提升注册中心稳定性&#xff0c;防止注册中心宕机后&#xff0c;服务不可用的情况&#xff0c;我们可以通过将Eureka注册中心搭建成集群模式&#xff0c;当一台注册中心微服务宕机后&#xff0c;另一台依然可以支持服务的注册与发现。本文将讲解下如何搭…

在Spring-boot中操作MongoDB

MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。在使用spring-boot操作MongoDB数据…

项目介绍 + 定长内存池设计及实现

你好&#xff0c;我是安然无虞。 文章目录项目介绍当前项目做的是什么?技术栈内存池是什么?池化技术内存池内存池主要解决的问题malloc定长内存池学习目的定长内存池设计项目介绍 当前项目做的是什么? 这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项…

C++——哈希3|位图

目录 常见哈希函数 位图 位图扩展题 位图的应用 常见哈希函数 1. 直接定址法--(常用) 这种方法不存在哈希冲突 取关键字的某个线性函数为散列地址&#xff1a;Hash&#xff08;Key&#xff09; A*Key B 优点&#xff1a;简单、均匀 缺点&#xff1a;需要事先知道关键字的…

C语言学习笔记(八): 自定义数据类型

结构体变量 什么是结构体 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构&#xff0c;它称为结构体 结构体的成员可以是任何类型的变量&#xff0c;如整数&#xff0c;字符串&#xff0c;浮点数&#xff0c;其他结构体&#xff0c;指针等 struct Student //s…

streamlit自定义组件教程和组件开发环境配置

About create your own component&#xff1a; you can follow this tutorial streamlit tutorial 重要&#xff01;以下步骤都是在教程的基础上更改的。这个教程做的很棒。 Component development environment configuration&#xff1a; 根据文章 https://streamlit-com…

【iOS】APP IM聊天框架的设计(基于第三方SDK)

【iOS】APP IM聊天框架的设计&#xff08;基于第三方SDK&#xff09; 前言 在开发社交聊天类型的APP的时候&#xff0c;IM是必不可少的功能&#xff0c;而且很多公司的IM服务都是接的第三方的&#xff0c;很少用自研的&#xff0c;国内的IM厂商也都很成熟&#xff0c;本文所有…

基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地

文心大模型,产业级知识增强大模型介绍 官网:https://wenxin.baidu.com/ 文心大模型开发套件ERNIEKit,面向NLP工程师,提供全流程大模型开发与部署工具集,端到端、全方位发挥大模型效能。 提供业界效果领先的ERNIE 3.0系列开源模型和基于ERNIE的前沿任务模型,满足企业和开…

暴力破解(new)

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 01 暴力破解介绍及应用场景 》暴力破解介绍 》暴力破解字典 GitHub - k8gege/Passwor…

QT(56)-动态链接库-windows-导出变量-导出类

1.导出变量 1.1不使用_declspec(dllimport) _declspec(dllexport) 使用_declspec(dllimport) _declspec(dllexport) 1.2win32 mydllwin32 myexe 1.3win32 mydllqt myexe 2.导出类 使用_declspec(dllimport) _declspec(dllexport) 2.1不用关键…

导出Excel表格(调用后端接口方式)

在开发中我们会遇到导出Excel表格的需求&#xff0c;但是导出分为前端生成和后端生成。前端生成的方式CSDN其他小伙伴已经做出了很多教程&#xff0c;是依赖xlsx插件。但是&#xff0c;今天我讲的是&#xff0c;调用后端接口的方式生成Excel表格。1.调用后端提供的导出接口&…

Doris--简单使用

一、数据表的创建与数据导入 1.1、创建表 1.1.1、单分区 CREATE TABLE table1 (siteid INT DEFAULT 10,citycode SMALLINT,username VARCHAR(32) DEFAULT ,pv BIGINT SUM DEFAULT 0 -- 聚合模型&#xff0c; value column 使用sum聚合 ) AGGREGATE KEY(siteid, citycode, …

【Java】二叉树

一、树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 有一个特殊…

IDEA安装ChatGPT插件

ChatGPT&#xff0c;美国OpenAI [1] 研发的聊天机器人程序 [12] &#xff0c;于2022年11月30日发布 [2-3] 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人…

mybatis条件构造器(一)

mybatis条件构造器(一) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT N…

tws耳机哪个牌子音质好?tws耳机音质排行榜

随着蓝牙耳机市场的不断发展&#xff0c;使用蓝牙耳机的人也逐渐增多&#xff0c;近年来更是超越有线耳机成为最火爆的数码产品之一。那么&#xff0c;tws耳机哪个牌子音质好&#xff1f;下面&#xff0c;我来给大家推荐几款音质好的tws耳机&#xff0c;可以当个参考。 一、南…