vue3全局过滤器

2025-03-16 0 23

Vue3全局过滤器

解决方案

在Vue 2中,我们可以直接使用Vue.filter()来注册全局过滤器。在Vue 3中官方移除了内置的过滤器功能,但我们可以使用计算属性、方法或者组合式API来实现类似的功能,并通过插件的形式创建全局过滤器。

思路一:使用组合式API和插件

创建过滤器函数

ts
// filters.ts
export function formatDate(date: Date) {
  return new Intl.DateTimeFormat('zh-CN').format(date)
}</p>

<p>export function toUpperCase(value: string) {
  return value.toUpperCase()
}

创建插件

ts
// filterPlugin.ts
import { App } from 'vue'
import * as filters from './filters'</p>

<p>export default {
  install(app: App) {
    Object.keys(filters).forEach(key => {
      app.config.globalProperties[<code>$${key}] = filters[key]
    })
  }
}

使用插件

ts
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import FilterPlugin from './filterPlugin'</p>

<p>const app = createApp(App)
app.use(FilterPlugin)
app.mount('#app')

在组件中使用

vue
<template>
<div>
<!-- 使用全局过滤器 -->
{{ $formatDate(new Date()) }}
{{ $toUpperCase('hello world') }}
</div>
</template>

思路二:使用自定义指令

创建指令

ts
// directives.ts
import { DirectiveBinding } from 'vue'</p>

<p>export const formatText = {
  mounted(el: HTMLElement, binding: DirectiveBinding) {
    el.textContent = (binding.value || '').toUpperCase()
  }
}

注册指令

ts
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { formatText } from './directives'</p>

<p>const app = createApp(App)
app.directive('format', formatText)
app.mount('#app')

使用指令

vue
<template>
<div v-format="'hello world'"></div>
</template>

思路三:使用计算属性或方法

组件内部实现

vue</p>


import { computed } from 'vue'

function formatPrice(price: number) {
  return `¥ ${price.toFixed(2)}`
}

const price = ref(123.456)
const formattedPrice = computed(() => formatPrice(price.value))


<p>
  <div>
    <!-- 使用计算属性 -->
    {{ formattedPrice }}</p>

<pre><code><!-- 或者使用方法 -->
{{ formatPrice(789.123) }}

这三种方式都可以很好地替代Vue 2中的全局过滤器功能,具体选择哪种方式取决于你的项目需求和个人偏好:
- 如果需要跨组件复用,建议使用种方式
- 如果只是简单的DOM文本处理,可以考虑使用自定义指令
- 如果过滤逻辑只在单个组件内使用,推荐使用计算属性或方法

需要注意的是,虽然Vue 3不再内置支持过滤器,但这些替代方案提供了更好的性能和灵活性,同时也符合Vue 3推崇的组合式API编程范式。

Image

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载