标签: pinia

Pinia w/ Vue3:在模板中使用操作返回 funcName 不是函数

在 Vue3 中的模板中使用 Pinia 操作可以给出

未捕获的类型错误:$setup.[storeName].[actionName] 不是函数

我做错了什么还是预期的行为?似乎没有其他人有同样的问题。谷歌搜索没有透露任何信息。

我正在使用新组件

vuejs3 pinia

6
推荐指数
1
解决办法
6098
查看次数

从参数化 getter 访问 getter

太长了;博士

如何从参数化 getter 访问其他 getter?通常,您可以使用this.myGetter; 但是参数化的 getter 是作为箭头函数实现的,其中this是未定义的。在 Pinia 处理此案的首选方式是什么?


我想multiSum在我的 Pinia 商店中创建一个参数化 getter ( ),它访问另一个 getter ( sum)。

getter 可以通过 访问this,但是在用于实现参数化 getter 的箭头函数中不起作用:multiSum崩溃,因为this位于undefined嵌套箭头函数的上下文中。

getters: {
  sum: (state) => state.a + state.b,
  multiSum: (state) => (count) => this.sum * count // crash: this is undefined
}
Run Code Online (Sandbox Code Playgroud)

在 Vuex 中,参数化 getter 可以通过参数而不是 来访问其他 getter this,这也适用于箭头函数。但据我所知,Pinia 中不存在此 API。

我可以通过捕获商店实例来解决这个问题:

multiSum(state) {
  const store = this
  return …
Run Code Online (Sandbox Code Playgroud)

javascript vue.js pinia

6
推荐指数
1
解决办法
8476
查看次数

将无功(参考)值存储在 pinia 中

我有一个反应值,我想将其存储在 pinia 商店中。

const data = ref({});
async function loadData() {
  fetch("...")
    .then((res) => res.json())
    .then((json) => (data.value = json));
}
loadData();

const myDataStore = useMyDataStore();
const { myData } = storeToRefs(myDataStore);

// Here I want to store data in the store, reactively
myData.value = data.value;
Run Code Online (Sandbox Code Playgroud)

但当我这样做时,反应性就会消失。如何将值存储在商店中,以便myData每次更新时data都会更新?

vue.js vue-reactivity pinia

6
推荐指数
1
解决办法
2万
查看次数

Vue Pinia 如何更新对象内的属性

我正在使用pinia并且我想知道如何更新对象内的属性。我在 中有一个对象数组state.cart,其中是一些产品,它们都有一个名为 的属性quantity。该属性可以更改,因此我需要“更新”购物车数据。

这是我尝试过的:

state: () => ({
   cart: []
}),

actions: {
  updateQuantityOfProduct(product, val) {
    const prod = this.cart.find((item) => item.id === product.id)
    prod.quantity = val
    this.$patch({
      cart: this.cart,
    })
  },
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,因为购物车未更新和/或当我刷新时,尚未添加更新/更改(产品数量与更改前相同)

我该如何解决这个问题以及我做错了什么?

javascript vue.js vuejs3 pinia

6
推荐指数
1
解决办法
3413
查看次数

Vue 3 + Pinia 中的业务逻辑

假设我有一个使用 Vue 3 的简单网上商店应用程序。每当用户将商品添加到购物车时,我都会将其存储在 Pinia 本地,并将此事件信息发送到后端。

默认情况下,我会向 Pinia 存储添加一个操作,例如addItemToCart()更新本地cartItems反应变量,并将请求发送到后端,例如POST http://localhost/api/update-cart.

我的想法是在我的应用程序中引入一个服务层。我会创建一个类似的服务:

const useCartService = () => {
  const cartStore = useCartStore()

  const updateCartApi = useUpdateCartApi()

  const addItemToCart = async (item) => {
    cartStore.loading = true

    await updateCartApi.mutate(item)

    cartStore.items.push(item)

    cartStore.loading = false
  }

  return {
    loading: cartStore.loading,
    
    addItemToCart,
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样将业务逻辑与 Pinia 商店分开有意义吗?它是否被视为一种反模式,或者这种方法在 Vue 中常用?

vue.js nuxt.js vuejs3 pinia

6
推荐指数
0
解决办法
1742
查看次数

在 Nuxt 3 中使用 Pinia 保持状态

我正在尝试使用 package 来保留新 Nuxt 3 应用程序中变量的状态pinia-plugin-persistedstate

我已经实施了nuxt 3指南中提供的步骤:

  1. 创建了/plugins/persistedstate.ts文件。
  2. persist: true在商店文件中添加了选项。

但什么也没发生。每当我刷新页面时,存储值就会丢失。

有人可以帮我理解这里的问题是什么吗?另外,如果有人使用过该软件包,请分享我在实施时可能缺少的步骤。

nuxtjs3 pinia

6
推荐指数
1
解决办法
9121
查看次数

将 Pinia 与 Vue.js Web 组件结合使用

问题已更新

我正在尝试将Pinia的商店与使用Vue.js创建的 Web 组件一起使用,但控制台中出现以下错误:

[Vue 警告]:在 <HelloWorld.ce msg="message"> 处找不到注入“Symbol(pinia)”

我有一个非常简单的例子。

  1. 主要.ts
import { defineCustomElement } from 'vue'
import HelloWorld from './components/HelloWorld.ce.vue'

const ExampleElement = defineCustomElement(HelloWorld)
customElements.define('hello-world', ExampleElement)
Run Code Online (Sandbox Code Playgroud)
  1. 商店.ts
import { defineStore, createPinia, setActivePinia } from "pinia";

setActivePinia(createPinia());

export const useCounterStore = defineStore('counter', {
  state: () => ({
    counter: 0,
  }),

  actions: {
    increment() {
      this.counter++;
    },
  },
});
Run Code Online (Sandbox Code Playgroud)
  1. HelloWorld.ce.vue
<script setup lang="ts">
import { ref } from 'vue'
import { useCounterStore } from '../store.ts'

defineProps<{ msg: string …
Run Code Online (Sandbox Code Playgroud)

store web-component vue.js vue-component pinia

6
推荐指数
1
解决办法
1514
查看次数

运行 useFetch SSR(服务器端),但我看到 XHR 请求客户端

我将 Nuxt3 与 Pinia 结合使用。在 pinia 中,我有一个功能来授权用户,例如:

async login (credentials: User) {      
  
var requestOptions = {
  method: 'POST',
  body: {
    email: 'test@test.com',
    password: 'testpass'
  }
};
  const { data: user }: any = await useFetch('https://endpoint.com/api/user/create-token', requestOptions)
  console.log(user.value.result.token)

  JwtService.saveToken(user.value.result.token)
},
Run Code Online (Sandbox Code Playgroud)

当我从端点获得令牌时,一切正常。问题是; 我希望这个 fetch POST 在服务器上触发,而不是在客户端上触发。目前我在我的客户端中看到了 XHR。如何解决这个问题?

应用程序作为 SSR 运行。

nuxt.js nuxtjs3 pinia

6
推荐指数
0
解决办法
635
查看次数

Vitest 设置 Nuxt 和 pinia 自动导入

我正在尝试设置vitest+,@vue/test-utils但我无法测试一些使用ref(Vue)或useCookie(Nuxt)的组件,我对 Pinia 也有同样的问题,我在 nuxt.config.js 中全局导入 2 个函数,如下所示

[
  '@pinia/nuxt',
  {
    autoImports: ['defineStore', 'acceptHMRUpdate'],
  }
] 
Run Code Online (Sandbox Code Playgroud)

这是我的 vitest.config.js 设置:

import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import AutoImport from 'unplugin-auto-import/vite'
import path from 'path'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue'],
      dirs: ['./composables/']
    })
  ],
  test: {
    globals: true,
    environment: 'jsdom',
    coverage: {
      provider: 'c8',
      reporter: 'html',
      reportsDirectory: './coverage'
    },
  resolve: {
    alias: {
      '~': path.resolve(__dirname, './')
    } …
Run Code Online (Sandbox Code Playgroud)

nuxt.js pinia vitest

6
推荐指数
1
解决办法
3503
查看次数

如何在输入的 v 模型上使用 pinia 存储 getter?

在我的应用程序中,我正在努力存储用户表单响应。我创建了 pinia 商店并创建了每个表单对象。使用这个存储到我的组件中并将该存储的 getter 函数传递到变量中,

我将这个变量用作 v 模型。给出输入后也不会返回任何内容。我也没有收到任何错误。我是否遵循了任何错误的方法?

用户存储.js

    import { defineStore } from 'pinia';
    
    export const userResponses = {
      formsResponses: {
        form1: {
          input1: '',
        },
      },
    };
    
    export default defineStore('userStore', {
      state() { return userResponses; },
    
      getters: {
        getFormsInput: (state) => state.formsResponses.form1,
      },
      actions: {
        setFormsResponses(formResponses) {
          this.formsResponses.form1 = formResponses;
        },
      },
    });
Run Code Online (Sandbox Code Playgroud)

Form1.vue

  <template>
    <input type="text" name="input_form" v-model="input"/>
    <button type="Primary" @click="submit">submit</button>
  </template>
    
    <script setup>
    import { computed, ref } from 'vue';
    import useUserStore from '@/store/userStore';
    
    
    const userStore …
Run Code Online (Sandbox Code Playgroud)

javascript vue.js vuejs3 pinia

6
推荐指数
1
解决办法
6392
查看次数