Vue(第十五课)Pinia组件库的基本知识

news2024/11/23 7:16:06

为什么要使用 Pinia?

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得很多好处:

  • dev-tools 支持
    • 跟踪动作、突变的时间线
    • Store 出现在使用它们的组件中
    • time travel 和 更容易的调试
  • 热模块更换
    • 在不重新加载页面的情况下修改您的 Store
    • 在开发时保持任何现有状态
  • 插件:使用插件扩展 Pinia 功能
  • 为 JS 用户提供适当的 TypeScript 支持或 autocompletion
  • 服务器端渲染支持

Pinia与 Vuex 的比较

Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。最终,我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容,并决定实现它 取而代之的是新的建议。

与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

介绍 | Pinia 中文文档

第一步:安装Pinia

用你最喜欢的包管理器安装 pinia

yarn add pinia
# 或者使用 npm
npm install pinia

在深入了解核心概念之前,我们需要知道 Store 是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递:

import { defineStore } from 'pinia'

// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id
export const useStore = defineStore('main', {
  // other options...
})

这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use... 是跨可组合项的约定,以使其符合你的使用习惯。

第二步  在main.js文件中导入配置文件信息

import { createApp } from 'vue'

// 将Vue文件中挂载到vue中去
import App from './App.vue'

// 将文件挂载到mian.js文件中去 导入pinia文件的信息文件
//引入ElementUI组件库
import { createPinia } from 'pinia'
// 初始化文件信息
const pinia=createPinia();
const app=createApp(App);
app.use(pinia)
app.mount("#app")

 在src文件中创建一个文件夹存放Pinia组件的开发的基本信息

 第一个属性 state属性的学习

  1. 第一 创建store对象
  2. 第二步 调用state属性的使用
  3. 第三步 在State中修改Store属性
  4.  第四步 在State中批量修改数据
  5.  第五步  替换state中的属性
  6.  第六步 在State中重置state中属性的方法

 第一步 认识pinia中的store 先观察下面的图 然后在分析代码

 

 

 

 第二步 调用state属性的使用 展示的数据内容

 

 

 

 <h3>创建人的对象信息</h3>
    <div>{{store}}</div>
    <h2>
      <h1 style="color:green">state属性的基本使用</h1>
      <span>我的数量:{{counter}}</span>&nbsp;&nbsp;
      <span>编号:{{ id }}</span>&nbsp;
      <span>性别:{{ sex }}</span>&nbsp;&nbsp;
      <span>姓名:{{ name }}</span>&nbsp;&nbsp;
      <span>年龄:{{ age }}岁</span>&nbsp;&nbsp;
      <span>身高{{ height }}cm</span>&nbsp;&nbsp;
      </h2>
      <hr>
     <h1></h1>
import { useUsersStore } from "./store/user";
import { storeToRefs } from "pinia";
// import OneItem from "./OneItem.vue";
/**
 *       第一 创建store对象
 *       第二步 调用state属性的使用
 *       第三步 在State中修改Store属性
 *       第四步 在State中批量修改数据
 *       第五步  替换state中的属性
 *       第六步 在State中重置state中属性的方法
 */
// import { ref } from "vue";

// 第一 创建store对象
const store = useUsersStore();
console.log(store);
// 第二步 调用state属性的使用
// const id = ref(store.id);
// const name = ref(store.name);
// const age = ref(store.age );
// const height = ref(store.height);

// const {id,name,age,sex,height}= store

// 数据变为了响应式的数据信息
const { id, name, age, sex, height,counter } = storeToRefs(store);

// console.log(id)

// console.log(id+name+age+height);

// console.log(userStore);
// console.log(
// userStore.id +
// " " +
// userStore.name +
// " " +
// userStore.age +
// " " +
// userStore.height
// );
 People:[
                {
                    "brandName":"华晨世界",
                    "carName":"宝马S5",
                    "price":98000,
                    "click":5500,
                    "carId":1
                },
                {
                    "brandName":"奔驰X0",
                    "carName":"我是增加的数据信息",
                    "price":18000,
                    "click":1500,
                    "carId":2
                },
                {
                    "brandName":"本田X0",
                    "carName":"本田",
                    "price":28000,
                    "click":1500,
                    "carId":3
                },
                {
                    "brandName":"普利XX",
                    "carName":"普利",
                    "price":17,
                    "click":1900,
                    "carId":4
                },
                {
                    "brandName":"菲拉s",
                    "carName":"法拉第",
                    "price":21000,
                    "click":2150,
                    "carId":5
                },
                {
                    "brandName":"WES",
                    "carName":"大鹏",
                    "price":8000,
                    "click":5400,
                    "carId":6
                },
                {
                    "brandName":"CI50",
                    "carName":"雷达",
                    "price":1800,
                    "click":1500,
                    "carId":7
                },
                {
                    "brandName":"本田X0",
                    "carName":"本田",
                    "price":28000,
                    "click":1500,
                    "carId":8
                },
                {
                    "brandName":"YYCS",
                    "carName":"发拉蒂",
                    "price":17,
                    "click":1900,
                    "carId":9
                },
                {
                    "brandName":"WES",
                    "carName":"本田",
                    "price":8000,
                    "click":5400,
                    "carId":10
                }
            ],
 <div>{{store.People}}</div>

第三步 在State中修改Store属性

 

// 第三步 在State中修改Store属性
const changeName = () => {
  store.name = "我是响应式的数据信息";
  store.id = "10002001";
  store.sex = "女";
  store.SetCount()
  store.setAge()
  console.log(store);
};

// 第四步 在State中批量修改数据
const patchStore = () => {
  // 在state中数据要修改的信息
  store.$patch({
    id: "1001",
    name: "批量修改数据",
    sex: "不男不女",
    height: "190",
    weight: "89",
  });
};
//第五步  替换state中的属性
const updatestate = () => {
  store.$state = {
    counter: 0,
    name: "我是替换属性",
    sex: "男",
    height: "120",
    weight: "89",
  };
};

// 第六步 在State中重置state中属性的方法
const reset = () => {
  store.$reset();
};

结果展示

 

 

 

  第二个属性getters属性的学习

getter是一个对象的信息内容  相当于计算属性的内容

 

 // getter是一个对象的信息内容  相当于计算属性的内容 
    getters:{

        getAddAge:(state)=>{
            // 返回出的数据
            return state.age+100
            // return(num)=>state.age+num
        },
        getAddName:(state)=>{
            return state.name="我是在getters中修改的姓名"
        },
        getAddHeight:(state)=>{
            return state.height="200"
        },
        doubleCounter:(state)=>state.counter*10,
        doubleFirst:(state)=>state.firstName="Hellow State",
        fullname:(state)=>state.firstName+state.lastName,
        // 新增状态属性和编写Getters

        phoneHidden(state){
            console.log('PhoneHidden被调用了')
            return state.phone.toString().replace(/^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/, '$1****$2')
          }

 

 

在加一个组件

 第三个 修改后的属性信息 actions

 

 

 

 代码模块

APP.vue

<template>
  <div>
    <h3>创建人的对象信息</h3>
    <div>{{store}}</div>
    <h2>
      <h1 style="color:green">state属性的基本使用</h1>
      <span>我的数量:{{counter}}</span>&nbsp;&nbsp;
      <span>编号:{{ id }}</span>&nbsp;
      <span>性别:{{ sex }}</span>&nbsp;&nbsp;
      <span>姓名:{{ name }}</span>&nbsp;&nbsp;
      <span>年龄:{{ age }}岁</span>&nbsp;&nbsp;
      <span>身高{{ height }}cm</span>&nbsp;&nbsp;
      </h2>
      <hr>
     <h1></h1>
      <h2>
      <h1 style="color:green">getters属性的基本使用</h1>
      <span>新的姓名:{{store.getAddName}}</span>&nbsp;&nbsp;
      <span>新的年龄:{{store.getAddAge}}</span>&nbsp;&nbsp;
      <span>新的身高:{{store.getAddHeight}}</span>&nbsp;&nbsp;
      <h1></h1>
      <span><button @click="changeName">更改姓名的方法</button></span>
      <span><button @click="reset">我在重置state数据信息</button></span>
      <span><button @click="patchStore">批量修改state中的数据信息</button></span>
      <span><button @click="updatestate">替换state对象的属性</button></span>
      <div>{{store.People}}</div>
    </h2>
    <OneItem></OneItem>
  </div>
</template>

<script setup>
import { useUsersStore } from "./store/user";
import { storeToRefs } from "pinia";
import OneItem from "./OneItem.vue";

// import { ref } from "vue";

// 第一 创建store对象
const store = useUsersStore();
console.log(store);
// 第二步 调用state属性的使用
// const id = ref(store.id);
// const name = ref(store.name);
// const age = ref(store.age );
// const height = ref(store.height);

// const {id,name,age,sex,height}= store

// 数据变为了响应式的数据信息
const { id, name, age, sex, height,counter } = storeToRefs(store);


// 第三步 在State中修改Store属性
const changeName = () => {
  store.name = "我是响应式的数据信息";
  store.id = "10002001";
  store.sex = "女";
  store.SetCount()
  store.setAge()
  console.log(store);
};

// 第四步 在State中批量修改数据
const patchStore = () => {
  // 在state中数据要修改的信息
  store.$patch({
    id: "1001",
    name: "批量修改数据",
    sex: "不男不女",
    height: "190",
    weight: "89",
  });
};

//第五步  替换state中的属性
const updatestate = () => {
  store.$state = {
    counter: 0,
    name: "我是替换属性",
    sex: "男",
    height: "120",
    weight: "89",
  };
};

// 第六步 在State中重置state中属性的方法
const reset = () => {
  store.$reset();
};
</script>

OneItem.vue

<template>
  <div>
    <h3 style="color: red">创建人的对象信息共享组件的数据</h3>
    <h3>创建人的对象信息</h3>
    <h2>
      <h1 style="color: green">state属性的基本使用</h1>
      <span>我的数量:{{ counter }}</span
      >&nbsp;&nbsp; <span>编号:{{ id }}</span
      >&nbsp; <span>性别:{{ sex }}</span
      >&nbsp;&nbsp; <span>姓名:{{ name }}</span
      >&nbsp;&nbsp; <span>年龄:{{ age }}岁</span>&nbsp;&nbsp;
      <span>身高{{ height }}cm</span>&nbsp;&nbsp;
      <hr>
      <h2>电话的属性:{{store.phoneHidden}}</h2>
      <h3><button @click="handleClickChangePhone">Getter缓存</button></h3>
      <h4>{{store.ObjectArray}}</h4>
    </h2>
  </div>
</template>

<script setup>
import { useUsersStore } from "./store/user";
// import { ref } from "vue";

// 创建store对象
const store = useUsersStore();
console.log(store);

// const id = ref(store.id);
// const name = ref(store.name);
// const age = ref(store.age );
// const height = ref(store.height);

const { id, name, age, sex, height } = store;

// 访问内容
/**
 *    doubleCounter:(state)=>state.counter*10,
   doubleFirst:(state)=>state.firstName="Hellow State",
   fullname:(state)=>state.firstName+state.lastName,
 */
console.log(store.firstName)
console.log(store.lastName)
// 点击按钮的对应函数
const handleClickChangePhone = () => {
    store.phone = "17800000000";
}


</script>

 

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

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

相关文章

jsp人力资源管理系统Myeclipse开发mysql数据库servlet开发java编程计算机网页项目

一、源码特点 JSP 人力资源管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

用户信息列表实现增删改查案例的实现【问题及解决过程记录】【综合案例】

目录 用户信息列表展示案例 1. 需求&#xff1a; 1. 简单功能 1. 列表查询 2. 登录 3. 添加 4. 删除 5. 修改 2. 复杂功能 1. 删除选中 2. 分页查询 * 好处&#xff1a; 1. 减轻服务器内存的开销 …

【云原生 | Kubernetes 实战】06、Pod高级实战:基于污点、容忍度、亲和性的多种调度策略(下)

目录 一、Pod节点亲和性 1.1 案例演示&#xff1a;pod 节点亲和性——podAffinity 1.2 案例演示&#xff1a;pod 节点反亲和性——podAntiAffinity 1.3 案例演示&#xff1a; 换一个 topologykey 值 二、污点和容忍度 2.1 案例演示&#xff1a; 把 node2 当成是生产环境专…

Python中常见的调色板: 颜色 color

Python中常见的调色板&#xff1a; 颜色 color 这个人对颜色的总结&#xff0c;非常到位哈&#xff01; https://blog.csdn.net/weixin_42943114/article/details/81811556

SPI 机制详解

SPI 全称为 Service Provider Interface &#xff0c;它是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件&#xff0c;自动加载文件里所定义的类。这一机制为很多框架拓展提供了可能&#xff0c;比如在Dubbo&#xff0c;JDBC中都使用到了SPI…

go return返回值屏蔽

前言 最近需要写一个云环境的可执行程序&#xff0c;一般使用go语言&#xff0c;毕竟GC原生运行&#xff0c;结合了不需要回收指针的能力和原生运行&#xff0c;但是在程序返回时&#xff0c;笔者看到一个sdk的源码懵了&#xff0c;返回的数据居然可以隐式返回。 准备 go 版本…

机器学习8线性回归法Linear Regression

文章目录一、线性回归算法简介典型的最小二乘法的问题目标&#xff1a;具体怎么推此处省略二、简单线性回归的实现三、向量化运算一、线性回归算法简介 1.解决回归问题&#xff1b; 2.思想简单&#xff0c;实现容易&#xff1b; 3.是许多强大的非线性模型的基础&#xff1b; 4…

ESP32——WEB服务程序测试(基于官方示例restful_server)

一、简介 基于官方示例restful_server创建一个新工程。 参考1&#xff1a; 官方说明 参考2&#xff1a; ES32 RESTful_server实验_NULL_1969的博客-CSDN博客 二、编译下载运行工程 直接编译运行&#xff0c;出现下面两个错误。 2.1 OCD调试错误 esp_semihost: OpenOCD i…

文本生成客观评价指标总结(附Pytorch代码实现)

前言&#xff1a;最近在做文本生成的工作&#xff0c;调研发现针对不同的文本生成场景&#xff08;机器翻译、对话生成、图像描述、data-to-text 等&#xff09;&#xff0c;客观评价指标也不尽相同。虽然网络上已经有很多关于文本生成评价指标的文章&#xff0c;本博客也是基于…

[附源码]JAVA毕业设计计算机组成原理教学演示软件(系统+LW)

[附源码]JAVA毕业设计计算机组成原理教学演示软件&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

PCB元件创建

目录 一&#xff1a;创建元件基本流程 1.1.创建一个原理图库 1. 2.创建元件 1.3绘制 1.4放置管脚 二&#xff1a; 元件创建 2.1电容类元件创建 2.2.电感类元件 2.3.电阻类元件 2.4LED元件 2.5按键元件 2.6芯片类元件创建 2.6.1修改栅格颜色 2.6.2阵列粘贴 2.7接插…

kubernetes Service详解

文章目录Service介绍Service类型Endpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的ServiceExternalName类型的Servicengress介绍Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序…

python Threads and ThreadPools

在之前的文章解释了线程和锁的相关事项&#xff0c;这里准备三篇文章分别介绍下线程和线程池&#xff0c;进程和进程池&#xff0c;已经携程的概念 python Threads and ThreadPoolspython Process and ProcessPolls 本文中重点介绍下线程和线程池的概念。每个python程序都是一…

毕业设计-基于机器视觉的安全帽佩戴识别-yolo-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

mysql监控sql执行情况

要想进阶针对mysql学习乃至掌握mysql调优的基本技能&#xff0c;监控mysql的执行情况必不可少。就像我们的代码&#xff0c;如果不能debug&#xff0c;想要进行调优排错&#xff0c;难度将会大大增加。 所以今天我们就来讲解如何监控mysql的sql执行情况 show profile指令什么是…

Pinely Round 1 (Div. 1 + Div. 2)

比赛链接&#xff1a;Dashboard - Pinely Round 1 (Div. 1 Div. 2) - Codeforces A&#xff1a;思维 题意&#xff1a;定义了一个序列&#xff0c;给定了三个整数n&#xff0c;a&#xff0c;b。问能否构造两个长度为n的序列&#xff0c;使得它们的最长前缀的长度为a&#xf…

Mongo非关系型数据库

mongo三个概念 如何下载MongoDB 参考(5条消息) mongodb免安装配置_剑客916的博客-CSDN博客 (5条消息) MongoDB的安装配置教程&#xff08;很详细&#xff0c;你想要的都在这里&#xff09;_狮子座的男孩的博客-CSDN博客_mongodb配置 下载地址 Download MongoDB Community Se…

PDF Shaper Pro v12.8 全能PDF工具箱中文版

PDF Shaper 是一款实用的全能PDF工具箱&#xff01;这款PDF转换器包含了很多非常实用的PDF工具&#xff0c;可以轻松的把 PDF 转成 Word&#xff0c;PDF 转图像&#xff0c;PDF 加密等等。它还可以合并&#xff0c;分割&#xff0c;加密和解密 PDF&#xff0c;图像转换为 PDF&a…

Python学习笔记-序列

用于记述python中对于序列的应用&#xff0c;包括列表、元组、字典、集合、字符串等。 1.序列

我看世界杯

目录 写在前面 正文 第一次看世界杯 我看重的球队 写在最后 写在前面 说实话&#xff0c;第一次接触足球还是在小学阶段&#xff0c;现在已经记不清那是在哪里搞来的&#xff0c;反正是挺破烂的&#xff0c;外面的五边形布料都已经脱落&#xff0c;都能露出里面的布料&…