話不多說,直接進入主題。
ant-design 在使用它的table組件的時候,不知道你們有沒有需求說需要翻譯列表頭部名稱:
在切換語言的時候,table的列頭名稱 並不會同步更換對應語言, 而是需要你重新laod或者切換頁面之後才生效。
官方文檔沒有涉及相關問題的解決辦法,其實很明顯原因就是切換語言的時候,表頭的i18n全局指令變量沒有被觸發:
這是正常使用ant-design table 組件時, 給列的title賦值的方法:
columns: [
{
title: this.$t('general.serial'),
width: 120,
scopedSlots: { customRender: 'serial'}
}
]
columns是table所有列的數據的數組變量,title是給列頭名稱的固定屬性,因爲它會對應一個name爲title的slot。
國際化之後,使用全局i18n指定 this.$t 去翻譯對應列的詞條,這個時候問題就來了,切換語言並不會觸發其自動翻譯,需要重新load 當前頁面或者你切到別的頁面,再返回該頁面,才能拿到對應語言的詞條。
所以,怎麼解決這個問題?
通過官方文檔,看到table colums的title屬性的類型可以是string/slot。 string的話就是上面我們採用的方法,所以,此時是不是可以考慮使用slot的方式,給title傳值,然後將翻譯的工作交回到html中。
ok, 我們開始嘗試:
columns: [
{
slotName: 'general.serial',
width: 120,
scopedSlots: { customRender: 'serial', title: 'general.serial' }
}
]
在scopedSlots中添加title的slot名稱,這裏直接把對應國際化詞條的完整路徑賦給它,爲什麼這麼做?繼續往下看:
我再給每一列添加一個名叫slotName的屬性,它的值也是對應國際化詞條的完整路徑。
接着在<a-table>組件中定義對應的slot,用來展示column的title。
這個時候,你會有個問題跑進你的腦子裏:
臥槽!這樣我還得在html中加入每一列的slot,因爲每個slot名稱都不一樣,這條html又要增加很多代碼了。
且慢,還記得上面我給每一列增加了一個slotName屬性嗎,而且它的值和title的slot name 是一樣的。
所以,一個循環就可以搞定了。請看:
<template v-for="(item, index) in columns" :slot="item.slotName">
<span :key="index">{{ $t(item.slotName) }}</span>
</template>
每一列的slotName就是剛剛在columns中定義的slonName的值,而且這個值恰好又是該列的title對應的國際化詞條路徑,所以直接在這裏 $t(item.slotName) 就可以翻譯每一列的title了。
這個問題也就完美的解決了。
總結:
1,官方文檔要看仔細;
2,在一條路行不通的時候不一定非要糾結這條路錯在哪,往往可能就是這條路是不通的, 你再怎麼鑽牛角尖它也到不了你想到達的地方。也許你可以再修一條路彎過去,或者把被堵住的地方挖開,但是這樣的代價不一定你能承擔的。而且,往往就是你把障礙挖開了,接下來還有更多你沒想到的障礙。所以,及時的換一條路,可能就輕鬆的到達了。