PINIA:使用设置语法时$重置替代方案

发布于 2025-01-18 05:08:44 字数 715 浏览 2 评论 0原文

我有一个使用设置语法创建的 pinia 商店,例如:

defineStore('id', () => {
  const counter = ref(0)
  
  return { counter }
})

使用设置语法一切都运行良好,因为我可以重复使用其他 pinia 商店。

然而,现在我发现需要在其他页面上重新使用 Pinia 商店,但需要重置它们的状态。

例如,在 Vuex 中,我使用 registerModuleunregisterModule 来实现拥有一个新的存储。

所以问题是:如何使用设置语法重置 pinia 存储?

注意:$reset() 方法仅针对使用对象语法定义的存储实现,因此这不是一个选项。

注意 2:我知道我可以通过创建一个函数来手动完成此操作,在该函数中将所有状态值设置为其初始值

注3:我发现$dispose 但它不起作用。如果 $dispose 是答案,那么它如何重置两个组件之间的存储?

I have a pinia store created with setup syntax like:

defineStore('id', () => {
  const counter = ref(0)
  
  return { counter }
})

Everything has been working great with setup syntax because I can re-use other pinia stores.

Now, however, I see the need to re-use Pinia stores on other pages but their state needs to be reset.

In Vuex for example, I was using registerModule and unregisterModule to achieve having a fresh store.

So the question is: How to reset the pinia store with setup syntax?

Note: The $reset() method is only implemented for stores defined with the object syntax, so that is not an option.

Note 2: I know that I can do it manually by creating a function where you set all the state values to their initial ones

Note 3: I found $dispose but it doesn't work. If $dispose is the answer, then how it works resetting the store between 2 components?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一抹微笑 2025-01-25 05:08:44

您可以使用 Pinia 插件 添加 $reset()< /code> 函数到所有商店:

  1. 在 Pinia 实例上,调用 use() 与接收 store 属性的函数。该功能是一个 Pinia 插件。

  2. 深复制 store.$state 作为初始状态。对于包含以下内容的状态,建议使用类似 lodash.clonedeep 的实用程序嵌套属性或复杂数据类型,例如 Set

  3. store.$reset() 定义为调用 store.$patch() 具有上面初始状态的深度克隆。

  4. 我们使用Object.assign使其与对象正常工作请参阅此处。当 定义 $ 时,pinia 也会以同样的方式执行自身操作重置选项 API

// store.js
import { createPinia } from 'pinia'
import cloneDeep from 'lodash.clonedeep'

const store = createPinia()
1️⃣
store.use(({ store }) => {
  2️⃣
  const initialState = cloneDeep(store.$state)
  3️⃣
  store.$reset = () => {
    store.$patch($state => {
      4️⃣
      Object.assign($state, initialState)
    })
  }
})

演示


随意阅读基于此答案的文章:如何重置使用函数/设置语法创建的存储< /a>

You can use a Pinia plugin that adds a $reset() function to all stores:

  1. On the Pinia instance, call use() with a function that receives a store property. This function is a Pinia plugin.

  2. Deep-copy store.$state as the initial state. A utility like lodash.clonedeep is recommended for state that includes nested properties or complex data types, such as Set.

  3. Define store.$reset() as a function that calls store.$patch() with a deep-clone of the initial state from above.

  4. We use Object.assign to make it work properly with objects see here. Same way pinia does itself when defining $reset for Options API.

// store.js
import { createPinia } from 'pinia'
import cloneDeep from 'lodash.clonedeep'

const store = createPinia()
1️⃣
store.use(({ store }) => {
  2️⃣
  const initialState = cloneDeep(store.$state)
  3️⃣
  store.$reset = () => {
    store.$patch($state => {
      4️⃣
      Object.assign($state, initialState)
    })
  }
})

demo


Feel free to read the article based on this answer: How to reset stores created with function/setup syntax

东京女 2025-01-25 05:08:44

您可以按照此处文档中的建议执行此操作

myStore.$dispose()

const pinia = usePinia()

delete pinia.state.value[myStore.$id]

You can do this as suggested in the documentation here

myStore.$dispose()

const pinia = usePinia()

delete pinia.state.value[myStore.$id]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文