vue3使用Pinia修改state的三种方法(直接修改,$patch,actions)

 更新时间:2024年03月13日 09:56:45   作者:Jay丶萧邦  
Vue3 Pinia是一个状态管理库,专门为Vue3设计优化,它提供了一种简单而强大的方式来管理应用程序的状态,并且与Vue3的响应式系统紧密集成,本文给大家介绍了vue3使用Pinia修改state的三种方法,需要的朋友可以参考下

本篇记录vue3 使用pinia修改state的三种方法

1. 新建vue3项目,安装Pinia(参考链接:Vue状态管理工具Pinia的安装与使用教程_vue.js_脚本之家 (jb51.net))

2.目录

app.js

import {defineStore} from "pinia"
 
const appStore = defineStore('appStore', {
    state: () => ({
        baseUrl: 'https://www.baidu.com/',
        ipList: ['192.168.10.777', '192.168.10.999', '192.168.10.888']
    }),
    actions: {
        changeState(params) {
            console.log('接收到的参数===>', params)
            this.baseUrl = params
            this.ipList.push('192.168.10.100')
        }
    }
})
 
export default appStore

第一种修改方式:直接state = '数据'  ,不推荐

    const store = appStore()
    let {baseUrl, ipList} = storeToRefs(store)
 
    /*
    *  第一种修改方式:虽然可以直接修改,但是出于代码结构来说,
    *               全局的状态管理还是不要直接在各个组件处随意修改状态,
    *               应放于 action 中统一方法修改(piain没有mutation)
    *               并不推荐!!!
    * */
    function changeData() {
      // baseUrl = 'https://www.taobao.com/'  //error 这么写是没有用的
      store.baseUrl = 'https://www.taobao.com/'  //success
      store.ipList.push('192.168.10.111')  //success
    }

第二种修改方式:使用$patch修改数据

    const store = appStore()
    // 第二种修改方式:使用$patch改变数据 $patch 可以同时修改多个值
    function changeDataByPatch() {
      /*
      $patch也有两种的调用方式
      第一种写法的在修改数组时,假如我只想要把 ipList 的中第2项改成‘192.168.10.222',
      但是也需要传入整个包括所有元素的数组,这无疑增加了书写成本和风险,显然是不合理的,所以一般都推荐使用第二种传入一个函数的写法
      * */
      // 第一种 $patch方法
      // store.$patch({
      //   baseUrl: 'https://www.jd.com/',
      //   ipList: ['192.168.10.777', '192.168.10.222', '192.168.10.888']
      // })
 
      // 第二种 $patch方法
      store.$patch((state) => {
        state.baseUrl = 'https://www.jd.com/'
        state.ipList[0] = '192.168.10.222'
      })
    }

第三种修改方式:使用actions中的方法修改数据 (推荐)

    // 第三种修改方式:调用store中的action改变数据
    function changeDataByAction() {
      store.changeState('https://www.alibabagroup.com/cn/global/home')  //可以直接给actions里面的方法传递参数
    }

以上就是使用pinia修改数据的三种方法

pinia重置数据的功能,这个操作很简单

    const store = appStore()
    // 重置数据
    function resetData() {
      store.$reset()
    }

完整代码:

<template>
  <div>
    <strong>baseUrl:</strong>
    {{ baseUrl }}
  </div>
  <div>
    <strong>ipList:</strong>
    {{ ipList }}
  </div>
  <div>
    <button @click="changeData">直接在页面组件中改变数据</button>
    <button @click="changeDataByPatch">使用$patch改变数据</button>
    <button @click="changeDataByAction">使用action改变数据</button>
    <button @click="resetData">重置数据</button>
  </div>
</template>
 
<script>
import appStore from "@/store/app"
import {storeToRefs} from "pinia"
 
export default {
  name: "Home",
  setup() {
    const store = appStore()
    let {baseUrl, ipList} = storeToRefs(store)
 
    /*
    *  第一种修改方式:虽然可以直接修改,但是出于代码结构来说,
    *               全局的状态管理还是不要直接在各个组件处随意修改状态,
    *               应放于 action 中统一方法修改(piain没有mutation)
    *               并不推荐!!!
    * */
    function changeData() {
      // baseUrl = 'https://www.taobao.com/'  //error 这么写是没有用的
      store.baseUrl = 'https://www.taobao.com/'  //success
      store.ipList.push('192.168.10.111')  //success
    }
 
    // 第二种修改方式:使用$patch改变数据 $patch 可以同时修改多个值
    function changeDataByPatch() {
      /*
      $patch也有两种的调用方式
      第一种写法的在修改数组时,假如我只想要把 ipList 的中第2项改成‘192.168.10.222',
      但是也需要传入整个包括所有元素的数组,这无疑增加了书写成本和风险,显然是不合理的,所以一般都推荐使用第二种传入一个函数的写法
      * */
      // 第一种 $patch方法
      // store.$patch({
      //   baseUrl: 'https://www.jd.com/',
      //   ipList: ['192.168.10.777', '192.168.10.222', '192.168.10.888']
      // })
 
      // 第二种 $patch方法
      store.$patch((state) => {
        state.baseUrl = 'https://www.jd.com/'
        state.ipList[0] = '192.168.10.222'
      })
    }
 
    // 第三种修改方式:调用store中的action改变数据
    function changeDataByAction() {
      store.changeState('https://www.alibabagroup.com/cn/global/home')  //可以直接给actions里面的方法传递参数
    }
 
    // 重置数据
    function resetData() {
      store.$reset()
    }
 
    return {
      baseUrl,
      ipList,
      changeData,
      changeDataByPatch,
      changeDataByAction,
      resetData
    }
  }
}
</script>

以上就是vue3使用Pinia修改state的三种方法(直接修改,$patch,actions)的详细内容,更多关于vue3 Pinia修改state的资料请关注脚本之家其它相关文章!

相关文章

  • Vue开发之watch监听数组、对象、变量操作分析

    Vue开发之watch监听数组、对象、变量操作分析

    这篇文章主要介绍了Vue开发之watch监听数组、对象、变量操作,结合实例形式分析了vue.js使用Watch针对数组、对象、变量监听相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • vue elementUI 表单校验功能之数组多层嵌套

    vue elementUI 表单校验功能之数组多层嵌套

    这篇文章主要介绍了vue elementUI 表单校验(数组多层嵌套)功能的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-06-06
  • vuedraggable实现简单拖拽功能

    vuedraggable实现简单拖拽功能

    这篇文章主要为大家详细介绍了vuedraggable实现拖拽功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue利用动态组件递归渲染实现无限深度树结构

    Vue利用动态组件递归渲染实现无限深度树结构

    这篇文章主要为大家详细介绍了Vue如何利用动态组件递归渲染实现无限深度树结构,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Vue项目打包成Docker镜像包的简单步骤

    Vue项目打包成Docker镜像包的简单步骤

    最近做时速云项目部署,需要将前端项目打成镜像文件,下面这篇文章主要给大家介绍了关于Vue项目打包成Docker镜像包的简单步骤,需要的朋友可以参考下
    2023-10-10
  • ant design vue中table表格滚动加载实现思路

    ant design vue中table表格滚动加载实现思路

    在处理一写数据量特别大的情况下,我们不能把后端的数据一次性全部拿到前端在table表格中展示,为了考虑性能优化,使用了滚动加载表格数据,这篇文章主要介绍了ant design vue中table表格滚动加载实现思路,需要的朋友可以参考下
    2024-07-07
  • 解决router.beforeEach()动态加载路由出现死循环问题

    解决router.beforeEach()动态加载路由出现死循环问题

    这篇文章主要介绍了解决router.beforeEach()动态加载路由出现死循环问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue 实现无规则截图

    vue 实现无规则截图

    这篇文章主要介绍了vue 实现无规则截图的方法,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-04-04
  • vue中路由跳转的多种方式(和$router下路由跳转的那几个方法的区别)

    vue中路由跳转的多种方式(和$router下路由跳转的那几个方法的区别)

    Vue.js是一款流行的前端JavaScript框架,它提供了多种方式来实现路由跳转,本文给大家分享vue中路由跳转的几种方式(和$router下路由跳转的那几个方法的区别),感兴趣的朋友一起看看吧
    2023-11-11
  • Vue3中的toRef和toRefs的区别和用法示例小结

    Vue3中的toRef和toRefs的区别和用法示例小结

    toRef和toRefs可以用来复制reactive里面的属性然后转成 ref,它保留了响应式,也保留了引用,也就是你从 reactive 复制过来的属性进行修改后,除了视图会更新,原有 ractive 里面对应的值也会跟着更新,本文介绍Vue3中toRef和toRefs的区别和用法,需要的朋友可以参考下
    2024-08-08

最新评论