【问题标题】:Create a global filter in Vue 3 using TypeScript使用 TypeScript 在 Vue 3 中创建全局过滤器
【发布时间】:2025-12-05 05:00:01
【问题描述】:

我正在关注此course on Udemy,但其内容已过时,因此我无法按照作者创建全局过滤器所遵循的相同步骤。

它看起来像来自 Vue 3 文档,filters are no longer supported

我在这里尝试做的事情相当简单,只需将价格作为数字并将其作为字符串美元价格返回,例如:取100 并返回$100

这对我不起作用。 我的main.ts 看起来像这样:

import { createApp } from "vue";
import { Vue } from 'vue-class-component';
import { viewDepthKey } from "vue-router";
import App from "./App.vue";
import router from "./router";
import store from "./store";

Vue.filter('price', function(input: number){
  if(isNaN(input)){
    return "-";
  }
  return '$' + input.toFixed(2);
})

createApp(App)
  .use(store)
  .use(router)
  .mount("#app1");

这是错误:

src/main.ts:8:5
TS2339: Property 'filter' does not exist on type 'VueConstructor<Vue<unknown, {}, {}>>'.
     6 | import store from "./store";
     7 |
  >  8 | Vue.filter('price', function(input: number){
       |     ^^^^^^
     9 |   if(isNaN(input)){
    10 |     return "-";
    11 |   }

这就是我尝试在模板中使用它的方式:

{{ item.product.price | price }}

有没有办法让它工作或者我应该使用一些computed property

编辑后续问题:

我的班级是这样的:

<script lang="ts">
import { Options, Vue } from "vue-class-component";
import { IProductInventory } from "@/types/Product";
import format from "@/helpers/format";

@Options({
    name: "Inventory",
    components: {}
})
export default class Inventory extends Vue{
    inventory:IProductInventory[] = //Coming from an api call
}
</script>

谢谢!

【问题讨论】:

  • 你可以制作一个格式函数库,只需使用{{ format.price(item.product.price) }}

标签: typescript vue.js vuejs3


【解决方案1】:

在 Vue 3 中删除了过滤器选项,因此您可以使用计算属性返回一个带参数的函数:

    get formatPrice(): string{
        return (price)=>{
             if(isNaN(input)){
               return "-"
             }else{
              //return other value
              }
      }
   }

而不是{{ item.product.price | price }},您将拥有:

{{ formatPrice(item.product.price) }}

【讨论】:

  • 非常感谢您的回复。如果我也想从其他组件访问它,我怎样才能让它在全球范围内可用?
  • 另外,我在return (price) =&gt; { 线上遇到了 2 个错误,它们是:1.Type '(price: any) =&gt; string' is not assignable to type 'string'.Vetur(2322) 和 2.Parameter 'price' implicitly has an 'any' type.Vetur(7006)
【解决方案2】:

./helpers/filters.ts

const filters = {
  price(input: number) {
    if (isNaN(input)) {
      return "-";
    }
    return '$' + input.toFixed(2);
  }
}
export default filters;

在您创建应用的地方全局安装它...

import filters from './helpers/filters'

const app = createApp(App);
app.config.globalProperties.$filters = filters
app.mount('#app')

那就做吧

{{ $filters.price( price ) }}

【讨论】:

  • 我来自像 C# 这样的语言,它的一切都非常直观,运行起来非常漂亮,我很惊讶地看到这个 JS/TS 世界是多么粗糙! :) 我现在收到此警告:[Vue warn]: Property "format" was accessed during render but is not defined on instance。 Intellisense 也显示了这一点:'format' is declared but its value is never read.Vetur(6133) 在这条线上 import format from "@/helpers/format";。刚刚编辑了我的问题以显示我的班级的样子。
  • 你能帮我解决这个问题吗?我仍然无法让它工作。
  • 已更新,如果需要,还应该可以扩展到更多过滤器
  • 感谢您的回复,但还是不行。我当前的设置与createApp(App).use(store).use(router).mount("#app1"); 这一行一起提供,但我对其进行了编辑以使其看起来像你的,但它仍然无法正常工作。如果您可以帮助我快速浏览一下我的代码,请这样做,我将非常感激。在这里:github.com/affableashish/solar-coffee/tree/master/…