全局狀態
全局狀態是一個很實用的功能,例如管理用户信息,組件間狀態共享等功能都需要用到全局狀態,react有很多成熟的全局狀態管理工具,但是很多寫起來太過麻煩,duxapp提供了幾種應對不同場景的全局狀態的方案,當然如果你需要其他全局狀態,可以自行集成
局部全局狀態
這種全局狀態方案的使用場景,在於父子組件之間的狀態共享
import { contextState } from '@/duxapp'
import { Text } from '@/duxui'
const A = () => {
return <contextState.Provider defaultValue='張三'>
<B />
<C />
</contextState.Provider>
}
const B = () => {
const [name] = contextState.useState()
return <Text>{name}</Text>
}
const C = () => {
const [, setName] = contextState.useState()
return <Text onClick={() => setName('李四')}>設置名稱為李四</Text>
}
也可以在A組件中控制這個值的變化
import { contextState } from '@/duxapp'
import { Text } from '@/duxui'
import { useState } from 'react'
const A = () => {
const [name, setName] = useState()
return <contextState.Provider value={name}>
<B />
<C />
<Text onClick={() => setName('王五')}>設置名稱為王五</Text>
</contextState.Provider>
}
const B = () => {
const [name] = contextState.useState()
return <Text>{name}</Text>
}
const C = () => {
const [, setName] = contextState.useState()
return <Text onClick={() => setName('李四')}>設置名稱為李四</Text>
}
這裏只演示了一層組件的嵌套,多層組件的嵌套也是支持的
全局狀態
這個狀態可以在整個運行時內所有頁面或者組件內調用
import { createGlobalState } from '@/duxapp'
/** 需要在合適的地方創建,然後導出,在此處僅演示如何使用 */
const globalState = createGlobalState({ text: '默認值' })
// 任何地方設置值
globalState.setState({ text: '設置的值' })
// 在組件或者hook中取值
const data = globalState.useState()
這個方法使用比較單間,如果你需要更復雜的功能,例如用户信息管理,可以使用下面的全局狀態管理
全局狀態管理
全局狀態管理是用 ObjectManage 這個類來實現的,你需要繼續擴展編寫這個類來實現功能,下面以用户信息管理來演示如何使用這個類
- 定義一個用户管理類繼承到
ObjectManage - 通過
data,編寫默認數據 - 通過構造函數設置
ObjectManage的參數,參數的意思是使用緩存,緩存數據,當你更新數據時,數據會被自動設置到本地緩存中,下次啓動將自動讀取緩存
import { ObjectManage } from '@/duxapp'
class UserManage extends ObjectManage {
constructor() {
super({
cacheKey: 'userInfo',
cache: true
})
}
data = {
// 登錄狀態
status: false,
// ...其他模塊的用户信息
}
}
/**
* 實例化這個用户管理對象並且導出
*/
export const user = new UserManage()
這樣就獲得了一個基本的全局狀態,要使用這些全局狀態,可以在組件、hook、或者其他任何位置
// 直接調用當前數據
user.data.status
// 使用hook調用數據
const data = user.useData()
data.status
要設置這些數據這樣操作
// 使用hook調用數據
user.set({ status: true })
// 或者使用函數
user.set(oldData => ({ ...oldData, status: true }))
對於用户信息管理,他還需要一些其他的操作,都可以在用户管理類裏面進行擴展,例如判斷是否登錄,去登錄、退出登錄、更新用户信息、獲取線上用户信息等
import { ObjectManage } from '@/duxapp'
class UserManage extends ObjectManage {
constructor() {
super({
cacheKey: 'userInfo',
cache: true
})
}
data = {
// 登錄狀態
status: false,
// ...其他模塊的用户信息
}
isLogin = () => !!this.data.status
login = () => {
// 登錄邏輯
}
logout = () => {
// 退出登錄邏輯
}
getOnlineUserInfo = () => {
// 請求用户信息接口更新用户信息
request('').then(res => this.set(res))
}
setUsreInfo = data => {
this.set(old => ({ ...old, ...data }))
// 請求接口更新用户信息
request({
url: '',
method: 'POST',
data
})
}
}
/**
* 實例化這個用户管理對象並且導出
*/
export const user = new UserManage()
這裏僅是舉例,用户模塊裏面的用户管理功能遠比此例子複雜,可以前往查看
開發文檔:http://duxapp.cn
GitHub:https://github.com/duxapp