【Java Web】Pinia实现组件间数据共享

目录

一、Pinia概述

二、Pinia基本用法


一、Pinia概述

在前端工程化的开发环境中,当多个组件(.vue)文件需要使用同一个数据对象时,传统的方法可以使用组件传参或者路由传参来解决但此两种方式都有自己的缺点。pinia可以将多个组件需要共享使用的数据单独在一个.js文件中定义,然后将其数据对象导出,这样其它组件导入该数据对象之后就可以共享此由pinia定义的数据对象且此数据对象默认是响应类型的数据。

二、Pinia基本用法

步骤:

①单独创建的js文件专门定义pinia公共数据

②导入定义pinia共享数据的函数

③使用defineStore()定义公共共享的数据

④将定义的共享数据返回的实例函数导出

⑤在main.js文件中应用pinia共享的数据

⑥组件文件(.vue)中使用pinia定义的共享数据

    1、导入pinia定义的共享数据导出的函数实例

    2、调用函数实例获取其返回的pinia共享数据实例对象

    3、通过实例对象使用pinia定义的公共数据

store.js

//导入定义pinia共享数据的函数

import {defineStore} from 'pinia'

 

//定义pinia共享的数据并返回一个实例函数

const definePerson=defineStore({

    id:"personPinia",   //当前共享数据的全局唯一ID。也可以单独作为一个字符串参数作为形参1

    state:()=>{    //定义的响应式pinia共享数据

        return {

            username:"Orion",

            age:24,

            hobbies:["唱歌","跑步","打篮球"]

        }

    },

    getters:{   //定义pinia共享数据的get方法,只能获取值

        getAge(){

            return this.age

        },

        gethobbiesCount(){

            return this.hobbies.length

        }

    },

    actions:{   //定义pinia共享数据的修改方法(也可以使用箭头函数,但访问数据时需要传入state作为形参)

        doubleAge(){

            return this.age*=2

        }

    }

   })

//将定义好的pinia共享数据返回的函数导出

export {definePerson}

main.js

 

import { createApp } from 'vue'

import App from './App.vue'

import route from './routers/router'

let app=createApp(App)

app.use(route)

//开启全局的pinia共享数据的功能

import { createPinia } from 'pinia'

//创建pinia实例供应用使用,使各组件文件都能获取pinia共享的数据

const pinia = createPinia()

//应用pinia定义的共享数据

app.use(pinia)

app.mount('#app')

App.vue

<template>

  <div>

        <router-link to="/operate">Operation</router-link><br>

        <router-link to="/list">List</router-link>

        <hr>

        <router-view></router-view><hr>

        <router-view name="List"></router-view>

  </div>

</template>

Operation.vue

 

<script setup>

//导入pinia导出的共享函数

import { definePerson } from '../store/store';

let person=definePerson()   //获取pinia共享数据,返回其对象

</script>

<template>

  <div>

      <h2>操作pinia定义的状态数据</h2>

      用户名:<input type="text" v-model="person.username"><br>

      年龄: <input type="text" v-model="person.age"><br>

      爱好:  <input type="checkbox" value="唱歌" v-model="person.hobbies">唱歌

             <input type="checkbox" value="跳舞" v-model="person.hobbies">跳舞

             <input type="checkbox" value="跑步" v-model="person.hobbies">跑步

             <input type="checkbox" value="打篮球" v-model="person.hobbies">打篮球

             <input type="checkbox" value="睡觉觉" v-model="person.hobbies">睡觉觉

             <br>

      <label v-text="person.getAge"/><br>

      <label v-text="person.gethobbiesCount"/><br>

      <button v-on:click="person.doubleAge">年龄加倍*2</button><br>

      <button v-on:click="person.$reset()">pinia内置函数恢复默认值</button><br>

      <button @click="person.$patch({username:'关山月',age:100,hobbies:['唱','跳','rapper','干饭哈!']})">一次修改多个值</button>

      <hr>

      {{ person }}

  </div>

</template>

 

List.vue

 

<script setup>

import { definePerson } from '../store/store';

let person = definePerson();

</script>

<template>

  <div>

      <h2>展示pinia定义的公共数据</h2>

      用户名:{{person.username}}<br/>

      年龄:{{person.age}}<br/>

      年龄:{{person.hobbies}}<br/>

      getAge函数:{{person.getAge}}<br/>

      gethobbiesCount函数:{{person.gethobbiesCount}}<br/>

  </div>

</template>

 

router.js

//导入定义路由相关的函数

import {createRouter,createWebHashHistory} from 'vue-router'

import Operation from '../components/Operation.vue'

import List from '../components/List.vue'

const route = createRouter({

    history:createWebHashHistory(),

    routes:[

        {

            path:'/operate',

            component: Operation

        },

        {

            path:'/',

            components:{

                default:Operation,

                List:List

            }

        },

        {

            path:'/list',

            component:List

        }

    ]

})

 

export default route

 

运行效果图

 

 

@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024热门骨传导蓝牙耳机怎么选?超全的选购攻略附带好物推荐!

对于很多喜欢运动健身的小伙伴&#xff0c;在现在市面上这么多种类耳机的选择上&#xff0c;对于我来说的话还是很推荐大家去选择骨传导运动耳机的&#xff0c;相较于普通的入耳式蓝牙耳机&#xff0c;骨传导耳机是通过振动来传输声音的&#xff0c;而入耳式耳机则是通过空气传…

餐饮冷库安全守护神:可燃气体报警器检定的科学性与有效性

随着餐饮业的快速发展&#xff0c;冷库成为储存食材、保证食品质量的重要场所。 然而&#xff0c;由于冷库环境的特殊性&#xff0c;如密封性强、温度低、湿度大等&#xff0c;一旦冷库内发生可燃气体泄露&#xff0c;后果将不堪设想。因此&#xff0c;在餐饮冷库中安装并合理…

武汉星起航:自运营团队深耕亚马逊,智慧运营打造跨境电商新标杆

在全球化的浪潮下&#xff0c;跨境电商已成为企业拓展海外市场的重要渠道。而亚马逊作为全球领先的电商平台&#xff0c;其巨大的市场潜力和成熟的运营体系吸引了无数卖家竞相入驻。武汉星起航电子商务有限公司正是众多成功入驻亚马逊的卖家之一&#xff0c;其自运营团队凭借多…

使用Python Selenium,动态网页不再是难题!

目录 1、直接执行JS代码 🌐 1.1 execute_script基础用法 1.2 带参数执行JS函数 1.3 获取执行结果 2、使用execute_async_script异步执行 🔄 2.1 适用场景分析 2.2 实现异步操作示例 2.3 错误处理与调试技巧 3、JS与页面元素交互 👤 3.1 修改DOM属性 3.2 触发事…

独立开发者系列(10)——fastadmin后台框架的认识

软件开发项目涉及到的东西非常多&#xff0c;作为独立开发者&#xff0c;普遍性的面对的是中小项目。而其中接单的情况下&#xff0c;以WEB方向的居多。其中主要有以下这么些类的:搭建官网cms 就是常见的资讯发布平台&#xff0c;发布一些企业新闻/活动宣传&#xff0c;纯粹是…

鸿蒙期末项目(3)

服务器搭建完成之后&#xff0c;编写了诸多api用于数据传输工作&#xff08;略&#xff09; 编写完成之后&#xff0c;回到鸿蒙开发工具&#xff0c;开始编写搜索页面的代码。 打开搜索页面时&#xff0c;先会展示历史搜索记录&#xff08;如果有的话&#xff09;&#xff0c;…

爬取必应关键字搜索结果url

上代码 import aiohttp import asyncio from lxml import etree import aiofiles import time import random aiohttp 和 asyncio 用于异步HTTP请求和事件循环。 lxml 用于解析HTML。 aiofiles 用于异步文件操作。 time 和 random 用于控制爬取速度。 headers {User-Agent: M…

mysql安装创建数据库防止踩坑

为了安装MySQL的家人们走弯路&#xff0c;稍微有些啰嗦&#xff0c;讲述我安装的时遇到的问题&#xff0c;如何解决。仔细看看离成功不远。 mysql下载链接 MySQL :: Download MySQL Community Server windows下安装mysql-8.0.29-winx64&#xff0c;下载安装包后解压到文件夹中…

2024十大首码地推拉新app平台,一手首码对接平台!

到了2024年&#xff0c;地推新应用的接单平台成为创业者们关注的焦点。对于地推行业的从业人员而言&#xff0c;选择一家拥有一手单资源的平台至关重要&#xff0c;因为这直接关系到他们的利益。 2024年如果想要进行app地推活动&#xff0c;却没有人脉渠道的困扰&#xff0c;建…

谷歌网络营销中SEO的策略有哪些?

在网络营销中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是一种关键策略&#xff0c;旨在提高网站在搜索引擎结果中的排名。首先&#xff0c;要进行关键词研究&#xff0c;找出潜在客户使用的搜索词。接下来&#xff0c;优化网站内容&#xff0c;使其包含这些关键词&…

【Java Web】Ajax异步请求

目录 一、Ajax概述 二、Ajax执行原理 三、实现Ajax的请求 一、Ajax概述 传统情况下&#xff0c;浏览器与服务端的交互都是采用同步交互的方式进行的&#xff1b;此交互方式用户在向服务端发送请求后只有等到服务端的响应报文回来后用户才能在标签页上进行其它操作&#xff0c;即…

openlayer 鼠标点击船舶,打开船舶简单弹框

背景&#xff1a; 对创建的地图对象&#xff0c;可以添加上监听事件&#xff0c;常用的有&#xff1a;地图点击事件、鼠标移动事件。 通过监听这些事件&#xff0c;又可以区分不同图层的不同要素&#xff0c;获取不同数据&#xff1b; 根据这些数据&#xff0c;又可以发起网络请…

电脑的D盘E盘F盘突然消失了 电脑只剩下C盘了其他盘怎么恢复

现如今随着时代的发展&#xff0c;无纸化办公成为主流&#xff0c;这主要归功于电脑&#xff0c;能够通过电脑完成的工作绝不使用纸质文件&#xff0c;这不仅提高了工作效率&#xff0c;也让一些繁杂的工作变的更加简单。不过电脑毕竟是电子产品&#xff0c;不可避免的会出现一…

【包邮送书】深度学习与信号处理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

win11家庭版没有gpedit解决

1、右键桌面&#xff0c;新建记事本&#xff0c;把后缀名txt修改成bat 2、输入以下命令&#xff1a; echo offdir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txtdir /b C:\Windows\servicing\Packages\Micr…

electron-builder创建桌面应用

一、利用vue-cli创建vue项目 创建electron方式有很多&#xff0c;这里说的是vuecli创建的项目&#xff0c;通过安装electron-builder插件创建 也可以通过electron-vite构建项目 &#xff1a; https://cn.electron-vite.org/guide/ vue-cli构建 vue create XXX项目名 //按提示操…

cad怎么导出为图片?分享四种导出方法

cad怎么导出为图片&#xff1f;在工程设计、建筑设计、机械设计等领域&#xff0c;CAD图纸的编辑和分享是一项日常工作。然而&#xff0c;如何将CAD图纸高效、准确地导出为图片格式&#xff0c;一直是设计师们关注的焦点。今天&#xff0c;就为大家推荐四款强大的CAD导出图片软…

Ubuntu 20.04安装显卡驱动、CUDA、Pytorch(2024.06最新)

文章目录 一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中&#xff0c;禁用X…

Java毕业设计 基于SSM vue药店管理系统小程序 微信小程序

Java毕业设计 基于SSM vue药店管理系统小程序 微信小程序 SSM 药店管理系统小程序 功能介绍 用户 登录 注册 首页 药品信息 药品详情 加入购物车 立即购买 收藏 购物车 立即下单 新增收货地址 我的收藏管理 用户充值 我的订单 留言板 管理员 登录 个人中心 修改密码 个人信息…

196.每日一题:检测大写字母(力扣)

代码解决 class Solution { public:bool detectCapitalUse(string word) {int capitalCount 0;int n word.size();// 统计大写字母的数量for (char c : word) {if (isupper(c)) {capitalCount;}}// 检查是否满足三种情况之一if (capitalCount n) {// 全部字母都是大写return…