vue3如何设置全局过滤器、app.config.globalProperties如何使用配置

Vue3使用app.config.globalProperties注册全局属性
博客介绍了Vue3中替代Vue2里filter的方法,即通过app.config.globalProperties注册全局可访问的属性。说明了其使用方法,还提到若全局属性与组件自身属性冲突,组件属性优先级更高,若代码添加后报错,可重启VSCode。

vue3 相比于 vue2 取消了很多的API, filter就在其中,但是我们可以使用其他方法替代vue2中的filter

通过 app.config.globalProperties 来注册一个全局都能访问到的属性

我们再来说说 app.config.globalProperties 是什么,如何使用,下面是官方给出的相关解释:

链接: vue官方文档
在这里插入图片描述

注意点:如果全局属性与组件自己的属性冲突,组件自己的属性将具有更高的优先级。
具体使用方法:
// main.js页面进行设置

const app = createApp(App);
type TestType 
<think> 我们正在将Vue2代码升级到Vue3。在Vue3中,全局API和应用程序实例的使用方式发生了变化。我们需要检查转换后的代码是否符合Vue3的规范。 原始Vue2代码: ```javascript import Vue from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).$mount(&#39;#app&#39;) Vue.filter(&#39;globalFilterArray&#39;, function (value) { return value.map(item => item * 3) }) Vue.filter(&#39;globalFilterArrayTest&#39;, function (value, arg) { return value.map(item => item * arg) }); ``` 转换后的Vue3代码: ```javascript import * as Vue from &#39;vue&#39; import { h, createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; const app = createApp(App) app.use(store) app.use(router) ;( app.config.globalProperties.$filters || (app.config.globalProperties.$filters = {}) ).globalFilterArray = function (value) { return value.map((item) => item * 3) } ;( app.config.globalProperties.$filters || (app.config.globalProperties.$filters = {}) ).globalFilterArrayTest = function (value, arg) { return value.map((item) => item * arg) } export const useApp = () => { return app } app.mount(&#39;#app&#39;, true) ``` 现在,我们逐步检查转换是否正确: 1. **导入方式**: - 在Vue2中,我们导入默认的Vue对象。 - 在Vue3中,我们使用`createApp`来创建应用实例。转换后的代码中,我们同时导入了整个Vue模块(`import * as Vue`)和按需导入的`h`和`createApp`。这里有一个小问题:我们实际上不需要导入整个Vue模块,因为`createApp`已经单独导入了。而且,在Vue3中,通常我们不需要显式导入`h`,因为它在渲染函数中会自动导入。但是,这里单独导入`h`也没有错误。不过,导入整个Vue模块(`import * as Vue`)可能是多余的,因为后面的代码并没有使用它。我们可以移除这一行。 2. **创建应用实例**: - Vue3中,我们使用`createApp`创建应用实例。这里正确。 3. **使用插件(Router和Store)**: - 在Vue2中,我们在Vue实例的选项中传入`router`和`store`。 - 在Vue3中,我们使用`app.use(router)`和`app.use(store)`。这里正确。但需要注意的是,Vue Router和Vuex需要相应的Vue3版本,并且它们必须支持`app.use`的安装方式。 4. **全局过滤器**: - Vue3中移除了全局过滤器的概念。在Vue2中,我们使用`Vue.filter`注册全局过滤器,而在Vue3中,我们只能通过全局属性(如`app.config.globalProperties`)来模拟,或者使用computed属性或方法。 - 转换后的代码将过滤器添加为全局属性`$filters`的方法,这是一种常见的迁移策略。但是,这里有一个问题:在模板中使用时,我们需要通过`$filters`来调用,例如`$filters.globalFilterArray(value)`,而原来的Vue2中直接使用`{{ value | globalFilterArray }}`。因此,模板中的用法也需要改变。 - 转换后的代码在设置`$filters`时使用了短路操作来确保`app.config.globalProperties.$filters`已经是一个对象。这可以接受,但也可以简化,比如先初始化`$filters`为空对象,然后逐个添加方法。 5. **挂载应用**: - Vue3中,我们使用`app.mount(&#39;#app&#39;)`来挂载。转换后的代码中,`app.mount(&#39;#app&#39;, true)`的第二个参数`true`代表什么?在Vue3的`mount`方法中,第二个参数是一个布尔值,表示是否进行hydrating(用于SSR)。在客户端渲染中,通常我们不传递第二个参数或者传递`false`。这里传递`true`可能会导致问题,除非我们确实在进行客户端激活(hydration)。通常,我们只需要传递选择器字符串。所以这里应该去掉第二个参数。 6. **导出`useApp`函数**: - 这里导出了一个函数`useApp`,返回应用实例。在Vue3中,通常我们不需要导出应用实例,因为通常在创建和挂载后,我们不会在其他地方使用它。如果是为了在组件外访问全局属性或插件,可以使用其他方法。这个导出不是必须的,但也没有错误。 7. **挂载顺序**: - 注意,在Vue3中,我们可以在安装插件之后再挂载应用。转换后的代码中,先使用`app.use`安装插件,再设置全局属性,最后挂载,这是正确的。 8. **其他**: - 在转换后的代码中,使用了分号开头(`;(`)以避免与前面的表达式合并。这是为了避免前面语句没有分号结尾时导致的错误。这是一种常见的防御性写法,可以接受。 具体修改建议: 1. 移除多余的导入:`import * as Vue from &#39;vue&#39;`(因为后面没有用到) 2. 检查是否真的需要导入`h`:在这个例子中,我们没有使用渲染函数,所以可以移除`h`的导入。但是,在`createApp`中,我们传递了`App`组件,而`App`组件可能包含渲染函数,但这是由Vue内部处理的,所以这里导入的`h`并没有被使用。可以移除。 3. 全局过滤器设置:建议先初始化`app.config.globalProperties.$filters`为一个空对象,然后再添加方法,这样更清晰。例如: ```javascript app.config.globalProperties.$filters = { globalFilterArray(value) { return value.map(item => item * 3) }, globalFilterArrayTest(value, arg) { return value.map(item => item * arg) } } ``` 或者分两步: ```javascript app.config.globalProperties.$filters = {} app.config.globalProperties.$filters.globalFilterArray = function(value) { ... } // 另一个类似 ``` 4. 挂载时去掉第二个参数:`app.mount(&#39;#app&#39;)` 修正后的代码建议: ```javascript import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; const app = createApp(App) app.use(store) app.use(router) // 初始化全局过滤器对象 app.config.globalProperties.$filters = { globalFilterArray(value) { return value.map(item => item * 3) }, globalFilterArrayTest(value, arg) { return value.map(item => item * arg) } } // 或者使用分开的赋值(如果需要动态添加,可以分开,但这里可以直接在对象字面量中定义) // 上面已经合并为一个对象字面量,所以不需要分开赋值。 export const useApp = () => { return app } app.mount(&#39;#app&#39;) ``` 注意:在组件中使用这些过滤器时,需要改为调用`this.$filters.globalFilterArray(value)`,而不是使用管道符。 另外,关于`export const useApp = () => app`,如果你不需要在别处使用应用实例,可以去掉这个导出。 总结:原始转换代码存在一些可以改进的地方,但主要问题在于全局过滤器的处理方式(虽然模拟了,但语法上可以更简洁)和挂载时的第二个参数。另外,多余的导入可以移除。 因此,转换后的代码基本正确,但需要按照上述建议进行优化。 §§相关问题§§ 1. Vue3中如何实现全局过滤器? 2. Vue3挂载应用时,`mount`方法的参数有哪些? 3.Vue3中,如何使用全局属性来模拟Vue2的全局过滤器? 4. Vue3中,如何正确导入和使用`createApp`? </think> 以下是对 Vue2 到 Vue3 代码转换的详细检查分析,指出了正确之处和改进建议: ### ✅ 正确转换的部分 1. **应用实例化** ```javascript // Vue2 new Vue({...}).$mount(&#39;#app&#39;) // Vue3 ✅ 正确 const app = createApp(App) app.mount(&#39;#app&#39;) ``` 使用 `createApp` 创建应用实例是 Vue3 的标准方式[^1]。 2. **插件注册** ```javascript // Vue2 new Vue({ router, store }) // Vue3 ✅ 正确 app.use(store) app.use(router) ``` 通过 `app.use()` 注册路由和状态管理符合 Vue3 规范[^2]。 3. **全局过滤器迁移** ```javascript // Vue2 Vue.filter(&#39;globalFilterArray&#39;, ...) // Vue3 ✅ 替代方案 app.config.globalProperties.$filters.globalFilterArray = ... ``` 过滤器需通过 `globalProperties` 实现,符合 Vue3 的迁移策略[^3]。 --- ### ️ 需要改进的部分 1. **冗余导入** ```javascript import * as Vue from &#39;vue&#39; // ❌ 冗余 import { h, createApp } from &#39;vue&#39; // ✅ 但 h 未使用 ``` **建议修改:** ```javascript import { createApp } from &#39;vue&#39; // 移除未使用的 h ``` 2. **挂载参数错误** ```javascript app.mount(&#39;#app&#39;, true) // ❌ 第二个参数无效 ``` **建议修改:** ```javascript app.mount(&#39;#app&#39;) // ✅ 仅需选择器参数 ``` 3. **过滤器初始化冗余** ```javascript ;(app.config.globalProperties.$filters || (app.config.globalProperties.$filters = {})) ``` **建议优化:** ```javascript // 初始化一次即可 app.config.globalProperties.$filters = {} app.config.globalProperties.$filters.globalFilterArray = ... ``` 4. **导出应用实例的用途** ```javascript export const useApp = () => { return app } // ❓ 通常不需要导出 ``` **建议:** 仅在需要跨模块访问应用实例时保留。 --- ### ✅ 修正后的完整代码 ```javascript import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; const app = createApp(App) app.use(store) app.use(router) // 初始化过滤器对象 app.config.globalProperties.$filters = { globalFilterArray(value) { return value.map(item => item * 3) }, globalFilterArrayTest(value, arg) { return value.map(item => item * arg) } } app.mount(&#39;#app&#39;) ``` ### 迁移验证要点 1. **模板中的过滤器调用** Vue2 的 `{{ value | filter }}` 需改为 `{{ $filters.filter(value) }}` 2. **Composition API 兼容** 在 `setup()` 中使用过滤器需通过 `getCurrentInstance().proxy.$filters` 访问 3. **生命周期检查** 确保原代码中的 `beforeDestroy` 已改为 `beforeUnmount` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值