如何在 Vue 3 Composition API 中设置 Pinia getter

2024-01-02

我正在使用 Vue 3、Composition API 和 Pinia 构建 Pokemon 过滤搜索应用程序。我正在尝试设置应用程序,以便将从 Pokemon API 获取的响应传递到 fetchPokemon() 函数内的商店(使用 Pinia 设置)。

    const fetchPokemon = () => {
      axios.get("https://pokeapi.co/api/v2/pokemon?offset=0")
      .then((response) => {
        store.addPokemon(response.data.results)
      })
    }

将响应传递到商店后, updatePokemon() 函数使用 filter 和 include 方法过滤出商店中的 Pokemon 并将其与用户输入文本字段(“state.text”)中的 Pokemon 进行匹配:

    const updatePokemon = () => {
      if(!state.text) {
        return []
      }
      return store.getState.pokemons.filter((pokemon) => 
        pokemon.name.includes(state.text)
      )
    }

执行应用程序时,我在 updatePokemon() 函数中收到以下错误:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'includes')

我假设这意味着用于搜索/过滤的 .includes() 方法不能用于此搜索。我应该如何处理过滤器并包含将商店中的神奇宝贝与用户输入的神奇宝贝进行匹配的方法?

这是代码:

皮尼亚商店

import { defineStore } from 'pinia'

export const usePokemonStore = defineStore({
    id: 'store',
    state: () => ({
        pokemons: []
    }),
    getters: {
        getState(state) {
            return state
        }
    },
    actions: {
        addPokemon(name) {
            this.pokemons.push(name)
        }
    }
})

成分

<template>
  <div class="w-full flex justify-center">
    <input type="text" placeholder="Enter Pokemon here" 
    class="mt-10 p-2 border-blue-500 border-2" v-model="text"/>
  </div>
  <div class="mt-10 p-4 flex flex-wrap justify-center">
    <div class="ml-4 text-2x text-blue-400" 
    v-for="(pokemon, idx) in filteredPokemon" :key="idx">
      <router-link :to="`/about/${getPokemonId(pokemon.name)}`">
        {{ pokemon.name }} - with id {{ getPokemonId(pokemon.name) }}
      </router-link>
    </div>
  </div>
</template>

<script>
import axios from 'axios';
import { reactive, toRefs, computed } from 'vue';
import { usePokemonStore } from '@/store';

export default {
  name: 'Home',
  setup() {

    const store = usePokemonStore()

    const state = reactive({
      text: "",
      filteredPokemon: computed(()=> updatePokemon())
    })

    const updatePokemon = () => {
      if(!state.text) {
        return []
      }
      return store.getState.pokemons.filter((pokemon) => 
        pokemon.name.includes(state.text)
      )
    }

    const fetchPokemon = () => {
      axios.get("https://pokeapi.co/api/v2/pokemon?offset=0")
      .then((response) => {
        store.addPokemon(response.data.results)
      })
    }

    fetchPokemon()

    const getPokemonId = (item) => {
      console.log(item)
      return store.pokemons.findIndex((p) => p.name === item) + 1
    }

    return { ...toRefs(state), fetchPokemon, getPokemonId, updatePokemon, store }
  }
}
</script>

UPDATED

存储 - 不执行任何操作

import { defineStore } from 'pinia'

export const usePokemonStore = defineStore({
    id: 'store',
    state: () => ({
        pokemons: []
    })
})

组件 - 没有 store.addPokemon(...)

<template>
  <div class="w-full flex justify-center">
    <input type="text" placeholder="Enter Pokemon here" 
    class="mt-10 p-2 border-blue-500 border-2" v-model="text"/>
  </div>
  <div class="mt-10 p-4 flex flex-wrap justify-center">
    <div class="ml-4 text-2x text-blue-400" 
    v-for="(pokemon, idx) in filteredPokemon" :key="idx">
      <router-link :to="`/about/${getPokemonId(pokemon.name)}`">
        {{ pokemon.name }} - with id {{ getPokemonId(pokemon.name) }}
      </router-link>
    </div>
  </div>
</template>

<script>
import axios from 'axios';
import { reactive, toRefs, computed } from 'vue';
import { usePokemonStore } from '@/store';

export default {
  name: 'Home',

  setup() {

    const store = usePokemonStore()

    const state = reactive({
      // pokemons: [],
      text: "",
      filteredPokemon: computed(()=> updatePokemon())
    })

    const updatePokemon = () => {
      if(!state.text) {
        return []
      }
      return store.pokemons.filter((pokemon) => 
        pokemon.name.includes(state.text)
      )
    }

    const fetchPokemon = () => {
      axios.get("https://pokeapi.co/api/v2/pokemon?offset=0")
      .then((response) => {
        store.pokemons = response.data.results
      })
    }

    fetchPokemon()

    const getPokemonId = (item) => {
      console.log(item)
      return store.pokemons.findIndex((p) => p.name === item) + 1
    }

    return { ...toRefs(state), fetchPokemon, getPokemonId, store }
  }
}
</script>


首先,你不需要getState at all.

您可以使用usePokemonStore().pokemons直接地。调用返回的对象usePokemonStore()功能包括:

  • 所有国家财产
  • 所有行动
  • 所有吸气剂。

以下是如何根据名称是否包含来获取过滤后的神奇宝贝数组state.text:

setup() {
  const store = usePokemonStore();
  const state = reactive({
    text: "",
    filteredPokemons: computed(() => store.pokemons.filter(
      pokemon => pokemon.name.includes(state.text)
    ))
  });
  return {
    ...toRefs(state)
  }
}

工作示例:

const { createApp, reactive, toRefs, computed, onMounted } = Vue;
const { defineStore, createPinia } = Pinia;

const usePokemons = defineStore('pokemon', {
  state: () => ({ pokemons: [] })
});
const pinia = createPinia();
createApp({
  pinia,
  setup() {
    const store = usePokemons(pinia);
    const state = reactive({
      searchTerm: '',
      filteredPokemons: computed(() => store.pokemons.filter(
        pokemon => pokemon.name.includes(state.searchTerm)
      ))
    });
    onMounted(() => {
      fetch('https://pokeapi.co/api/v2/pokemon?offset=0')
        .then(r => r.json())
        .then(r => store.pokemons = r.results)
    });
    return {
      ...toRefs(state)
    }
  }
}).mount('#app')
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script src="https://unpkg.com/vue-demi"></script>
<script src="https://unpkg.com/[email protected] /cdn-cgi/l/email-protection/dist/pinia.iife.prod.js"></script>
<div id="app">
  <input v-model="searchTerm">
  <div v-for="pokemon in filteredPokemons">
    {{ pokemon.name }}
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Vue 3 Composition API 中设置 Pinia getter 的相关文章

随机推荐

  • Msi 安装程序从命令提示符传递参数以设置服务登录

    安装程序构建工具 Microsoft Visual Studio 2010 项目安装程序 I am trying to pass username and password for the installer to use for runn
  • 如何在警报对话框中膨胀包含列表视图的布局?

    我在布局中使用带有自定义适配器的列表视图 现在我试图将包含列表的布局带到我的警报对话框中 我尝试使用此代码将不包含列表的简单布局引入警报对话框 并且效果良好 但我无法将包含布局的列表带入警报对话框 AlertDialog Builder d
  • 如何对 Delphi/C++Builder 中的设计时包进行故障排除?

    多年来 我在 Delphi C Builder 的每个版本中一直遇到 IDE 问题 我通常只是重新启动 重新编译等然后继续 然而 我不断看到其他人说 IDE 坚如磐石 我读到很多人说大多数 IDE 问题都是自定义组件问题造成的 我们有几个自
  • 如何使用html2canvas上传屏幕截图?

    Using html2canvas http html2canvas hertzen com 如何将屏幕截图保存到对象 我一直在探索演示 发现生成屏幕截图的函数生成如下 window ready function body html2can
  • C++ 函数不可用

    我有以下文件 cumsum bounded cpp include
  • 从 IP 范围到 CIDR 掩码的转换

    我一直在研究一种算法 用于将 IP 范围转换为 CIDR 表示法中的 IP 列表 此后将作为元组提及 现在 让我困惑的是弄清楚这种转换的最坏情况是什么 对于 IPv4 范围 我可以获得的最大元组数是多少 对于 IPv6 范围 我可以获得的最
  • pod 定义中的 env 变量名称重复,确定最终值的优先规则是什么?

    使用 Kubernetes 1 19 3 我使用 3 种不同的方式初始化环境变量值 envpod 定义中具有显式键 值的字段 envFrom using configMapRef and secretRef 当键名重复时 如下例所示 DUP
  • 如何在 kaminari 中设置首页的初始偏移量?

    我需要实现一些逻辑 以便在第一页上显示 3 个元素 在所有下一页上显示 1 个元素 对于第一页来说没有问题 items model limit first page items 对于接下来的所有我尝试过的 model offset firs
  • 如何在 PHP/MySQL 中存储生日和年龄以便年龄可以每天更新?

    我应该如何在 MySQL 中存储生日 以便我可以通过 Cron 作业每天轻松更新每个人的年龄 存储年龄和出生日期是否有意义 以便在进行涉及年龄的搜索时 我不必即时计算每个年龄并浪费 CPU 资源 如果是这样 我应该如何 1 存储出生日期 2
  • 如何在 HTML 中显示字符串而不换行?

    我正在为一个网站编写服务器端代码 并且我可以使用多个字符串来表示每个实体 例如 full name San Francisco Giants long name Giants medium name Giants short name SF
  • ruby 对于所有 x 是否有恒等函数,即 x.fn == x?

    有时 当我将方法名称作为参数传递时 我发现自己希望有一个恒等函数 这样any obj send identity any obj 所以代替这个 transform nil my obj my obj send transform 我可以写
  • mongoDB:通过嵌入值查找

    我在 mongoDB 方面遇到了一些问题 我寻找答案 但找不到任何东西 这解决了我的问题 db coders save name John languages php bad java good brainfuck very bad db
  • Xpages:让 FullCalendar 与引导主题一起使用

    Per 的回答是解决方案的重要组成部分 为了完整起见 这是我最终要做的 首先 我必须解决 Per 提到的 AMD 问题 然后我必须修改我的 Xpage 以确保以正确的顺序加载正确的库 其中一些是通过反复试验完成的 我必须将资源聚合设置设置为
  • python 列表元素明智条件增量

    我已经搜索了一段时间了 基本上我正在尝试按元素有条件地按另一个列表增加一个元素列表 我的代码如下 但是有更好的方法吗 列表理解 地图 我认为像 这样的逐元素运算符来自http www python org dev peps pep 0225
  • string_view 的 C++17 运算符""?

    C 17 是否包含文字后缀const char to std string view转换 auto str asdf s 请问类型str在上面的声明中是std string or std string view 如果我们相信STL的评论 h
  • 如何设置Nuxt 3中useFetch中使用的全局API baseUrl

    如何全局设置 useFetch 可组合项中使用的 baseUrl 可能是 nuxt config ts 如何避免在每次 useFetch 中定义它 您可以定义baseURL在你的nuxt config js ts像这样 import def
  • Windows 静态库检查器?

    我知道有像 PE Explorer 这样的工具可以检查 Windows 上 DLL 的内容 导出的符号等 静态库有类似的东西吗 我正在链接生成一些链接错误的第三方库 并且我想仔细检查是否确实提供了我期望的符号 Dumpbin http su
  • 使用 JavaScript 创建表

    我有一个 JavaScript 函数 它创建一个包含 3 行 2 个单元格的表格 谁能告诉我如何使用我的函数创建下表 我需要根据我的情况执行此操作 下面是我的 JavaScript 和 HTML 代码 function tableCreat
  • VS + Cordova + WP8 = requirejs 模块加载超时

    我正在使用 Visual Studio 2015 Cordova 构建 Windows Phone 手机游戏 当尝试在设备上调试时 我收到此错误 中第 8 行第 137 列未处理的异常 ms appx web net boardgameso
  • 如何在 Vue 3 Composition API 中设置 Pinia getter

    我正在使用 Vue 3 Composition API 和 Pinia 构建 Pokemon 过滤搜索应用程序 我正在尝试设置应用程序 以便将从 Pokemon API 获取的响应传递到 fetchPokemon 函数内的商店 使用 Pin