# 周边拓展
# mpx-fetch
mpx-fetch提供了一个实例xfetch ,该实例包含以下api
# fetch(config)
正常的promisify风格的请求方法
{Object} config
config 可指定以下属性:
url
string
设置请求url
method
string
设置请求方式,默认为GET
data
object
设置请求参数
params
object
设置请求参数,参数会以 Query String 的形式进行传递
header
object
设置请求的 header,header 中不能设置 Referer。
content-type
默认为application/json
timeout
number
单位为毫秒。若不传,默认读取app.json文件中__networkTimeout属性。 对于超时的处理可在 catch 方法中进行
emulateJSON
boolean
设置为 true 时,等价于 header = {'content-type': 'application/x-www-form-urlencoded'}
usePre
boolean
预请求开关,若设置为 true,则两次请求间隔在有效期内且请求参数和请求方式对比一致的情况下,会返回上一次的请求结果
cacheInvalidationTime
number
预请求缓存有效时长,单位 ms,默认为 5000ms。当两次请求时间间隔超过设置时长后再发起二次请求时,上一次的请求缓存会失效然后重新发起请求
ignorePreParamKeys
array
|string
在判断缓存请求是否可用对比前后两次请求参数时,默认对比的是 options 传入的所有参数(包括 params 和 data )。但在具体业务场景下某些参数不一致时的缓存结果依旧可使用(比如参数中带有时间戳),所以提供 ignorePreParamKeys 来设置对比参数过程中可忽略的参数的 key,支持字符串数组和字符串(字符串传多个 key 时使用英文逗号分隔)类型。 配置后在进行参数对比时,不会对比在 ignorePreParamKeys 设置的参数。
import mpx from '@mpxjs/core'
import mpxFetch from '@mpxjs/fetch'
mpx.use(mpxFetch)
// 第一种访问形式
mpx.xfetch.fetch({
url: 'http://xxx.com',
method: 'POST',
params: {
age: 10
},
data: {
name: 'test'
},
header: {
'content-type': 'application/x-www-form-urlencoded',
},
emulateJSON: true,
usePre: true,
cacheInvalidationTime: 3000,
ignorePreParamKeys: ['timestamp']
}).then(res => {
console.log(res.data)
})
mpx.createApp({
onLaunch() {
// 第二种访问形式
this.$xfetch.fetch({url: 'http://test.com'})
}
})
# CancelToken
命名导出,用于创建一个取消请求的凭证。
import { CancelToken } from '@mpxjs/fetch'
const cancelToken = new CancelToken()
mpx.xfetch.fetch({
url: 'http://xxx.com',
data: {
name: 'test'
},
cancelToken: cancelToken.token
})
cancelToken.exec('手动取消请求') // 执行后请求中断,返回abort fail
# XFetch
命名导出,用于创建一个新的mpx-fetch实例进行独立使用
interface FetchOptions{
useQueue: boolean // 是否开启队列功能
proxy: boolean // 是否开启代理功能
}
import { XFetch } from '@mpxjs/fetch'
const newFetch = new XFetch(options) // 生成新的mpx-fetch实例
# interceptors
实例属性,用于添加拦截器,包含两个属性,request & response
mpx.xfetch.interceptors.request.use(function(config) {
console.log(config)
// 也可以返回promise
return config
})
mpx.xfetch.interceptors.response.use(function(res) {
console.log(res)
// 也可以返回promise
return res
})
# proxy 代理
# setProxy
配置代理项,可以传入一个数组或者一个对象,请求会按设置的规则进行代理
参数:
{Array | Object}
test
object
url
string
全路径匹配,规则可以参考path-to-regexp (opens new window),也可参考下面的简单示例。
WARNING
如果设置了此项,则 protocol、host、port、path 规则不再生效。此项支持 path-to-regexp 匹配,protocol、host、port、path 为全等匹配。
protocol
string
待匹配的协议头
host
string
不包含端口的 host
port
string
待匹配的端口
path
string
待匹配的路径
params
object
同时匹配请求中的
params
和query
data
object
匹配请求中的
data
header
object
匹配请求中的
header
method
Method | Method[]
匹配请求方法,不区分大小写,可以传一个方法,也可以传一个方法数组
custom
function
自定义匹配规则,参数会注入原始请求配置,结果需返回
true
或false
WARNING
如果设置了此项,匹配结果以此项为准,以上规则均不再生效。
proxy
object
url
string
代理的 url
protocol
string
修改原请求的协议头
host
string
代理的 host,不包含端口号
port
string
修改端口号
path
string
修改原请求路径
params
object
合并原请求的 params
data
object
合并原请求的 data
header
object
合并原请求的 header
method
Method
替换原请求的方法
custom
function
自定义代理规则,会注入两个参数,第一个是上一个匹配规则处理后的请求配置,第二个是 match 的参数对象,结果需返回要修改的请求配置对象。
WARNING
如果设置了此项,最终代理配置将以此项为准,其他配置规则均不再生效。
waterfall
boolean
默认为
false
,为false
时,命中当前规则处理完就直接返回;为true
时,命中当前匹配规则处理完成后将结果传递给下面命中匹配规则继续处理。
mpx.xfetch.setProxy([{
test: { // 此项匹配之后,会按下面 proxy 配置的修改请求配置
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'get',
params: {
a: 1
},
data: {
test1: 'abc'
}
},
proxy: {
header: {
env: 'env test'
},
params: {
b: 2
},
data: {
test2: 'cba'
}
},
waterfall: true // 为 true 时会将此次修改后的请求配置继续传递给下面的规则处理
}, {
test: {// 可以分别单独匹配 protocol、host、port、path;代理规则同样
protocol: 'http:',
host: 'mock.didi.com',
port: '',
path: '/mock/test'
},
proxy: {
host: 'test.didi.com',
port: 8888
},
waterfall: true
}, {
test: { // 自定义匹配规则
custom (config) { // config 为原始的请求配置
// 自定义匹配逻辑
if (xxx) {
return true
}
return false
}
},
proxy: { // 自定义代理配置
custom (config, params) {
// config 为上面匹配后修改过的请求配置
// params 为 match 后的参数对象
// 返回需要修改的请求配置对象
return {
params: {
c: 3
},
data: {
test3: 'aaa'
}
}
}
},
waterfall: true
}, {
test: {
// : 可以匹配目标项,并将 match 结果返回到代理 custom 函数中
// :和?都属于保留符号,若不想做匹配时需用 '\\' 转义
// (.*)为全匹配
url: ':protocol\\://mock.didi.com/mock/:id/oneapi/router/forum/api/v1/(.*)',
method: ['get', 'post']
},
proxy: {
url: 'https://127.0.0.1:8080/go/into/$id/api/v2/abcd' // '$'项在代理生效后会替换匹配规则中的':'项
},
waterfall: false // false 时不会继续匹配后面的规则
}])
# prependProxy
向前追加代理规则
mpx.xfetch.prependProxy({
test: {},
proxy: {},
waterfall: true
})
# appendProxy
向后追加代理规则
mpx.xfetch.appendProxy({
test: {},
proxy: {},
waterfall: true
})
# getProxy
查看已有的代理配置
console.log(mpx.xfetch.getProxy())
# clearProxy
解除所有的代理配置
mpx.xfetch.clearProxy()
# useFetch
useFetch(options?: FetchOptions):xfetch
在组合式 API 中使用,用来获取 @mpxjs/fetch
插件的 xfetch 实例,等用于 mpx.xfetch
。 关于 xfetch 实例的详细介绍,请点击查看
此外该方法可选择传入 options
参数,若传入参数,则会创建一个新的 XFetch 实例返回,若不传入参数,则默认将全局 xfetch
实例返回。
// app.mpx
import mpx from '@mpxjs/core'
import mpxFetch from '@mpxjs/fetch'
mpx.use(mpxFetch)
// script-setup.mpx
import { useFetch } from '@mpxjs/fetch'
useFetch().fetch({
url: 'http://xxx.com',
method: 'POST',
params: {
age: 10
},
data: {
name: 'test'
},
emulateJSON: true,
usePre: true,
cacheInvalidationTime: 3000,
ignorePreParamKeys: ['timestamp']
}).then(res => {
console.log(res.data)
})
- 注意: options 参数同 XFetch 章节。
# api-proxy
Mpx目前已经支持的API转换列表,供参考
方法/平台 | wx | ali | web | RN |
---|---|---|---|---|
getSystemInfo | ✅ | ✅ | ✅ | ✅ |
getSystemInfoSync | ✅ | ✅ | ✅ | ✅ |
nextTick | ✅ | ✅ | ✅ | ❌ |
showToast | ✅ | ✅ | ✅ | ❌ |
hideToast | ✅ | ✅ | ✅ | ❌ |
showModal | ✅ | ✅ | ✅ | ❌ |
showLoading | ✅ | ✅ | ✅ | ❌ |
hideLoading | ✅ | ✅ | ✅ | ❌ |
showActionSheet | ✅ | ✅ | ✅ | ❌ |
showNavigationBarLoading | ✅ | ✅ | ❌ | ❌ |
hideNavigationBarLoading | ✅ | ✅ | ❌ | ❌ |
setNavigationBarTitle | ✅ | ✅ | ✅ | ❌ |
setNavigationBarColor | ✅ | ✅ | ✅ | ❌ |
request | ✅ | ✅ | ✅ | ✅ |
downloadFile | ✅ | ✅ | ❌ | ✅ |
uploadFile | ✅ | ✅ | ❌ | ❌ |
setStorage | ✅ | ✅ | ✅ | ✅ |
setStorageSync | ✅ | ✅ | ✅ | ❌ |
removeStorage | ✅ | ✅ | ✅ | ✅ |
removeStorageSync | ✅ | ✅ | ✅ | ✅ |
getStorage | ✅ | ✅ | ✅ | ✅ |
getStorageSync | ✅ | ✅ | ✅ | ❌ |
getStorageInfo | ✅ | ✅ | ✅ | ✅ |
getStorageInfoSync | ✅ | ✅ | ✅ | ❌ |
clearStorage | ✅ | ✅ | ✅ | ✅ |
clearStorageSync | ✅ | ✅ | ✅ | ✅ |
saveImageToPhotosAlbum | ✅ | ✅ | ❌ | ❌ |
previewImage | ✅ | ✅ | ❌ | ❌ |
compressImage | ✅ | ✅ | ❌ | ❌ |
chooseImage | ✅ | ✅ | ❌ | ❌ |
getLocation | ✅ | ✅ | ❌ | ❌ |
saveFile | ✅ | ✅ | ❌ | ❌ |
removeSavedFile | ✅ | ✅ | ❌ | ❌ |
getSavedFileList | ✅ | ✅ | ❌ | ❌ |
getSavedFileInfo | ✅ | ✅ | ❌ | ❌ |
addPhoneContact | ✅ | ✅ | ❌ | ❌ |
setClipboardData | ✅ | ✅ | ❌ | ✅ |
getClipboardData | ✅ | ✅ | ❌ | ✅ |
setScreenBrightness | ✅ | ✅ | ❌ | ❌ |
getScreenBrightness | ✅ | ✅ | ❌ | ❌ |
makePhoneCall | ✅ | ✅ | ❌ | ✅ |
stopAccelerometer | ✅ | ✅ | ❌ | ❌ |
startAccelerometer | ✅ | ✅ | ❌ | ❌ |
stopCompass | ✅ | ✅ | ❌ | ❌ |
startCompass | ✅ | ✅ | ❌ | ❌ |
stopGyroscope | ✅ | ✅ | ❌ | ❌ |
startGyroscope | ✅ | ✅ | ❌ | ❌ |
scanCode | ✅ | ✅ | ❌ | ❌ |
login | ✅ | ✅ | ❌ | ❌ |
checkSession | ✅ | ✅ | ❌ | ❌ |
getUserInfo | ✅ | ✅ | ❌ | ❌ |
requestPayment | ✅ | ✅ | ❌ | ❌ |
createCanvasContext | ✅ | ✅ | ❌ | ❌ |
canvasToTempFilePath | ✅ | ✅ | ❌ | ❌ |
canvasPutImageData | ✅ | ✅ | ❌ | ❌ |
canvasGetImageData | ✅ | ✅ | ❌ | ❌ |
createSelectorQuery | ✅ | ✅ | ✅ | ❌ |
onWindowResize | ✅ | ✅ | ✅ | ✅ |
offWindowResize | ✅ | ✅ | ✅ | ✅ |
arrayBufferToBase64 | ✅ | ✅ | ✅ | ✅ |
base64ToArrayBuffer | ✅ | ✅ | ✅ | ✅ |
connectSocket | ✅ | ✅ | ✅ | ✅ |
getNetworkType | ✅ | ✅ | ✅ | ✅ |
onNetworkStatusChange | ✅ | ✅ | ✅ | ✅ |
offNetworkStatusChange | ✅ | ✅ | ✅ | ✅ |
# webview-bridge
Mpx 支持小程序跨平台后,多个平台的小程序里都提供了 webview 组件,webview 打开的 H5 页面可以通过小程序提供的 API 来与小程序通信以及调用一些小程序的能力,但是各家小程序对于 webview 提供的API是不一样的。
比如微信的 webview 打开的 H5 页面里是通过调用 wx.miniProgram.navigateTo 来跳转到原生小程序页面的,而在支付宝是通过调用 my.navigateTo 来实现跳转的,那么我们开发 H5 时候为了让 H5 能适应各家小程序平台就需要写多份对应逻辑。
为解决这个问题,Mpx 提供了抹平平台差异的bridge库:@mpxjs/webview-bridge。
安装:
npm install @mpxjs/webview-bridge
使用:
import mpx from '@mpxjs/webview-bridge'
mpx.navigateBack()
mpx.env // 输出:wx/qq/ali/baidu/tt
mpx.checkJSApi()
cdn地址引用:
<!-- 开发环境版本,方便调试 -->
<script src="https://dpubstatic.udache.com/static/dpubimg/D2JeLyT0_Y/2.2.43.webviewbridge.js"></script>
<!-- 生产环境版本,压缩了体积 -->
<script src="https://dpubstatic.udache.com/static/dpubimg/PRg145LZ-i/2.2.43.webviewbridge.min.js"></script>
<!-- 同时支持 ES Module 引入的 -->
// index.html
<script type="module" src="https://dpubstatic.udache.com/static/dpubimg/6MQOo-ocI4/2.2.43.webviewbridge.esm.browser.min.js"></script>
// main.js
import mpx from "https://dpubstatic.udache.com/static/dpubimg/6MQOo-ocI4/2.2.43.webviewbridge.esm.browser.min.js"
//ES Module 开发版本地址: https://dpubstatic.udache.com/static/dpubimg/cdhpNhmWmJ/2.2.43.webviewbridge.esm.browser.js
基础方法提供:
方法/平台 | wx | ali | baidu | tt | |
---|---|---|---|---|---|
navigateTo | ✅ | ✅ | ✅ | ✅ | ✅ |
navigateBack | ✅ | ✅ | ✅ | ✅ | ✅ |
switchTab | ✅ | ✅ | ✅ | ✅ | ✅ |
reLaunch | ✅ | ✅ | ✅ | ✅ | ✅ |
redirectTo | ✅ | ✅ | ✅ | ✅ | ✅ |
getEnv | ✅ | ✅ | ✅ | ✅ | ✅ |
postMessage | ✅ | ✅ | ✅ | ✅ | ✅ |
getLoadError | ✅ | ✅ | ✅ | ✅ | ✅ |
onMessage | ❌ | ❌ | ✅ | ❌ | ❌ |
扩展方法提供:
方法/平台 | wx | ali | baidu | tt | |
---|---|---|---|---|---|
checkJSApi | ✅ | ❌ | ❌ | ❌ | ❌ |
chooseImage | ✅ | ❌ | ✅ | ✅ | ❌ |
previewImage | ✅ | ❌ | ✅ | ✅ | ❌ |
uploadImage | ✅ | ❌ | ❌ | ❌ | ❌ |
downloadImage | ✅ | ❌ | ❌ | ❌ | ❌ |
getLocalImgData | ✅ | ❌ | ❌ | ❌ | ❌ |
startRecord | ✅ | ❌ | ❌ | ❌ | ❌ |
stopRecord | ✅ | ❌ | ❌ | ❌ | ❌ |
onVoiceRecordEnd | ✅ | ❌ | ❌ | ❌ | ❌ |
playVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
pauseVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
stopVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
onVoicePlayEnd | ✅ | ❌ | ❌ | ❌ | ❌ |
uploadVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
downloadVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
translateVoice | ✅ | ❌ | ❌ | ❌ | ❌ |
getNetworkType | ✅ | ❌ | ✅ | ✅ | ❌ |
openLocation | ✅ | ❌ | ✅ | ✅ | ❌ |
getLocation | ✅ | ❌ | ✅ | ✅ | ❌ |
stopSearchBeacons | ✅ | ❌ | ❌ | ❌ | ❌ |
onSearchBeacons | ✅ | ❌ | ❌ | ❌ | ❌ |
scanQRCode | ✅ | ❌ | ❌ | ❌ | ❌ |
chooseCard | ✅ | ❌ | ❌ | ❌ | ❌ |
addCard | ✅ | ❌ | ❌ | ❌ | ❌ |
openCard | ✅ | ❌ | ❌ | ❌ | ❌ |
alert | ✅ | ✅ | ❌ | ||
showLoading | ✅ | ✅ | ❌ | ||
hideLoading | ✅ | ✅ | ❌ | ||
setStorage | ✅ | ✅ | ✅ | ||
getStorage | ✅ | ✅ | ✅ | ||
removeStorage | ✅ | ✅ | ✅ | ||
clearStorage | ✅ | ✅ | ✅ | ||
getStorageInfo | ✅ | ✅ | ✅ | ||
startShare | ✅ | ✅ | ❌ | ||
tradePay | ✅ | ✅ | ❌ | ||
onMessage | ❌ | ❌ | ✅ | ❌ | ❌ |
WARNING
这个库仅提供给 H5 使用,请勿在小程序环境引入
# size-report
Mpx框架项目包体积可以进行分组、分包、页面、冗余Npm包等维度的分析和对比,详细请见
# 插件配置项
server
object
本地可视化服务相关配置
filename
string
构建生成的包体积详细输出文件地址
threshold
object
配置项目总体积和分包体积阈值,包含两个字段,size 为项目总体积阈值,packages 为分包体积阈值
{ size: '16MB', // 项目总包体积限额 16M packages: '2MB' // 项目每个分包体积限额 2M }
groups
Array<object>
配置体积计算分组,以输入分组为维度对体积进行分析,当没有该配置时结果中将不会包含分组体积信息
name
string
分组名称
threshold
string | object
分组相关体积阈值,若不配置则该分组不校验体积阈值,同时也支持对分组中占各分包体积阈值
// 分组体积限额 500KB threshold: '500KB' // 或者如下方,分组体积限额500KB,分组占主包体积限额160KB threshold: { size: '500KB', packages: { main: '160KB' } }
entryRules
object
配置分组 entry 匹配规则,小程序中所有的页面和组件都可被视为 entry
- include: 包含符合条件的入口文件,默认为空数组,规则数组中支持函数、正则、字符串
- exclude: 剔除符合条件的入口文件,默认为空数组,规则数组中支持函数、正则、字符串
include: [/@someGroup\/some-npm-package/], exclude: [/@someGroup\/some-two-pack/]
noEntryRules
object
配置计算分组中纯 js 入口引入的体积(不包含组件和页面)
- include: 包含符合条件的 js 文件,默认为空数组,规则数组中支持函数、正则、字符串
- exclude: 剔除符合条件的 js 文件,默认为空数组,规则数组中支持函数、正则、字符串
include: [/@someGroup\/some-npm-package/], exclude: [/@someGroup\/some-two-pack/]
reportPages
boolean
是否收集页面维度体积详情,默认 false
reportAssets
boolean
是否收集资源维度体积详情,默认 false
reportRedundance
boolean
是否收集冗余资源,默认 false
showEntrysPackages
Array<string>
展示某些分包资源的引用来源信息,例如 ['main'] 为查看主包资源的引用来源信息,默认为 []
配置使用示例:
{
// 本地可视化服务相关配置
server: {
enable: true, // 是否启动本地服务,非必填,默认 true
autoOpenBrowser: true, // 是否自动打开可视化平台页面,非必填,默认 true
port: 0, // 本地服务端口,非必填,默认 0(随机端口)
host: '127.0.0.1', // 本地服务host,非必填
},
// 体积报告生成后输出的文件地址名,路径相对为 dist/wx 或者 dist/ali
filename: '../report.json',
// 配置阈值,此处代表总包体积阈值为 16MB,分包体积阈值为 2MB,超出将会触发编译报错提醒,该报错不阻断构建
threshold: {
size: '16MB',
packages: '2MB'
},
// 配置体积计算分组,以输入分组为维度对体积进行分析,当没有该配置时结果中将不会包含分组体积信息
groups: [
{
// 分组名称
name: 'vant',
// 配置分组 entry 匹配规则,小程序中所有的页面和组件都可被视为 entry,如下所示的分组配置将计算项目中引入的 vant 组件带来的体积占用
entryRules: {
include: '@vant/weapp'
}
},
{
name: 'pageGroup',
// 每个分组中可分别配置阈值,如果不配置则表示
threshold: '500KB',
entryRules: {
include: ['src/pages/index', 'src/pages/user']
}
},
{
name: 'someSdk',
entryRules: {
include: ['@somegroup/someSdk/index', '@somegroup/someSdk2/index']
},
// 有的时候你可能希望计算纯 js 入口引入的体积(不包含组件和页面),这种情况下需要使用 noEntryRules
noEntryRules: {
include: 'src/lib/sdk.js'
}
}
],
// 是否收集页面维度体积详情,默认 false
reportPages: true,
// 是否收集资源维度体积详情,默认 false
reportAssets: true,
// 是否收集冗余资源,默认 false
reportRedundance: true,
// 展示某些分包资源的引用来源信息,默认为 []
showEntrysPackages: ['main']
}
# i18n
# useI18n
组合式 API 中使用,用来获取 i18n 实例。
参数选项
# locale
Locale
设置语言环境
注意: 只传 locale,不传 messages 属性时不起作用
# fallbackLocale
Locale
预设的语言环境,找不到语言环境时进行回退。
# messages
LocaleMessages
本地化的语言环境信息。
返回实例属性和方法
# locale
WritableComputedRef<Locale>
可响应性的 ref 对象,表示当前 i18n 实例所使用的 locale。
修改 ref 值会对局部或者全局语言集的 locale 进行更改,并触发翻译方法重新执行。
# fallbackRoot
boolean
本地化失败时是否回归到全局作用域。
# getLocaleMessage( locale )
function getLocaleMessage (locale: string): LocaleMessageObject
获取语言环境的 locale
信息。
# setLocaleMessage( locale, message )
function setLocaleMessage(locale: Locale, messages: LocaleMessageObject): void
设置语言环境的 locale
信息。
# mergeLocaleMessage( locale, message )
function mergeLocaleMessage(locale: Locale, messages: LocaleMessageObject): void
将语言环境信息 locale
合并到已注册的语言环境信息中。
# messages
readonly messages: ComputedRef<{
[K in keyof Messages]: Messages[K];
}>;
- 只读
局部或者全局的语言环境信息。
# isGlobal
boolean
是否是全局 i18n 实例。
# t
function t(key: string, choice?: number, values: Array | Object): TranslateResult
文案翻译函数
根据传入的 key 以及当前 locale 环境获取对应文案,文案来源是全局作用域还是本地作用域取决于 useI18n
执行时是否传入对应的 messages、locale
等值。
choice 参数可选 ,当传入 choice 时,t 函数的表现为使用复数进行翻译,和老版本中的 tc 函数表现一致。
<template>
<view>{{t('car', 1)}}</view>
<view>{{t('car', 2)}}</view>
<view>{{t('apple', 0)}}</view>
<view>{{t('apple', 1)}}</view>
<view>{{t('apple', 10, {count: 10})}}</view>
</template>
<script>
// 语言环境信息如下:
const messages = {
en: {
car: 'car | cars',
apple: 'no apples | one apple | {count} apples'
}
}
</script>
输入如下:
<view>car</view>
<view>cars</view>
<view>no apples</view>
<view>one apple</view>
<view>10 apples</view>
关于复数的更多信息可以点击查看 (opens new window)
values 参数可选 ,如果需要对文案信息即逆行格式化处理,则需要传入 values。
<template>
// 模版输出 hello world
<view>{{t('message.hello', { msg: 'hello'})}}</view>
</template>
<script>
import {createComponent, useI18n} from "@mpxjs/core"
const messages = {
en: {
message: {
hello: '{msg} world'
}
}
}
createComponent({
setup(){
const { t } = useI18n({
messages: {
'en-US': en
}
})
return {t}
}
})
</script>
# te
function te(key: string): boolean
检查 key 是否存在。
← 选项式 API