首页 > 其他分享 >vue3使用pinia仓库解构赋值响应式丢失的解决方式

vue3使用pinia仓库解构赋值响应式丢失的解决方式

时间:2024-10-15 21:24:50浏览次数:1  
标签:count const 解构 pinia vue3 import count2 store

代码

  • store
import { defineStore } from "pinia";
import { ref } from "vue";

export const useMyTestStore = defineStore('mytestStore', () => {
  // state
  const count = ref(0);

  const count2 = ref(1);

  const increment2 = () => {
    count2.value++;
  };

  const increment = () => {
    count.value++;
  };

  return {
    count,
    count2,
    increment,
    increment2
  };
});
  • 使用方式1,直接解构,结果是不能响应式
<template>
  <div>
    <h1>Count: {{ count }}</h1>
    <button @click="increment">Increment</button>
    <div>
      {{ count2 }}
    </div>
  </div>
</template>

<script setup>
import { ref, reactive, computed, onMounted, nextTick } from 'vue';
import { useMyTestStore } from './store/mytestStore';

const { count, increment } = useMyTestStore();


// 打印出来不是一个ref对象,会失去响应式,打印出来直接是值
console.log(count, "slkfjsdlfjsldfjsd")

const count2 = computed(() => {
  return count
})

console.log(count2.value, "sdfsdfsdfsfcvxcsfsdf")


// 打印出来是一个proxy对象
console.log(useMyTestStore(), "slfjsldfjslfjsldfjsljnvsld")



</script>
  • 正确使用的几种方式可以store 响应式
<template>
  <div>
    <h1>Count: {{ count }}</h1>
    <button @click="increment">Increment</button>
  </div>
  <div>
    <h1>Count2: {{ count2 }}</h1>
    <button @click="increment2">Increment</button>
  </div>
  <div>
    count3: {{ count3 }}
  </div>
  <div>
    <!-- 直接读取store的变量也可以响应式 -->
    count4: {{ store.count2 }}
  </div>
</template>

<script setup>
import { ref, reactive, computed, onMounted, nextTick } from 'vue';
import { storeToRefs } from "pinia"
import { useMyTestStore } from './store/mytestStore';

const store = useMyTestStore();
// 加上storeToRefs解构store的数据才不会失去响应式
const { count, count2 } = storeToRefs(store);
// 方法需要直接解构
const { increment, increment2 } = store;

console.log(count, "count")

// computed 读取store的自变量也可以响应式
const count3 = computed(() => store.count2)




</script>

总结

这篇文章讨论了在 Vue 3 中使用 Pinia 时,解构赋值导致响应性丢失的问题,并提供了解决方案。以下是文章的主要内容总结:

问题描述

在使用 Pinia 作为状态管理库时,通过解构赋值获取 store 中的状态可能会导致这些状态失去响应性。这是因为解构赋值会创建原始数据的浅拷贝,而这些拷贝并不是响应式的。

解决方案

  1. 使用 storeToRefs

    • 通过 storeToRefs 函数将 Pinia store 中的状态转换为响应式引用。即使通过解构赋值获取状态,这些状态仍然保持响应性。
    import { defineComponent } from 'vue';  
    import { useStore } from './stores/yourStore';  
    import { storeToRefs } from 'pinia';  
    
    export default defineComponent({  
      setup() {  
        const store = useStore();  
        const { someState, anotherState } = storeToRefs(store);  
    
        return {  
          someState,  
          anotherState,  
        };  
      },  
    });
    
  2. 使用 computedwatch

    • 如果需要基于 store 中的状态计算新值或监听这些状态的变化,可以使用 Vue 的 computedwatch。这虽然不是直接解决解构赋值响应性丢失的问题,但提供了另一种处理响应性数据的方法。
    import { defineComponent, computed } from 'vue';  
    import { useStore } from './stores/yourStore';  
    
    export default defineComponent({  
      setup() {  
        const store = useStore();  
        const computedValue = computed(() => store.someState + 1);  
    
        return {  
          computedValue,  
        };  
      },  
    });
    
  3. 直接访问 Store 属性

    • 如果不涉及解构赋值,直接在模板或计算属性中访问 store 的属性,这些属性自然是响应式的。
    <template>  
      <div>{{ store.someState }}</div>  
    </template>  
    
    <script>  
    import { defineComponent } from 'vue';  
    import { useStore } from './stores/yourStore';  
    
    export default defineComponent({  
      setup() {  
        const store = useStore();  
        return { store };  
      },  
    });  
    </script>
    

标签:count,const,解构,pinia,vue3,import,count2,store
From: https://www.cnblogs.com/jocongmin/p/18468482

相关文章

  • Vue3 + Openlayers10示例 台风轨迹和台风圈
    前言假装已经完成了vue3和Openlayers10开发环境的搭建,如果有需要,可搜索vue+Openlayers环境搭建的相关文章。本示例基于Vue3和Openlayers10的环境,实现台风轨迹和台风圈的效果。一、安装插件安装Element-plus插件,其实只在台风列表的地方用到了el-checkbox,可根据实际需......
  • vue3+h5+echarts引入折线图
     实现效果:1.引入echarts,在终端输入命令npminstallecharts--save2.安装成功后直接复制以下代码即可<template><divref="chartDom"class="echart"id="main"></div></template><scriptsetup>import{onMounted,......
  • vue3+vite+ts+vue3-qr-reader实现移动端h5+pc端调起摄像头核销二维码
    1、首先我们看示例图:h5:pc:  2、我们开始做第一步就是装依赖:yarnadd vue3-qr-reader或者npminstall vue3-qr-reader我记得装完后还需要装一个 yarnadd-Dsass 3、封装一个组件公用:组件位置你们自己定我写在了components/QrScanner/ind......
  • 在Vue3中使用vuex
    Vuex简介Vuex是Vue.js官方的状态管理库,帮助我们在中大型应用中集中管理组件间的共享状态。它通过state、getters、mutations和actions实现响应式数据管理Vuex核心概念State:全局状态,存储应用的核心数据。Getters:类似于组件中的计算属性,用于从state中派生出......
  • Vue3 路由(上)
    路由器两种模式history模式:constrouter=CreateRouter({history:createWebHistory(),//history模式})优点:url更加美观,不带有#,更接近传统网站的url缺点:后期项目上限,需要配合服务端处理路径问题,否则刷新会404错误hash模式:constrouter=CreateRouter({histor......
  • nbsaas vue3管理后台框架
    nbsaasvue3管理后台框架一、项目概述NbsaasAdminVue是一个基于Vue.js3.0构建的轻量级后台管理系统,结合了现代前端技术栈的最佳实践,旨在帮助开发者快速构建具有高可扩展性和良好用户体验的后台管理系统。该项目拥有简洁的UI设计,强大的功能模块,支持多种自定义配置,......
  • vue3中的defineProps,defineEmits,defineExpose的使用详解
    defineProps 和 defineEmits 都是只能在 <scriptsetup> 中使用的编译器宏。他们不需要导入,且会随着 <scriptsetup> 的处理过程一同被编译掉。defineProps 接收与 props 选项相同的值,defineEmits 接收与 emits 选项相同的值,它们具备完整的类型推断并且在scriptse......
  • vue3 antvX6的使用源码
    npminstall--save@antv/x6<template><divclass="dashboard-container"><p>选择节点</p><button@click="save">保存</button><divclass="antvBox"><divclass="m......
  • vue3 做个点击拖拽的的按钮
    //视图层<divclass="regularAI"ref="draggableDiv":style="{top:`${position.y}px`,left:`${position.x}px`}"> <span@mousedown="startDrag">{{isDragging?'拖拽中':'点击拖拽'}}</span&......
  • adminPage-vue3依赖 v1.2.0新增组件 DetailsModule说明文档
    adminPage-vue3依赖v1.2.0新增组件DetailsModule说明文档引入思路介绍DetailsModuleAPI汇总属性插槽自定义对象config(array<object\>/object类型)config.list(array<object\>类型)使用基础使用范例config-titleconfig-moduleKeyconfig-listconfig-list-slotNamec......