Files
zyt/TUICallKit-Vue3/GLOBAL_PROPERTIES_USAGE.md
T
2026-03-11 14:33:49 +08:00

251 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 全局属性使用说明
## 概述
小程序通过 `main.js` 中的 `app.config.globalProperties` 定义全局属性,包括 `$url``apiUrl` 方法。
## 全局属性定义
### 在 main.js 中
```javascript
// Vue3 部分
export function createApp() {
const app = createSSRApp(App)
// 定义全局 baseUrl
app.config.globalProperties.$url = baseUrl
// 定义全局 apiUrl 方法
app.config.globalProperties.apiUrl = apiUrl
return {
app
}
}
```
### 全局属性列表
| 属性名 | 类型 | 说明 |
|--------|------|------|
| `$url` | string | API 基础 URL,默认值:`http://api.zzzhengyangtang.cn` |
| `apiUrl` | function | API 请求方法 |
## 在 API 服务中使用
### 获取全局属性
```javascript
import { getCurrentInstance } from 'vue'
const getGlobalProperties = () => {
try {
const instance = getCurrentInstance()
if (instance) {
return instance.appContext.config.globalProperties
}
} catch (e) {
console.warn('无法获取 getCurrentInstance')
}
return {}
}
// 使用
const globalProps = getGlobalProperties()
const baseUrl = globalProps.$url
const apiUrl = globalProps.apiUrl
```
### 在 request 函数中使用
```javascript
export const request = (url, method = 'POST', data = {}, loading = true) => {
// 获取全局属性
const globalProps = getGlobalProperties()
const apiUrl = globalProps.apiUrl
const baseUrl = globalProps.$url || 'http://api.zzzhengyangtang.cn'
if (!apiUrl) {
// 降级方案:直接使用 uni.request
return new Promise((resolve, reject) => {
uni.request({
url: `${baseUrl}${url}`,
method,
data,
// ...
})
})
}
// 使用全局 apiUrl 方法
return apiUrl({
url,
method,
data,
header: {
'content-type': 'application/x-www-form-urlencoded'
}
}, loading)
}
```
## 在组件中使用
### 方式1:通过 getCurrentInstance
```vue
<script setup>
import { getCurrentInstance } from 'vue'
const instance = getCurrentInstance()
const baseUrl = instance.appContext.config.globalProperties.$url
const apiUrl = instance.appContext.config.globalProperties.apiUrl
console.log('Base URL:', baseUrl)
</script>
```
### 方式2:通过 thisVue2 风格)
```vue
<script>
export default {
methods: {
getBaseUrl() {
return this.$url
},
async fetchData() {
const response = await this.apiUrl({
url: '/api/data',
method: 'GET'
})
console.log(response)
}
}
}
</script>
```
### 方式3:通过 inject(推荐)
```vue
<script setup>
import { inject } from 'vue'
// 在 main.js 中提供
// app.provide('$url', baseUrl)
// app.provide('apiUrl', apiUrl)
const baseUrl = inject('$url')
const apiUrl = inject('apiUrl')
</script>
```
## 修改全局属性
### 修改 baseUrl
编辑 `TUICallKit-Vue3/main.js`
```javascript
var baseUrl = 'http://your-api-domain/api'
```
### 修改 apiUrl 方法
编辑 `TUICallKit-Vue3/main.js` 中的 `apiUrl` 函数。
## 全局属性的生命周期
1. **初始化**:在 `main.js` 中通过 `app.config.globalProperties` 定义
2. **可用**:应用创建后,所有组件都可以访问
3. **销毁**:应用销毁时自动清理
## 最佳实践
### 1. 统一管理全局属性
`main.js` 中集中定义所有全局属性:
```javascript
// 定义全局属性对象
const globalConfig = {
$url: baseUrl,
apiUrl: apiUrl,
$appName: '医疗小程序',
$version: '1.0.0'
}
// 批量注册
Object.keys(globalConfig).forEach(key => {
app.config.globalProperties[key] = globalConfig[key]
})
```
### 2. 创建辅助函数
```javascript
// utils/global.js
import { getCurrentInstance } from 'vue'
export const useGlobal = () => {
const instance = getCurrentInstance()
const globalProps = instance.appContext.config.globalProperties
return {
baseUrl: globalProps.$url,
apiUrl: globalProps.apiUrl,
appName: globalProps.$appName,
version: globalProps.$version
}
}
```
### 3. 在组件中使用
```vue
<script setup>
import { useGlobal } from '@/utils/global'
const { baseUrl, apiUrl } = useGlobal()
console.log('Base URL:', baseUrl)
</script>
```
## 常见问题
### Q: 如何在非组件中使用全局属性?
A: 在 API 服务中使用 `getCurrentInstance()` 获取全局属性。
### Q: 如何动态修改全局属性?
A: 直接修改 `app.config.globalProperties` 中的值:
```javascript
const instance = getCurrentInstance()
instance.appContext.config.globalProperties.$url = 'http://new-url'
```
### Q: 全局属性和 provide/inject 的区别?
A:
- 全局属性:所有组件都可以访问,通过 `this.$property``getCurrentInstance()` 获取
- provide/inject:父组件提供,子组件注入,更灵活但需要显式提供
### Q: 如何在 Composition API 中使用全局属性?
A: 使用 `getCurrentInstance()` 获取实例,然后访问 `appContext.config.globalProperties`
## 相关文件
- 全局配置: `TUICallKit-Vue3/main.js`
- API 服务: `TUICallKit-Vue3/utils/api.js`
- 全局工具: `TUICallKit-Vue3/utils/global.js`(可选)
## 总结
通过 `app.config.globalProperties` 定义的全局属性可以在整个应用中访问,是管理全局配置和方法的最佳方式。