摘要:前言最近開(kāi)發(fā)的頁(yè)面以及功能大都以表格為主,接口獲取來(lái)的數(shù)據(jù)大都是需要經(jīng)過(guò)處理,比如時(shí)間戳需要轉(zhuǎn)換,或者狀態(tài)碼的轉(zhuǎn)義。首先,還是在文件中定義一個(gè)狀態(tài)碼對(duì)應(yīng)對(duì)象,這里我們將其對(duì)應(yīng)的內(nèi)容設(shè)為段落。
前言
最近開(kāi)發(fā)的頁(yè)面以及功能大都以表格為主,接口獲取來(lái)的 JSON 數(shù)據(jù)大都是需要經(jīng)過(guò)處理,比如時(shí)間戳需要轉(zhuǎn)換,或者狀態(tài)碼的轉(zhuǎn)義。對(duì)于這樣的問(wèn)題,各大主流框架都提供了類(lèi)似于過(guò)濾的方法,在 Vue 中,一般是在頁(yè)面上定義 filter 然后在模板文件中使用 | 進(jìn)行處理。
這種方法和以前的遍歷數(shù)組洗數(shù)據(jù)是方便了許多,但是,當(dāng)我發(fā)現(xiàn)在許多的頁(yè)面都有相同的 filter 的時(shí)候,每個(gè)頁(yè)面都要復(fù)制一遍就顯的很蛋疼,遂決定用 Vue.mixin() 實(shí)現(xiàn)一次代碼,無(wú)限復(fù)用。
最后,還可以將所有的 filter 包裝成一個(gè) vue 的插件,使用的時(shí)候調(diào)用 Vue.use() 即可,甚至可以上傳 npm 包,開(kāi)發(fā)不同的項(xiàng)目的時(shí)候可以直接 install 使用。(考慮到最近更新的比較快,遂打包上傳這步驟先緩緩,等版本稍微穩(wěn)定了之后來(lái)補(bǔ)全)
正文閑話(huà)說(shuō)夠,開(kāi)始正題。
Vue.mixin 為何物學(xué)習(xí)一個(gè)新的框架或者 API 的時(shí)候,最好的途徑就是上官網(wǎng),這里附上 Vue.mixin() 官方說(shuō)明。
一句話(huà)解釋?zhuān)?b>Vue.mixin() 可以把你創(chuàng)建的自定義方法混入所有的 Vue 實(shí)例。
示例代碼
Vue.mixin({ created: function(){ console.log("success") } })
跑起你的項(xiàng)目,你會(huì)發(fā)現(xiàn)在控制臺(tái)輸出了一坨 success。
效果出來(lái)了意思也就出來(lái)了,所有的 Vue 實(shí)例的 created 方法都被改成了我們自定義的方法。
使用 Vue.mixin()接下來(lái)的思路很簡(jiǎn)單,我們整合所有的 filter 函數(shù)到一個(gè)文件,在 main.js 中引入即可。
在上代碼之前打斷一下,代碼很簡(jiǎn)單,但是我們可以寫(xiě)的更加規(guī)范化,關(guān)于如何做到規(guī)范,在 Vue 的官網(wǎng)有比較詳細(xì)的 風(fēng)格指南 可以參考。
因?yàn)槲覀兊淖远x方法會(huì)在所有的實(shí)例中混入,如果按照以前的方法,難免會(huì)有覆蓋原先的方法的危險(xiǎn),按照官方的建議,混入的自定義方法名增加前綴 $_ 用作區(qū)分。
創(chuàng)建一個(gè) config.js 文件,用于保存狀態(tài)碼對(duì)應(yīng)的含義,將其暴露出去
export const typeConfig = { 1: "type one", 2: "type two", 3: "type three" }
再創(chuàng)建一個(gè) filters.js 文件,用于保存所有的自定義函數(shù)
import { typeConfig } from "./config" export default { filters: { $_filterType: (value) => { return typeConfig[value] || "type undefined" } } }
最后,在 main.js 中引入我們的 filters 方法集
import filter from "./filters" Vue.mixin(filter)
接下來(lái),我們就可以在 .vue 的模板文件中隨意使用自定義函數(shù)了
{{typeStatus | $_filterType}}包裝插件接下來(lái)簡(jiǎn)單應(yīng)用一下 Vue 中插件的制作方法。創(chuàng)建插件之后,就可以 Vue.use(myPlugin) 來(lái)使用了。
首先附上插件的 官方文檔。
一句話(huà)解釋?zhuān)b的插件需要一個(gè) install 的方法將插件裝載到 Vue 上。
關(guān)于 Vue.use() 的源碼
function initUse (Vue) { Vue.use = function (plugin) { var installedPlugins = (this._installedPlugins || (this._installedPlugins = [])); if (installedPlugins.indexOf(plugin) > -1) { return this } // additional parameters var args = toArray(arguments, 1); args.unshift(this); if (typeof plugin.install === "function") { plugin.install.apply(plugin, args); } else if (typeof plugin === "function") { plugin.apply(null, args); } installedPlugins.push(plugin); return this }; }很直觀的就看到他在最后調(diào)用了 plugin.install 的方法,我們要做的就是處理好這個(gè) install 函數(shù)即可。
上代碼
config.js 文件依舊需要,這里保存了所有狀態(tài)碼對(duì)應(yīng)的轉(zhuǎn)義文字
創(chuàng)建一個(gè) myPlugin.js 文件,這個(gè)就是我們編寫(xiě)的插件
import { typeConfig } from "./config" myPlugin.install = (Vue) => { Vue.mixin({ filters: { $_filterType: (value) => { return typeConfig[value] || "type undefined" } } }) } export default myPlugin插件的 install 函數(shù)的第一個(gè)參數(shù)為 Vue 的實(shí)例,后面還可以傳入一些自定義參數(shù)。
在 main.js 文件中,我們不用 Vue.mixin() 轉(zhuǎn)而使用 Vue.use() 來(lái)完成插件的裝載。
import myPlugin from "./myPlugin" Vue.use(myPlugin)至此,我們已經(jīng)完成了一個(gè)小小的插件,并將我們的狀態(tài)碼轉(zhuǎn)義過(guò)濾器放入了所有的 Vue 實(shí)例中,在 .vue 的模板文件中,我們可以使用 {{ typeStatus | $_filterType }} 來(lái)進(jìn)行狀態(tài)碼轉(zhuǎn)義了。
結(jié)語(yǔ)Vue.mixin() 可以將自定義的方法混入所有的 Vue 實(shí)例中。
本著快速開(kāi)發(fā)的目的,一排腦門(mén)想到了這個(gè)方法,但是這是否是一個(gè)好方法有待考證,雖然不是說(shuō)擔(dān)心會(huì)對(duì)原先的代碼造成影響,但是所有的 Vue 實(shí)例也包括了第三方模板。
本文可以隨意轉(zhuǎn)載,只要附上原文地址即可。
如果您認(rèn)為我的博文對(duì)您有所幫助,請(qǐng)不吝贊賞,點(diǎn)贊也是讓我動(dòng)力滿(mǎn)滿(mǎn)的手段 =3=。
待完善 發(fā)布 npm 包 新增項(xiàng) 在 v-html 中騷騷的使用 filter (2018年05月28日)最近碰到一個(gè)問(wèn)題,也是關(guān)于狀態(tài)碼過(guò)濾的,但是實(shí)現(xiàn)的效果是希望通過(guò)不同的狀態(tài)碼顯示不同的 icon 圖標(biāo),這個(gè)就不同于上面的文本過(guò)濾了,上文使用的 {{ styleStatus | $_filterStyleStatus }} 是利用 v-text 進(jìn)行渲染,若碰到需要渲染 html 標(biāo)簽就頭疼了。
按照前人的做法,是這樣的,我隨意上一段代碼。
... ...不!這太不 fashion 太不 cool,我本能的拒絕這樣的寫(xiě)法,但是,問(wèn)題還是要解決,我轉(zhuǎn)而尋找他法。
在看 Vue 的文檔的時(shí)候,其中一個(gè) API $options 官方文檔 就引起了我的注意,我正好需要一個(gè)可以訪(fǎng)問(wèn)到當(dāng)前的 Vue 實(shí)例的 API,一拍腦袋,方案就成了。
首先,還是在 config.js 文件中定義一個(gè)狀態(tài)碼對(duì)應(yīng)對(duì)象,這里我們將其對(duì)應(yīng)的內(nèi)容設(shè)為 html 段落。
export const iconStatus = { 1: "", 2: "", 3: "", 4: "" }接著,我們?cè)?filters.js 文件中引入他,寫(xiě)法還是和以前的 filters 一樣。
import { iconStatus } from "./config" export default { $_filterIcon: (value) => { return iconStatus[value] || "icon undefined" } }重頭戲在這里,我們?cè)谀0逦募行枰秩镜牡胤剑褂?v-html 來(lái)進(jìn)行渲染。
大功告成,以后需要根據(jù)狀態(tài)碼來(lái)渲染 icon 的地方都可以通過(guò)這個(gè)辦法來(lái)完成了。
事實(shí)證明,懶并不一定是錯(cuò)誤的,關(guān)鍵看懶的方向,雖然本篇博客寫(xiě)的標(biāo)題是 偷懶 ,但其實(shí)我只是對(duì)于重復(fù)性的無(wú)意義的搬運(yùn)代碼而感到厭煩,在尋找對(duì)應(yīng)解決辦法的時(shí)候可是一點(diǎn)都沒(méi)偷懶,相反的,在尋求更快更好更方便的方法的時(shí)候,我逐漸找回了當(dāng)初敲代碼的樂(lè)趣。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95214.html
相關(guān)文章
vue中 利用混入定義全局變量、函數(shù)、篩選器
摘要:說(shuō)一種沒(méi)人發(fā)的,利用混入來(lái)實(shí)現(xiàn)全局變量和函數(shù)。這種方法優(yōu)點(diǎn)是會(huì)有方法變量篩選器提示。一文件進(jìn)行全局混入一文件,我是把方法變量篩選器這三個(gè)分別寫(xiě)到三個(gè)文件里面了,方便后期維護(hù)。 說(shuō)一種沒(méi)人發(fā)的,利用混入mixins來(lái)實(shí)現(xiàn)全局變量和函數(shù)。mixins里面的方法、變量、篩選器會(huì)和組件里面的方法、變量、篩選器合并。這種方法優(yōu)點(diǎn)是ide會(huì)有方法、變量、篩選器提示。 一、main.js文件 imp...
JS每日一題: Vue中mixin怎么理解?
摘要:兩個(gè)對(duì)象鍵名沖突時(shí),取組件對(duì)象的鍵值對(duì)也使用同樣的策略進(jìn)行合并。代碼理解全局混合也可以全局注冊(cè)混合對(duì)象。注意使用一旦使用全局混合對(duì)象,將會(huì)影響到所有之后創(chuàng)建的實(shí)例為自定義的選項(xiàng)注入一個(gè)處理器。 20190122 Vue中mixin怎么理解? mixin是為了讓可復(fù)用的功能靈活的混入到當(dāng)前組件中,混合的對(duì)象可以包含任意組件選項(xiàng)(生命周期,指令之類(lèi)等等), mixin翻譯過(guò)來(lái)叫混合,高級(jí)的...
如何讓一個(gè)vue項(xiàng)目支持多語(yǔ)言(vue-i18n)
摘要:引入是一個(gè)插件,主要作用就是讓項(xiàng)目支持國(guó)際化多語(yǔ)言。所以新建一個(gè)文件夾,存放所有跟多語(yǔ)言相關(guān)的代碼。目前包含三個(gè)文件。全局搜索發(fā)現(xiàn)一共有多個(gè)。 這兩天手頭的一個(gè)任務(wù)是給一個(gè)五六年的老項(xiàng)目添加多語(yǔ)言。這個(gè)項(xiàng)目龐大且復(fù)雜,早期是用jQuery實(shí)現(xiàn)的,兩年前引入Vue并逐漸用組件替換了之前的Mustache風(fēng)格模板。要添加多語(yǔ)言,不可避免存在很多文本替換的工作,這么龐雜的一個(gè)項(xiàng)目,怎么才能使...
發(fā)表評(píng)論
0條評(píng)論
閱讀 3066·2021-10-27 14:15
閱讀 3064·2021-09-07 10:18
閱讀 1370·2019-08-30 15:53
閱讀 1634·2019-08-26 18:18
閱讀 3425·2019-08-26 12:15
閱讀 3509·2019-08-26 10:43
閱讀 699·2019-08-23 16:43
閱讀 2255·2019-08-23 15:27