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
duxapp放弃了redux,在duxapp中局部、全局状态的实现方案的更多相关文章
- 一个Time TodoList实例了解redux在wepy中的使用
@subject: wepy-redux-time-todo @author: leinov @date:2018-10-30 @notice: 小程序(wepy)开发群110647537 欢迎加入 ...
- redux是全局状态(数据)的管理机制,局部数据没有意义
redux是全局状态(数据)的管理机制,局部数据没有意义
- vue中局部封装axios
Vue中局部配置axios 'use strict' import axios from 'axios'; import { Loading } from 'element-ui'; export c ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- 你再也不用使用 Redux、Mobx、Flux 等状态管理了
Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...
- 分布式系统中生成全局ID的总结与思考
世间万物,都有自己唯一的标识,比如人,每个人都有自己的指纹(白夜追凶给我科普的,同卵双胞胎DNA一样,但指纹不一样).又如中国人,每个中国人有自己的身份证.对于计算机,很多时候,也需要为每一份数据生成 ...
- Vue 根组件,局部,全局组件 | 组件间通信,案例组件化
一 组件 <div id="app"> <h1>{{ msg }}</h1> </div> <script src=" ...
- jstack Dump 日志文件中的线程状态
[转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condi ...
- 解决IE6中 PNG图片透明的终极方案-八种方案!
“珍惜生命,远离IE6”,IE6中的bug令很多Web前端开发人员实为头疼,因此不知道烧了多少脑细胞,在众多的Bug中最令人抓狂的就是IE对png图片的不支持,导致设计师和重构师放弃了很多很炫的效果, ...
- jstack Dump 日志文件中的线程状态(转)
jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on conditio ...
随机推荐
- [nRF24L01+] 2. 芯片介绍
2. 芯片介绍 2.1. 特点 电源管理 掉电模式: 900nA 待机1模式: 26uA 2.2. 方框图
- Vim:从光标位置开始全局搜索和替换
/\v SEARCHTERM :%s/\vBEFORE/AFTER/gc
- 基于surging的产品项目-木舟开源了!
一 . 概述 因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging 使用有个深入的 ...
- 修改kubeadm证书过期时间及更新k8s集群证书
一.为什么要修改 kubeadm 证书时间 Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变 ...
- 运行 Java 程序
Java 程序实际上就是我们编译好的 Java 类文件.运行 Java 程序就是运行 Java 类的 main 函数. 编译并运行 Java 文件 源文件: package com.example; ...
- TOML 使用
TOML Reference TOML Tom's Obvious, Minimal Language TOML 被设计成可以无歧义地映射为哈希表.(相当于 JSON 对象吧) 注释 # 这是一个全行 ...
- Kubernetes-6:Pod生命周期介绍(init Container)
Pod生命周期 生命周期 1.API server调用kubelet下达Pod创建指令 2.容器环境初始化 3.进入Pod生命周期内(Pod开始创建) 4.Pod只要创建,就会自动生成一个pause容 ...
- windows服务器使用 azure devops 批量自动发布网站到IIS
最近由于一个API项目,需要利用负载均衡来做支撑,因此需要将同一份代码分发到多个服务器,之前一直手工干这个活,感觉太累了,去开发交流群,还有搜索了一下资料,发现很多人推荐我用ftp.还有磁盘共享等这种 ...
- 总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景
总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景 redis 和memcached 有什么区别?为什么在高并发下,单线程的redis 比多线程的效率高? mc 可以缓存图片和视频,re ...
- C++: 虚函数,一些可能被忽视的细节
C++: 虚函数,一些可能被忽视的细节 引言:关于C++虚函数,对某些细节的理解不深入,可能导致我们的程序无法按预期结果运行,或是表明我们对其基本原理理解不够透彻.本文详细解答以下几个问题:实现多态, ...