動態

詳情 返回 返回

duxapp放棄了redux,在duxapp中局部、全局狀態的實現方案 - 動態 詳情

全局狀態

全局狀態是一個很實用的功能,例如管理用户信息,組件間狀態共享等功能都需要用到全局狀態,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

user avatar zhoumo_62382eba4b454 頭像 songxianling1992 頭像 liushuigs 頭像 sishuiliunian_58f891c129ab1 頭像 zxl20070701 頭像 qingzhan 頭像 xiangjiaochihuanggua 頭像 aion_6356676d25766 頭像 zxbing0066 頭像
點贊 9 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.