【vue3 for beginner】Pinia基本用法:存储user的信息

北海道富士山景色

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

Pinia 简介

Pinia 是一个用于 Vue.js 应用的状态管理库,是 Vuex 的替代品。它提供了一个简单、直观的 API 来管理应用的状态,特别适用于 Vue 3 和 Composition API。Pinia 设计为轻量级且易于使用,支持模块化、类型推导和更好的开发体验。
Pinia啥时候用?
通常是有全局的生命周期时使用,如用户的login信息等。
如果是组件内部的数据,不需要用Pinia,只要维护在组件内就可以了。

主要特点

  • 轻量级:比 Vuex 更少的代码和更简单的 API。
  • 模块化:支持将状态分割成多个 store,便于管理。
  • TypeScript支持:内置支持 TypeScript,提供类型推导。
  • 热重载:在开发模式下支持热重载,提升开发效率。
  • 与 Vue Router集成:可以轻松管理路由状态。

Pinia 的基本用法

  1. 安装 Pinia,取决于你使用的包管理工具
npm install pinia

yarn add pinia
  1. 创建 Pinia Store
    在 Vue 应用中创建一个 Pinia 实例,并用export导出一个变量名为useMainStore的store。
    我们用user来存储用户的信息并交给Pinia管理。
    src/stores/user.js
// stores/user.store.js
import { defineStore } from 'pinia';export const useUserStore = defineStore('user', {state: () => ({name: 'John Doe', // 初始名字age: 25,          // 初始年龄}),actions: {updateName(newName) {this.name = newName; // 更新名字},incrementAge() {this.age++; // 年龄加 1},},
});
  1. 在 Vue 应用中使用 Pinia,找到main.js文件将 Pinia 实例添加到 Vue 应用中。
// main.js
import {createApp} from 'vue'
import App from './App.vue'
// 第一步:引入pinia
import {createPinia} from 'pinia'const app = createApp(App)
// 第二步:创建pinia
const pinia = createPinia()
// 第三步:安装pinia
app.use(pinia)
app.mount('#app')
  1. 使用 Store
    在组件中,使用 useMainStore 来访问和修改状态。

User.vue

<template><div><h1>User Info</h1><p>Name: {{ userStore.name }}</p><p>Age: {{ userStore.age }}</p><button @click="userStore.incrementAge">Increase Age</button><input v-model="newName" @blur="updateUserName" placeholder="Change name" /></div>
</template><script>
//import { useUserStore } from '../stores/user'; // 导入 User Store
import {useUserStore} from '@store/user'
import { ref } from 'vue';export default {setup() {const userStore = useUserStore(); // 使用 User Storeconst newName = ref(''); // 创建响应式变量const updateUserName = () => {userStore.updateName(newName.value); // 更新名字newName.value = ''; // 清空输入框};return {userStore, // 返回用户 StorenewName,updateUserName,};},
};
</script>

App.vue

<template><User/></template><script setup lang="ts" name="App">import User from './components/User.vue'</script>

store

Store是一个保存:状态、业务逻辑 的实体,每个组件都可以读取、写入它。

它有三个概念:state、getter、action,相当于组件中的: data、 computed 和 methods

修改数据的三种方式

直接修改

	//script中先获取storeconst userStore = useUserStore(); // 使用 User Store先取到值//在tmplate中直接修改<button @click="userStore.name = 'John'">Set Name to John</button>

批量修改

    <button @click="updateUser">通过$patch修改name和age</button>//批量修改,通过pathconst updateUser = () => {userStore.$patch({name: 'Martin', // 批量修改名字age: 88,        // 批量修改年龄});};return {updateUser,userStore}// 返回用户 Store和方法

借助actions

// stores/user.store.js
import { defineStore } from 'pinia';export const useUserStore = defineStore('user', {state: () => ({name: 'John Doe', // 初始名字age: 25,          // 初始年龄}),actions: {updateName(newName) {this.name = newName; // 更新名字},incrementAge() {this.age++; // 年龄加 1},},
});

三种修改方式效果展示

只修改User.vue即可

<template><div><h1>User Info</h1><p>Name: {{ userStore.name }}</p><p>Age: {{ userStore.age }}</p><button @click="userStore.incrementAge">Increase Age</button><button @click="userStore.name = 'John'">直接修改name为John</button><input v-model="newName" @blur="updateUserName" placeholder="Change name" /><button @click="updateUser">通过$patch修改name和age</button></div>
</template><script>
//import { useUserStore } from '../stores/user'; // 导入 User Store
import {useUserStore} from '@store/user'
import { ref } from 'vue';export default {setup() {const userStore = useUserStore(); // 使用 User Storeconst newName = ref(''); // 创建响应式变量//直接修改const updateUserName = () => {userStore.updateName(newName.value); // 更新名字newName.value = ''; // 清空输入框};//批量修改,通过pathconst updateUser = () => {userStore.$patch({name: 'Martin', // 批量修改名字age: 88,        // 批量修改年龄});};return {userStore, // 返回用户 StorenewName,updateUserName,updateUser};},
};
</script>

页面效果

在这里插入图片描述
这里我给页面加上淡蓝色的背景,稍微美观一些。
增加了背景色的User.vue代码如下。

<template><div class="container"> <h1>User Info</h1><p>Name: {{ userStore.name }}</p><p>Age: {{ userStore.age }}</p><button @click="userStore.incrementAge">Increase Age</button><button @click="userStore.name = 'John'">直接修改name为John</button><input v-model="newName" @blur="updateUserName" placeholder="Change name" /><button @click="updateUser">通过$patch修改name和age</button></div>
</template><script>
//import { useUserStore } from '../stores/user'; // 导入 User Store
import {useUserStore} from '@store/user'
import { ref } from 'vue';export default {setup() {const userStore = useUserStore(); // 使用 User Storeconst newName = ref(''); // 创建响应式变量//直接修改const updateUserName = () => {userStore.updateName(newName.value); // 更新名字newName.value = ''; // 清空输入框};//批量修改,通过pathconst updateUser = () => {userStore.$patch({name: 'Martin', // 批量修改名字age: 88,        // 批量修改年龄});};return {userStore, // 返回用户 StorenewName,updateUserName,updateUser};},
};
</script>
<style scoped>
.container {background-color: #e0f7fa; /* 淡蓝色背景 */padding: 20px; /* 添加一些内边距 */border-radius: 8px; /* 可选:添加圆角 */
}
</style>

💡 Tips小知识点

修改数据的方式区别:
1、直接操作两个变量修改name和age
2、通过 $patch批量修改name和age

直接修改会触发两次vue的事件,类似于watch,通过 $patch修改无论结构内部有多少属性,也只会触发一次vue的事件,性能会更好。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述

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

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

相关文章

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…

C#设计模式--状态模式(State Pattern)

状态模式是一种行为设计模式&#xff0c;它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中&#xff0c;而不是将状态逻辑散布在整个程序中。 用途 简化复杂的条件逻辑&#xff1a;通过将不同的状态封装在不同的类中&#xff0c;可…

nginx 自启动失败:Failed to parse PID from file: Invalid argument

记一次nginx自启动配置的问题 我的配置如下&#xff1a; [Unit] DescriptionA high performance web server and a reverse proxy server Afternetwork.target[Service] Typeforking PIDFile/home/u24/nginx/pid/nginx.pid ExecStartPre/home/u24/nginx/sbin/nginx -t -q -g d…

React基础知识四 Hooks

什么是hooks&#xff1f; (coderwhy) hooks是react 16.8&#xff08;2019年&#xff09;出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候&#xff0c;函数式组件是非常鸡肋的&#xff0c;几乎没什么用。因…

电子病历静态数据脱敏路径探索

一、引言 数据脱敏&#xff08;Data Masking&#xff09;&#xff0c;屏蔽敏感数据&#xff0c;对某些敏感信息&#xff08;比如patient_name、ip_no、ad、no、icd11、drug等等 &#xff09;通过脱敏规则进行数据的变形&#xff0c;实现隐私数据的可靠保护。电子病历作为医疗领…

迷宫路径搜索:广度优先搜索(BFS)

迷宫路径搜索&#xff1a;广度优先搜索&#xff08;BFS&#xff09;详解 1. 什么是广度优先搜索&#xff08;BFS&#xff09;&#xff1f; 广度优先搜索&#xff08;BFS&#xff09; 是一种在图或网格结构中逐层扩展节点的搜索算法&#xff0c;适合用于解决最短路径问题。 特点…

AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!

AIGC 012-Video LDM-Stable Video diffusion前身&#xff0c;将LDM扩展到视频生成任务&#xff01; 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者&#xff0c;作者在SD的架构上进行扩展&#xff0c;实现了视频的生成。后续在Vid…

openstack创建浮动IP全过程

1、创建外部网络&#xff0c;即是provider网络&#xff0c;有关provider网络的详细解释请参见我之前的文章openstack中的self-service和provider网络_openstack provider网络不能创建vlan吗-CSDN博客 network create --share --external --provider-physical-network physnet1…

ABAP DIALOG屏幕编程1

一、DIALOG屏幕编程 DIALOG屏幕编程是SAP ABAP中用于创建用户交互界面的一种技术&#xff0c;主要用于开发事务性应用程序。它允许用户通过屏幕输入或操作数据&#xff0c;程序根据用户的操作执行逻辑处理。 1、DIALOG编程的主要组件 a、屏幕 (Screen) DIALOG程序的核心部分…

Anaconda升级的解决方法

文章目录 关于conda升级问题1. 在原Anaconda版本上进行更新升级2. 就是重装Anaconda 镜像源配置的参数解释&#xff1a;1. conda-forge2. bioconda3. menpo 关于conda升级问题&#xff0c; Anaconda各种版本镜像下载地址&#xff1a; 关于conda升级问题 1. 在原Anaconda版本上…

服务路由和服务发现区别是什么?

要快速学习服务路由和服务发现的区别&#xff0c;以下是这个领域最重要的20%的知识&#xff1a; 服务路由&#xff08;Service Routing&#xff09; 定义&#xff1a;服务路由是微服务架构中的一个关键概念&#xff0c;涉及将客户端的请求路由到合适的服务实例上。在分布式系…

青训营-豆包MarsCode技术训练营试题解析二十七

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目。该项目的目标是培养具有职业竞争力的优秀开发工程师&#xff0c;并提供全程免费的课程&#xff0c;不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵盖前端、后端和AI方向。在这个飞…

网络安全之信息收集

1、大纲 基本信息收集  网站后台查找 域名查找    整站分析 敏感目录    Googlehacker 端口扫描    URL采集 旁站C段    信息分析 CDN绕过方法 2、域名信息 对应IP收集 相关域名对应IP 站长之家-->站长工具 nslookup&#xff08;在cmd里面使用&…

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…

乐橙云小程序插件接入HbuilderX

乐橙插件使用&#xff1a; 1.配置app.json文件&#xff0c;uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中&#xff0c;华为的品牌形象较高&#xff0c;且产品质量过硬&#xff0c;因此用户基数也大。与此同时&#xff0c;随着影响力的增大&#xff0c;华为不断向外扩张&#xff0c;也逐渐成为了海外市场的香饽饽。作为开发者和运营者&#xff0c;我们要认识到…

C#白盒测试(二)

在前两篇关于 C#白盒测试的学习博客中&#xff0c;我们已经对基础概念、常见结构测试以及一些工具的使用有了一定了解。今天&#xff0c;我们将聚焦于白盒测试中的数据驱动测试、测试替身以及如何优化测试套件&#xff0c;进一步提升我们的白盒测试能力。 一、数据驱动测试 在…

K8S疑难概念理解——容器运行时。CRI实现从Docker切为containerd历史

早期版本的k8s直接使用了docker部分功能&#xff0c;比如容器的创建、运行、监控、停止、销毁等&#xff0c;这一些与容器生命周期相关的逻辑实现就可称之为容器运行时。k8s意识到docker过于笨重&#xff0c;如docker-cli,docker swarm等组件k8s都用不上&#xff0c;那么能不能…

Vue+Vite 组件开发的环境配置(超级简单)

vite是什么 Vite 是一个现代化的前端构建工具和开发服务器&#xff0c;它特别适用于构建大型的单页面应用&#xff08;SPA&#xff09;。Vite 旨在提供极快的冷启动速度&#xff0c;并且能够即时地&#xff08;几乎实时地&#xff09;更新模块&#xff0c;这得益于其利用原生 …

vue拖拽图片

这是我封装的组件大家直接用就好 我的gitee仓库地址 拖拽(父子) 刘志辉/vue功能 - 码云 - 开源中国 //使用页面参考文档 //标签内 :imgSrc"../img/tibet-1.jpg" <!-- 设置图片路径 --> dragstart"handleDragStart" <!-- 监听拖拽开始…