当我们有一个函数1他需要封装成公共函数,但是了他需要传入一个组件内的值1才能进行逻辑,而我们在使用她的时候又不想传入两个参数,可以把函数1封装成返回函数2的一个函数,函数1需要传入值1在决定函数2. 然后在组件内得到函数2,函数2已经被函数1决定了实现了逻辑,并且后面使用只需要传入一次值。相当于一次传参解决了本来一直需要多传一个参的问题。
// 需要传的变量
const pathname_url = props.pathname as `/${LocaleId}/${string}`// 需要封装成全局的函数
function $t( translate_value: string ){const breakArray = translate_value.split('.')let initTraverse = 0let transferObj: LanguageText = {}if(pathname_url.startsWith('/zh-cn/')) {transferObj = footer_cn_text}else if(pathname_url.startsWith('/en-us/')) {transferObj = footer_en_text}else {console.error('当前的语言环境错误')return}while (initTraverse < breakArray.length){const break_value = breakArray[initTraverse]const currentValue: string | LanguageText = transferObj[break_value]if ( typeof currentValue === "string"){return transferObj[break_value]}else if ( typeof currentValue === "object" ){transferObj = transferObj[break_value] as LanguageTextinitTraverse++}}
}
// 封装后的公共函数
import en_text from '@/interpreter_table/lang_en.ts'
import cn_text from '@/interpreter_table/lang_cn.ts'
import type { LocaleId } from '@/ts_comon_type/i18n/types'interface LanguageText {[key: string]: string | LanguageText
}function get_t( pathname_url: `/${LocaleId}/${string}` ){// 关键步骤return function $t(translate_value: string){const breakArray = translate_value.split('.')let initTraverse = 0let transferObj: LanguageText = {}if(pathname_url.startsWith('/zh-cn/')) {transferObj = cn_text}else if(pathname_url.startsWith('/en-us/')) {transferObj = en_text}else {console.error('当前的语言环境错误')return}while (initTraverse < breakArray.length){const break_value = breakArray[initTraverse]const currentValue: string | LanguageText = transferObj[break_value]if ( typeof currentValue === "string"){return transferObj[break_value]}else if ( typeof currentValue === "object" ){transferObj = transferObj[break_value] as LanguageTextinitTraverse++}} }}export default get_t
// 如何使用
const pathname_url = props.pathname as `/${LocaleId}/${string}`const $t = get_t(pathname_url)