做外贸网站哪家效果好基层组织建设部网站

张小明 2026/1/7 16:20:06
做外贸网站哪家效果好,基层组织建设部网站,详情页设计 制作,网站建设app哪个好用Pinia 是 Vue 官方推荐的状态管理库#xff0c;用于跨组件、跨页面共享状态#xff0c;其功能定位与 Vuex 一致#xff0c;但具备更简洁的 API 设计、更好的 TypeScript 支持#xff0c;且移除了 Vuex 中繁琐的 mutations 概念#xff0c;大幅降低了学习与使用成本。作为 …Pinia 是 Vue 官方推荐的状态管理库用于跨组件、跨页面共享状态其功能定位与 Vuex 一致但具备更简洁的 API 设计、更好的 TypeScript 支持且移除了 Vuex 中繁琐的 mutations 概念大幅降低了学习与使用成本。作为 Vuex 的替代方案Pinia 更轻量、灵活是 Vue 3 项目状态管理的首选方案。二、安装 Pinia支持 yarn、npm、pnpm 三种包管理器安装选择任意一种即可yarnaddpinia# 或使用 npmnpminstallpinia# 或使用 pnpmpnpmaddpinia安装完成后重启项目使依赖生效。三、Pinia 封装3.1 封装目的将 Pinia 实例创建、持久化插件引入等统一管理避免在 main.js 中写入过多冗余代码提升项目结构的可维护性后续持久化插件的配置将在此基础上扩展。3.2 封装步骤在src目录下创建stores文件夹约定俗成的状态管理目录并在该文件夹下创建index.js文件在index.js中创建并导出 Pinia 实例// src/stores/index.jsimport { createPinia } from “pinia”; // 引入 Pinia 核心方法const pinia createPinia(); // 创建 Pinia 实例export default pinia; // 导出实例供 main.js 注册在 main.js 中引入并使用 Pinia// src/main.jsimport { createApp } from ‘vue’;import App from ‘./App.vue’;import router from ‘./router’;import ‘./assets/reset.css’;import ElementPlus from ‘element-plus’;import pinia from ‘./stores’; // 引入封装好的 Pinia 实例// 注意此处修正原文重复 use(router) 的错误createApp(App).use(pinia) // 注册 Pinia.use(router) // 注册路由.use(ElementPlus) // 注册 ElementPlus.mount(‘#app’);四、定义 Store4.1 核心规则Store 通过defineStore()函数定义第一个参数为唯一名称id用于连接开发者工具不可重复约定将返回的 Store 函数命名为useXxxStore格式如 useUserInfoStore符合 Vue 可组合项的命名规范Store 文件建议放在stores目录下文件名见名知意如用户相关状态用 user.js。4.2 具体实现以用户状态为例在stores目录下创建user.js文件编写 Store 定义代码// src/stores/user.jsimport { defineStore } from “pinia”;// 定义并导出用户信息 Storeconst useUserInfoStore defineStore(‘userInfo’, {// state存储核心状态数据必须是函数避免跨组件共享引用问题state: () ({username: ‘赫赫’,age: 30,like: ‘girl’,obj: { money: 100, friend: 10 },hobby: [{ id: 1, name: ‘篮球’, level: 1 },{ id: 2, name: ‘rap’, level: 10 }]})});export default useUserInfoStore;五、Store 三大核心概念Pinia 的核心功能围绕 State、Getters、Actions 展开分别对应「状态数据」「派生数据」「业务逻辑」三大核心场景。5.1 State核心状态数据State 类似于组件中的 data用于存储全局共享的原始数据。5.1.1 访问 State 数据Store 实例化后可直接通过实例访问 State 数据但需注意不可直接解构 Store 实例否则会丢失数据的响应式特性。若需解构需使用 Pinia 提供的storeToRefs()方法推荐或 Vue 的toRefs()方法。template !-- 直接使用响应式数据 -- div我叫 {{ username }}今年 {{ age }} 岁喜欢 {{ like }}/div div爱好列表/div div v-foritem in hobby :keyitem.id {{ item.name }}熟练度{{ item.level }} /div button clickeditPiniaHandler逐个修改数据/button button clickeditAll批量修改数据/button button clickreplaceAll替换整个 State/button button clickresetBtn重置 State/button /template script setup import { storeToRefs } from pinia; // 引入 Pinia 响应式解构工具 import useUserInfoStore from /stores/user; // 引入用户 Store // 实例化 StoreStore 会在首次调用时创建 const userInfoStore useUserInfoStore(); // 响应式解构 State 数据推荐使用 storeToRefs const { username, age, like, hobby } storeToRefs(userInfoStore); // 错误示范直接解构会丢失响应式 // const { username, age } userInfoStore; /script5.1.2 修改 State 数据Pinia 支持 4 种修改 State 的方式根据场景灵活选择直接修改适用于单个数据的简单修改// 逐个修改数据 const editPiniaHandler () { userInfoStore.username 嘎; userInfoStore.age 1; userInfoStore.like boy; };**KaTeX parse error: Expected }, got EOF at end of input: … userInfoStore.patch({username: “鸭蛋”,age: 21,obj: { money: 200, friend: 15 } // 注意对象会被完整替换});// 若需修改对象/数组中的部分属性可使用函数形式userInfoStore.$patch((state) {state.obj.money 50;state.hobby.push({ id: 3, name: ‘游泳’, level: 5 });});};**KaTeX parse error: Expected }, got EOF at end of input: … userInfoStore.state {username: ‘狗子’,age: 22,like: ‘boy’,obj: { money: 10, friend: 1 },hobby: []};};**KaTeX parse error: Expected }, got EOF at end of input: … userInfoStore.reset();};5.2 Getters派生状态数据Getters 类似于组件中的 computed用于基于 State 派生出新数据具备缓存特性依赖的 State 未变化时多次访问会复用缓存结果。5.2.1 定义 Getters在 defineStore 中与 state 同级定义支持两种写法接收 state 参数访问状态或通过 this 访问其他 Getters。// src/stores/user.jsimport{defineStore}frompinia;constuseUserInfoStoredefineStore(userInfo,{state:()({username:赫赫,age:30,like:girl,obj:{money:100,friend:10},hobby:[{id:1,name:篮球,level:1},{id:2,name:rap,level:10}]}),// 定义 Gettersgetters:{// 基础用法通过 state 参数访问状态doubleAge:(state)state.age*2,// 进阶用法通过 this 访问其他 Getters注意不可使用箭头函数否则 this 指向异常addOneAge(){returnthis.doubleAge1;},// 传参用法返回函数实现动态传参此时缓存失效每次调用都会重新计算getHobbyById:(state)(id){returnstate.hobby.find(itemitem.idid)||未找到该爱好;},// 复杂派生计算总资产假设 money 为现金friend 为好友数量此处仅为示例totalAssets(){returnthis.obj.moneythis.obj.friend*10;}}});exportdefaultuseUserInfoStore;5.2.2 使用 Getters直接通过 Store 实例访问 Getters传参时直接调用函数并传入参数template div年龄翻倍{{ userInfoStore.doubleAge }}/div div年龄翻倍1{{ userInfoStore.addOneAge }}/div divID1 的爱好{{ userInfoStore.getHobbyById(1) }}/div div总资产{{ userInfoStore.totalAssets }}/div /template script setup import useUserInfoStore from /stores/user; const userInfoStore useUserInfoStore(); /script5.3 Actions业务逻辑封装Actions 类似于组件中的 methods用于封装业务逻辑支持同步和异步操作是修改 State 的推荐方式集中管理逻辑便于维护。与 Vuex 不同Pinia 的 Actions 可直接修改 State无需通过 mutations。5.3.1 定义 Actions在 defineStore 中与 state、getters 同级定义可通过 this 访问 Store 实例的 state、getters 和其他 actions。// src/stores/user.jsimport{defineStore}frompinia;constuseUserInfoStoredefineStore(userInfo,{state:()({/* 省略 state 定义 */}),getters:{/* 省略 getters 定义 */},// 定义 Actionsactions:{// 同步 Action接收外部参数addAge(step){console.log(接收的步长参数,step);this.agestep;// 直接修改 Statethis.updateAssets(step);// 调用其他 Action},// 辅助 Action更新资产内部调用不对外暴露updateAssets(step){this.obj.moneystep*10;},// 异步 Action模拟 API 请求asyncfetchUserInfo(){try{// 模拟网络请求2 秒延迟constresawaitnewPromise((resolve){setTimeout((){resolve({username:小明,age:25,like:coding});},2000);});// 更新 Statethis.$patch(res);returnres;// 向外返回结果}catch(error){console.error(获取用户信息失败,error);throwerror;// 抛出错误供组件捕获}},// 复杂异步场景调用其他异步 ActionasyncloadUserAndHobby(){constuserInfoawaitthis.fetchUserInfo();// 模拟加载爱好列表consthobbiesawaitthis.fetchHobbies(userInfo.username);this.hobbyhobbies;},// 模拟加载爱好列表fetchHobbies(username){returnnewPromise((resolve){setTimeout((){resolve([{id:1,name:编程,level:8},{id:2,name:健身,level:6}]);},1000);});}}});exportdefaultuseUserInfoStore;5.3.2 使用 Actions直接通过 Store 实例调用 Actions同步 Action 直接调用异步 Action 可使用 await 捕获结果或处理错误script setupimportuseUserInfoStorefrom/stores/user;constuserInfoStoreuseUserInfoStore();// 调用同步 Actionconstadd(){userInfoStore.addAge(5);};// 调用异步 ActionconstloadUserasync(){try{constresawaituserInfoStore.fetchUserInfo();console.log(获取用户信息成功,res);}catch(error){console.error(获取失败,error);}};// 调用依赖其他异步 Action 的方法constloadAllasync(){awaituserInfoStore.loadUserAndHobby();console.log(用户信息和爱好加载完成);};/script六、Pinia 持久化存储默认情况下Pinia 的 State 存储在内存中页面刷新后会丢失。通过pinia-plugin-persistedstate插件可实现 State 持久化支持 localStorage、sessionStorage 等存储方式。6.1 安装持久化插件npminstallpinia-plugin-persistedstate# 或 yarnyarnaddpinia-plugin-persistedstate# 或 pnpmpnpmaddpinia-plugin-persistedstate6.2 注册插件在之前封装的src/stores/index.js中引入并注册插件// src/stores/index.jsimport{createPinia}frompinia;// 引入持久化插件importpiniaPluginPersistedstatefrompinia-plugin-persistedstate;constpiniacreatePinia();// 注册插件pinia.use(piniaPluginPersistedstate);exportdefaultpinia;6.3 持久化配置在定义 Store 时通过persist选项配置持久化规则支持基础配置和高级配置两种方式。6.3.1 基础配置默认规则将persist设为true使用默认配置存储方式localStorage存储键名Store 的 id如 userInfo序列化/反序列化JSON.stringify / JSON.parse持久化范围整个 State// src/stores/user.jsimport{defineStore}frompinia;constuseUserInfoStoredefineStore(userInfo,{state:()({username:赫赫,age:30,like:girl}),getters:{/* 省略 */},actions:{/* 省略 */},// 开启持久化默认配置persist:true});exportdefaultuseUserInfoStore;6.3.2 高级配置自定义规则通过对象形式配置persist支持自定义存储键名、存储方式、持久化字段等核心配置项如下key自定义存储键名默认是 Store 的 idstorage指定存储方式localStorage / sessionStoragepaths指定需要持久化的字段数组形式不指定则全量持久化serializer自定义序列化/反序列化方法默认 JSON 处理。// src/stores/user.jsimport{defineStore}frompinia;constuseUserInfoStoredefineStore(userInfo,{state:()({username:赫赫,age:30,like:girl,obj:{money:100,friend:10},hobby:[]}),getters:{/* 省略 */},actions:{/* 省略 */},// 高级持久化配置persist:{key:user_info_storage,// 自定义存储键名storage:sessionStorage,// 存储方式改为 sessionStorage页面关闭后丢失paths:[username,age,obj.money],// 仅持久化 username、age、obj.money 字段// 自定义序列化/反序列化可选serializer:{serialize:(value)JSON.stringify(value),deserialize:(value)JSON.parse(value)}}});exportdefaultuseUserInfoStore;6.3.3 多 Store 独立配置每个 Store 可单独配置持久化规则互不影响。例如用户信息用 localStorage 持久化购物车用 sessionStorage 持久化// 购物车 Storesrc/stores/cart.jsimport{defineStore}frompinia;constuseCartStoredefineStore(cart,{state:()({items:[],total:0}),persist:{key:cart_storage,storage:sessionStorage,// 购物车仅在当前会话有效paths:[items]// 仅持久化商品列表}});exportdefaultuseCartStore;七、Pinia 两种定义方式对比Pinia 支持两种 Store 定义方式分别对应 Vue 的 Options API 和 Composition API 范式可根据项目需求选择7.1 两种定义方式示例// 1. Options API 风格本文默认方式结构化清晰适合 Vuex 迁移constuseUserStoredefineStore(user,{state:()({username:}),getters:{fullName:(state)Mr.${state.username}},actions:{setUsername(name){this.usernamename}}});// 2. Composition API 风格灵活度高类型推断更好适合复杂逻辑复用import{ref,computed}fromvue;import{defineStore}frompinia;constuseUserStoredefineStore(user,(){// 状态对应 stateconstusernameref();// 计算属性对应 gettersconstfullNamecomputed(()Mr.${username.value});// 方法对应 actionsconstsetUsername(name){username.valuename;};// 必须返回需要暴露的属性和方法return{username,fullName,setUsername};});7.2 核心区别对比对比维度Options API 风格Composition API 风格状态定义state 函数返回对象使用 ref/reactive 定义计算属性getters 对象定义使用 computed 函数定义方法定义actions 对象定义直接定义函数类型推断一般优秀逻辑复用较困难容易可抽离独立函数适用场景简单状态、Vuex 迁移项目复杂逻辑、TypeScript 项目八、常见问题与最佳实践8.1 常见问题问题 1解构 Store 后数据丢失响应式解答使用storeToRefs()替代直接解构该方法会为 State 数据创建响应式引用。问题 2页面刷新后 State 丢失解答开启持久化存储通过pinia-plugin-persistedstate插件配置 localStorage 存储。问题 3Actions 中 this 指向异常解答Actions 中的方法不可使用箭头函数否则 this 无法指向 Store 实例。问题 4多个组件调用同一 Action 会重复请求解答在 Action 中添加缓存逻辑例如通过标志位判断请求是否正在进行避免重复调用。8.2 最佳实践Store 拆分原则按业务模块拆分如 user.js、cart.js、setting.js避免单个 Store 过于庞大。命名规范Store 文件名、id 均使用小写下划线命名如 user_infoStore 函数名遵循useXxxStore格式。异步请求位置需要跨组件共享的数据异步请求放在 Actions 中仅组件内部使用的请求直接在组件内处理。状态修改规范复杂逻辑的状态修改统一放在 Actions 中便于维护和调试简单修改可直接操作 State。开发工具使用Pinia 内置支持 Vue DevTools可通过开发者工具查看 State 变化、回溯 Actions 调用记录提升调试效率。九、参考资料Pinia 官方文档https://pinia.vuejs.org/pinia-plugin-persistedstate 官方文档https://prazdevs.github.io/pinia-plugin-persistedstate/
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

效果好企业营销型网站建设公司wordpress 4

Unity游戏自动翻译插件:XUnity.AutoTranslator终极使用手册 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外文游戏中的语言障碍而烦恼吗?想要轻松实现游戏文本的实时翻译吗…

张小明 2026/1/7 15:47:19 网站建设

商城网站建设模板网站建设找酷风

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码获取及仿真…

张小明 2026/1/1 23:11:03 网站建设

网站安全检测软件老房装修

基于SpringBoot框架开发的化妆品推荐系统 一.系统概述本系统是一个基于SpringBoot框架开发的化妆品推荐系统,旨在为用户提供化妆品推荐、购物及个性化推荐服务,同时提供后台管理功能供管理员管理用户、化妆品、订单等数据。系统包括前台和后台两个模块&a…

张小明 2026/1/7 6:30:23 网站建设

微信关联网站企业wordpress主题下载

近年来,无人场馆正逐渐走进大众视野。无人健身房、自习室、运动馆、共享空间……深受运营者与年轻消费群体的青睐。然而当“无人化”成为标配,许多隐形成本开始显露。安全风险:陌生人尾随闯入,场馆内人身与财产存在巨大安全隐患。…

张小明 2025/12/30 6:45:25 网站建设

24小时通过网站备案企业做营销网站

LobeChat:构建私有化AI助手的现代技术实践 在生成式AI席卷全球的今天,我们不再只是惊叹于ChatGPT能写诗、编程或起草邮件。越来越多的企业和开发者开始思考一个更现实的问题:如何在享受强大语言模型能力的同时,避免将敏感数据暴露…

张小明 2026/1/1 23:35:05 网站建设

什么软件 做短视频网站好河北邯郸中考成绩公布时间

使用 Open vSwitch 构建虚拟交换基础设施 1. 网络流量处理基础 TCI(Tag Control Information)是 802.1q 报头中的一个 2 字节字段。对于带有 802.1q 报头的数据包,该字段包含 VLAN 信息,包括 VLAN ID;对于没有 802.1q 报头(即未标记)的数据包,vlan_tci 值设置为 0(0…

张小明 2025/12/27 8:32:44 网站建设