duxapp放弃了redux,在duxapp状态实现方案

全局状态

全局状态是一个很实用的功能,例如管理用户信息,组件间状态共享等功能都需要用到全局状态,react有很多成熟的全局状态管理工具,但是很多写起来太过麻烦,duxapp提供了几种应对不同场景的全局状态的方案,当然如果你需要其他全局状态,可以自行集成

局部全局状态

这种全局状态方案的使用场景,在于父子组件之间的状态共享

bash 复制代码
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组件中控制这个值的变化

bash 复制代码
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>
}

这里只演示了一层组件的嵌套,多层组件的嵌套也是支持的

全局状态

这个状态可以在整个运行时内所有页面或者组件内调用

bash 复制代码
import { createGlobalState } from '@/duxapp'
 
/** 需要在合适的地方创建,然后导出,在此处仅演示如何使用 */
const globalState = createGlobalState({ text: '默认值' })
 
// 任何地方设置值
globalState.setState({ text: '设置的值' })
 
// 在组件或者hook中取值
const data = globalState.useState()

这个方法使用比较单间,如果你需要更复杂的功能,例如用户信息管理,可以使用下面的全局状态管理

全局状态管理

全局状态管理是用 ObjectManage 这个类来实现的,你需要继续扩展编写这个类来实现功能,下面以用户信息管理来演示如何使用这个类

定义一个用户管理类继承到ObjectManage

通过data,编写默认数据

通过构造函数设置 ObjectManage 的参数,参数的意思是使用缓存,缓存数据,当你更新数据时,数据会被自动设置到本地缓存中,下次启动将自动读取缓存

bash 复制代码
import { ObjectManage } from '@/duxapp'
 
class UserManage extends ObjectManage {
  
  constructor() {
    super({
      cacheKey: 'userInfo',
      cache: true
    })
  }
 
  data = {
    // 登录状态
    status: false,
    // ...其他模块的用户信息
  }
}
 
/**
 * 实例化这个用户管理对象并且导出
 */
export const user = new UserManage()

这样就获得了一个基本的全局状态,要使用这些全局状态,可以在组件、hook、或者其他任何位置

bash 复制代码
// 直接调用当前数据
user.data.status
 
// 使用hook调用数据
const data = user.useData()
data.status

对于用户信息管理,他还需要一些其他的操作,都可以在用户管理类里面进行扩展,例如判断是否登录,去登录、退出登录、更新用户信息、获取线上用户信息等

bash 复制代码
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

相关推荐
北海-cherish2 小时前
vue中的 watchEffect、watchAsyncEffect、watchPostEffect的区别
前端·javascript·vue.js
AALoveTouch2 小时前
网球馆自动预约系统的反调试
javascript·网络
2501_915909063 小时前
HTML5 与 HTTPS,页面能力、必要性、常见问题与实战排查
前端·ios·小程序·https·uni-app·iphone·html5
white-persist4 小时前
Python实例方法与Python类的构造方法全解析
开发语言·前端·python·原型模式
新中地GIS开发老师5 小时前
Cesium 军事标绘入门:用 Cesium-Plot-JS 快速实现标绘功能
前端·javascript·arcgis·cesium·gis开发·地理信息科学
Superxpang5 小时前
前端性能优化
前端·javascript·vue.js·性能优化
左手吻左脸。5 小时前
解决el-select因为弹出层层级问题,不展示下拉选
javascript·vue.js·elementui
李白的故乡5 小时前
el-tree-select名字
javascript·vue.js·ecmascript
Rysxt_5 小时前
Element Plus 入门教程:从零开始构建 Vue 3 界面
前端·javascript·vue.js
隐含5 小时前
对于el-table中自定义表头中添加el-popover会弹出两个的解决方案,分别针对固定列和非固定列来隐藏最后一个浮框。
前端·javascript·vue.js