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

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

1. 新建vue3项目,安装Pinia,不再详细描述。。。

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>

  • 21
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Vue 3和Pinia是一种结合使用的流行技术栈,其中Vue 3是一种用于构建用户界面的现代JavaScript框架,而Pinia是一个状态管理库。在Vue 3中,你可以使用TypeScript来编写代码,并且Pinia是为Vue 3而设计的状态管理库。 使用Pinia时,你可以通过创建一个Pinia实例来定义和管理应用程序的状态。Pinia提供了一种基于类的API,使你可以轻松定义和访问你的状态。使用TypeScript可以带来类型安全和智能感知,从而减少错误并提高开发效率。 要开始使用Vue 3和Pinia,你需要确保你的项目已经安装了Vue 3和Pinia的相关依赖。然后,你可以在你的代码中导入Pinia,并使用它来创建状态实例和定义状态。 下面是一个简单的示例代码,展示了如何在Vue 3中使用Pinia和TypeScript: ```typescript import { createApp } from 'vue'; import { createPinia } from 'pinia'; const app = createApp(...); // 创建一个Pinia实例 const pinia = createPinia(); app.use(pinia); // 定义一个状态 pinia.defineStore('counter', { state: () => ({ count: 0, }), actions: { increment() { this.count++; }, decrement() { this.count--; }, }, }); app.mount(...); ``` 在上面的代码中,我们首先导入了Vue和Pinia的相关模块。然后,我们使用`createApp`函数创建Vue应用实例,并使用`createPinia`函数创建Pinia实例。接下来,我们将Pinia实例通过`app.use`方法安装到Vue应用中。 然后,我们使用`pinia.defineStore`方法定义了一个名为'counter'的状态存储。在这个状态存储中,我们定义了一个名为'count'的状态属性,并且还定义了两个名为'increment'和'decrement'的异步操作来增加和减少计数器的值。 最后,我们使用`app.mount`方法Vue应用挂载到DOM元素上。 这只是一个简单的示例,Pinia还提供了许多其他功能,如模块化状态定义、插件支持等。你可以查阅官方文档以获取更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay丶萧邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值