duxapp放棄了redux,在duxapp中局部、全局狀態(tài)的實現(xiàn)方案

全局狀態(tài)

全局狀態(tài)是一個很實用的功能,例如管理用戶信息,組件間狀態(tài)共享等功能都需要用到全局狀態(tài),react有很多成熟的全局狀態(tài)管理工具,但是很多寫起來太過麻煩,duxapp提供了幾種應對不同場景的全局狀態(tài)的方案,當然如果你需要其他全局狀態(tài),可以自行集成

局部全局狀態(tài)

這種全局狀態(tài)方案的使用場景,在于父子組件之間的狀態(tài)共享

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('李四')}>設(shè)置名稱為李四</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('王五')}>設(shè)置名稱為王五</Text>
  </contextState.Provider>
}

const B = () => {
  const [name] = contextState.useState()

  return <Text>{name}</Text>
}

const C = () => {
  const [, setName] = contextState.useState()

  return <Text onClick={() => setName('李四')}>設(shè)置名稱為李四</Text>
}

這里只演示了一層組件的嵌套,多層組件的嵌套也是支持的

全局狀態(tài)

這個狀態(tài)可以在整個運行時內(nèi)所有頁面或者組件內(nèi)調(diào)用

import { createGlobalState } from '@/duxapp'

/** 需要在合適的地方創(chuàng)建,然后導出,在此處僅演示如何使用 */
const globalState = createGlobalState({ text: '默認值' })

// 任何地方設(shè)置值
globalState.setState({ text: '設(shè)置的值' })

// 在組件或者hook中取值
const data = globalState.useState()

這個方法使用比較單間,如果你需要更復雜的功能,例如用戶信息管理,可以使用下面的全局狀態(tài)管理

全局狀態(tài)管理

全局狀態(tài)管理是用 ObjectManage 這個類來實現(xiàn)的,你需要繼續(xù)擴展編寫這個類來實現(xiàn)功能,下面以用戶信息管理來演示如何使用這個類

  • 定義一個用戶管理類繼承到ObjectManage
  • 通過data,編寫默認數(shù)據(jù)
  • 通過構(gòu)造函數(shù)設(shè)置 ObjectManage 的參數(shù),參數(shù)的意思是使用緩存,緩存數(shù)據(jù),當你更新數(shù)據(jù)時,數(shù)據(jù)會被自動設(shè)置到本地緩存中,下次啟動將自動讀取緩存
import { ObjectManage } from '@/duxapp'

class UserManage extends ObjectManage {
  
  constructor() {
    super({
      cacheKey: 'userInfo',
      cache: true
    })
  }

  data = {
    // 登錄狀態(tài)
    status: false,
    // ...其他模塊的用戶信息
  }
}

/**
 * 實例化這個用戶管理對象并且導出
 */
export const user = new UserManage()

這樣就獲得了一個基本的全局狀態(tài),要使用這些全局狀態(tài),可以在組件、hook、或者其他任何位置

// 直接調(diào)用當前數(shù)據(jù)
user.data.status

// 使用hook調(diào)用數(shù)據(jù)
const data = user.useData()
data.status

要設(shè)置這些數(shù)據(jù)這樣操作

// 使用hook調(diào)用數(shù)據(jù)
user.set({ status: true })
// 或者使用函數(shù)
user.set(oldData => ({ ...oldData, status: true }))

對于用戶信息管理,他還需要一些其他的操作,都可以在用戶管理類里面進行擴展,例如判斷是否登錄,去登錄、退出登錄、更新用戶信息、獲取線上用戶信息等

import { ObjectManage } from '@/duxapp'

class UserManage extends ObjectManage {
  
  constructor() {
    super({
      cacheKey: 'userInfo',
      cache: true
    })
  }

  data = {
    // 登錄狀態(tài)
    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()

這里僅是舉例,用戶模塊里面的用戶管理功能遠比此例子復雜,可以前往查看

開發(fā)文檔:http://duxapp.cn

GitHub:https://github.com/duxapp

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容