vue、react和小程序的状态管理

vue2的状态管理

vuex

vuex官网:https://vuex.vuejs.org/

vuex安装

在vue2中使用vuex的3版本:npm i vuex@3

在vue3中使用vuex的4版本:npm i vuex@4

vuex全局配置使用

导出vuex的状态配置: index.js

import Vue from 'vue'
import Vuex from 'vuex'export default new Vuex.store({actions: {},state: {},mutations: {},getter: {},modules: {}
})

全局配置: main.js

import Vue from 'vue'
import store from './store/index.js'// 在vue实例上注册使用
new Vue({el: #app,render: h => h(APP),store
})

vuex中的state配置项

注册全局状态

vuex中的actions配置项

响应组件中的动作

vuex中的mutations配置项

修改state中的数据,可以被vuex的开发者工具检测到

vuex中的getter配置项

依赖于state去计算出新值

vuex中的modules配置项,实现模块化

如果页面中很多不同模块的组件都存储在vuex中,可以分模块

modules配置项可以实现

import Vue from 'vue'
import Vuex from 'vuex'// 命名空间nameSpace
// 命名空间的作用是在使用mapState()、mapActions、mapMutations()的时候作为第一个参数,快速获取
// 到各个模块的状态、action、mutations、getterconst demo1 = {nameSpace: true,actions: {},state: {},mutations: {},getter: {},
}const demo2 = {nameSpace: true,actions: {},state: {},mutations: {},getter: {},
}export default new Vuex.store({modules: {demo1,demo2}
})

在组件中获取store中的数据

有两种方法:

1、通过this.$store获取

如果项目中不分模块:

获取state:this.$store.state

获取getter: this.$store.getter

触发actions: this.$store.dispath()

触发mutations:this.$store.commit()

如果项目中分模块:

获取state:this.$store.state.模块名称

获取getter: this.$store.getter[‘模块名称/action名称’]

触发actions: this.$store.dispath(‘模块名称/action名称’)

触发mutations:this.$store.commit(‘模块名称/commit名称’)

2、通过mapState()、mapActions、mapMutations()、mapGetters()

如果项目中不分模块

以上方法只接收一个参数,可以是对象,也可以是数组

参数是对象:key是在项目中使用的方法名,value是store中的state名称,其他三个map方法使用类似

mapState({

        key: value

})

参数是数组:每一项即是在项目中使用的名字,也是store中的名称

mapState([item, item1])

如果项目中区分模块:

以上方法接收两个参数,参数一是模块的名字, 参数二就是要引入的数据或者方法

以state为例,其他map方法都是类似的

mapState('模块名称', {})

mapstate('模块名称', [])

vue3的状态管理

pinia

pinia官网:Pinia | The intuitive store for Vue.js

pinia安装:  npm i pinia

pinia使用:

// 第一步:pinia引入
import {creatPinia} from 'pinia'// 第二步:创建pinia
const pinia = creatPinia()// 第三步:安装pinia
const app = cratApp()
app.use(pinia)

pinia存储和读取数据

pinia存储数据

import {defineStore} from 'pinia'// defineStore接收两个参数,第一个参数是文件名字,第二个参数是store的配置项
// 配置项目可以是选项式也可以是组合式// 选项式
// 选项式第二个参数是对象
export const useDemoStore = defineStore('demo', {// 配置状态// state是一个函数// 返回一个对象state() {return {demo: 1}},// 在这里可以获取this,this上有状态值action: {changeDemo() {this.demo = 3}}
})// 组合式
// 组合式第二个参数是函数
import {ref} from 'vue'
export const useDemoStore = defineStore('demo', () => {// 配置状态// 使用选项式API进行定义const demo = ref(0)// action中的函数正常写即可changeDemo() {demo = 3}// 如果要把这些状态和方法暴漏出去,需要有返回值return {demo,changeDemo}
})

pinia读取数据

// 首先把之前定义的demo引入
import {useDemoStore} from './demo'// 之前定义的store有返回值,返回值中就有我们定义的方法和状态
const demoStore = useDemoStore()// 获取状态
// 第一种方法
demoStore.demo// 第二种
demoStore.$state.demo

pinia修改状态

// 首先把之前定义的demo引入
import {useDemoStore} from './demo'// 之前定义的store有返回值,返回值中就有我们定义的方法和状态
const demoStore = useDemoStore()// 第一种:直接修改
demoStore.demo = 2// 第二种: 可以批量修改
demoStore.$patch({demo: 1,demo2: 2
})// 第三种:使用action进行修改
// 使用action进行修改的目的是如果是复杂的逻辑,可以进行服用
demoStore.changeDemo({demo: 1,demo2: 2
})

storeToRefs

为什么要有这个API?

把全局状态引入之后,在使用的时候每次都要多取一层,这个的目的是把状态结构出来,并且是响应式的

import {storeToRefs} from 'pinia'const demoStore = useDemoStore()const {demo} = storeToRefs(demoStore)

getters

和vuex中的getter一样,都是计算状态值的

$subscribe

这个API的作用是来监听某个store中的值是否有变化,若是监听到变化可以做一些逻辑操作,类似于watch监听

const demoStore = useDemoStore()const {demo} = storeToRefs(demoStore)// 接收一个函数作为参数
// 函数接收两个参数,参数一是本次修改信息,参数二是state
demoStore.$subscribe((mutate, state) => {})

react的状态管理

redux

react-redux

mobx

mobx中文文档:https://cn.mobx.js.org

mobx安装:npm i mobx mobx-react

mobx存储和读取数据

observale/observer: 会使用到这俩装饰器,第一个是把普通状态定义为可以被mobx中的钩子函数监测的状态,第二个是把mobx和react组件进行关联

mobx存储数据

import {observable, action} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'}// 通过props向下传递store中的数据
ReactDOM.render(<App store={new user()} />, document.getElementById('#root'))

使用mobx中的数据

import {observable, action} from 'mobx'
import {observer} from 'mobx-react'// 组件中使用store
// 从props中结构出store@observer
class com extends React.component {render() {{store} = this.props}
}

mobx修改状态

computed

计算属性,类似于vue中的computed

import {observable, computed} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'@computed get changeDemoName() {return this.demoName += '==='}}

action

对状态的操作

import {observable, action} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'@action changeDemoName() {this.demoName += '==='}// action加一个限定词bound,目的是正确绑定实例this@acton.bound bchangeName() {this.demoName += '===bound改变'}// 异步action// action里面有异步操作,可以有以下三种方法@action syncChangName() {// 第一种再写另外一个action去改变异步里面的值// 第二种// 第二个参数函数需要手动立即调用使用action(‘方法名称’, 函数)// 第三种runInAction(() => {// 直接在这里改变状态值})}}

mobx的动态检测

autorun

接收一个函数作为参数,默认会执行一次,当内部依赖的被观测值发生改变时会再执行一次

import {observable, computed, autorun} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'@computed get changeDemoName() {return this.demoName += '==='}}autorun(() => {this.demoName += 'autorun监测改变'
})
when

当满足条件时,只执行一次

接收两个函数作为参数,参数一是判断被监测的值是否满足条件,满足条件执行第二个函数

import {observable, computed, when} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'@computed get changeDemoName() {return this.demoName += '==='}}when(() => {return a > 10
}, () => {// 满足条件时执行代码
})
reaction

初始化不会执行,也可手动停止监测,只有被监测的数据发生改变才会触发

接收两个函数作为参数,第一个参数的返回值会作为第二个函数参数的第一个参数,

第二个参数是一个函数,接收两个参数,第一个参数就是reaction第一个参数的返回值,第二个参数是reaction本身

import {observable, computed, reaction} from 'mobx'class user {// 熟悉类的装饰器,会更好理解当前的状态和函数的定义@observable demoName = '小刘'@computed get changeDemoName() {return this.demoName += '==='}}reaction(() => {return 10
}, (data, reaction) => {// data是上个参数的返回值10// 第二个参数是reaction本身// 可以调用reaction.dispose()来停止继续监测的数据// 满足条件时执行代码
})

小程序的状态管理

mini-program

微信中的全局状态管理使用的是mobx-miniprogram和westore两种、

注意:mobx-miniprogram搭配mobx-miniprogram-bindings

创建store

import {observable,action
} from "mobx-miniprogram";export observable({// datademo1: 1,demo2: 2,// action来改变数据updataDemo1: action(function(argument){})})

在页面中使用store

import {createStoreBindings
} from "mobx-miniprogram-bindings"
import store from "../../store/index"Page({onLoad() {// 使用createStoreBindings将数据绑定到页面中this.storeBindings = createStoreBindings(this, {store,fields: ['demo1', 'demo2'],actions: ['updataDemo2']})},// count 递增increaseHandle() {this.updataDemo2(1)},// 页面卸载时,销毁当前页面的 store 绑定onUnload() {this.storeBindings.destroyStoreBindings();}
})

1、createStoreBindings 方法调用会返回一个包含 updateStoreBindings,destroyStoreBindings 两个函数的对象,并且赋值给了当前页面实例的 storeBindings 属性。

2、当页面卸载(onUnload)时,调用 destroyStoreBindings 销毁当前页面的 store 绑定,避免造成内存泄露

3、updateStoreBindings函数涉及到延迟更新和立即更新的问题

      3.1:为了提升性能,store中状态被更新时,不会立即更新到data中,而是在下次wx.nextTick()调用时才更新,可以减少setData的调用次数

      3.2:如果想要立即更新,在页面中调用this.storeBindings.updateStoreBindings() ,在组件中调用this.updateStoreBindings() 

在组件中使用store

import {storeBindingsBehavior
} from "mobx-miniprogram-bindings"
import store from "../../store/index"Component({behaviors: [storeBindingsBehavior],storeBindings: {store,fields: ['demo2'],actions: ['updataDemo2']},methods: {// demo2 递增increaseHandle() {this.updataDemo2(1)}}
})

store划分模块

直接在store文件夹下新建相应的.js文件就行

westore

westore有俩个核心的api

创建页面

create(store,option)

创建组件

create(option)

更新页面或组件

this.update()

1、为了避免组件和页面中data的值被store中的值覆盖掉,使用store.data来访问

创建store

// 创建单一的store
export default {data: {userInfo: {name: 'zhangsan',age: 25,city: 'QingDao'},count: 0}
}// 创建模块化store
import user from "./user"
import system from "./system"export default {data: {user,system}
}

在页面中使用更新store

import store from "../../store"create(store, {data: {count: null},// 更新 countincrease() {this.store.data.count += 1this.update()}
})

在组件中使用更新store

import create from "../../utils/create"create({data: {count: null},methods: {increase() {this.store.data.count += 1this.update()}}
})

this.update()

this.update()方法返回一个promise对象,当视图层页面渲染完成后调用resolve()

this.update().then((data) => {console.log('视图已完成数据的更新', data)})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EFK】基于K8S构建EFK+logstash+kafka日志平台

基于K8S构建EFKlogstashkafka日志平台 一、常见日志收集方案1.1、EFK1.2、ELK Stack1.3、ELK filbeat1.4、其他方案 二、EFK组件介绍2.1、Elasticsearch组件2.2、Filebeat组件【1】 Filebeat和beat关系【2】Filebeat是什么【3】Filebeat工作原理【4】传输方案 2.3、Logstash组件…

python 中常用的热门库介绍

阅读本文之前请参阅-----如何系统的自学python Python 是一种非常流行的编程语言&#xff0c;它的一个主要优势是拥有一个庞大的生态系统&#xff0c;其中包括许多强大的库。这些库为各种任务提供了解决方案&#xff0c;从数据分析到机器学习&#xff0c;从网络爬虫到图像处理。…

IOS 设置UIViewController为背景半透明浮层弹窗,查看富文本图片详情

使用场景&#xff1a;UIViewController1 打开 UIViewController2&#xff08;背景半透明弹窗&#xff09; 案例&#xff1a;打开富文本网页<img>图片的url查看图片详情 WKWebView WKNavigationDelegate代理方法设置js代码点击事件 ///注册添加图片标签点击js方法 - …

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…

推荐一款ssh工具 xshell替代品 electerm

下载地址 electerm&#xff1a; https://electerm.github.io/electerm/ windows版本 产品优势 复制粘贴&#xff0c;可以直接使用ctrlc/v 非常的方便 而且不想xshell 需要账号登陆&#xff0c;有更新弹窗&#xff0c;自身集成了sftp 界面设计更新&#xff0c;比MobaXterm的…

2024年值得关注的5款国产低代码开发平台

最近几年&#xff0c;低代码\无代码\零代码技术和快速开发平台比较热门&#xff0c;全球知名低代码平台厂商有&#xff1a;微软Power Platform、西门子Mendix、OutSystems等。我们国内最近几年也有一些信创国产化低代码平台涌现出来&#xff0c;比如&#xff1a;云程、氚云、轻…

【计算机网络】一些乱七八糟内容

MAC Media Access Control 用于在局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;中实现设备自动接入网络 "载波侦听多路访问"(Carrier Sense Multiple Access) CSMA/CD 是CSMA的升级版本&#xff0c;加入了序列号检测机制。 CSMA/CA 是CSM…

阿里又放大招 EMO:一张照片+音频即可生成会说话唱歌的视频

项目简介 你只需要提供一张你的照片任意的音频文件&#xff0c;就能实现你说任何话或唱任何歌曲的动态视频。同时生成视频的长度和你音频长度相匹配&#xff01;表情非常到位&#xff0c;支持任意语音、任意语速、任意图像。 主要特点和功能 1、音频驱动的人像视频生成&#…

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫&#xff1f;二、普通人如何通过网络爬虫赚钱&#xff1f;2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一&#xff1a;ebay电商【…

lv19 多态 4

1 虚函数 虚函数&#xff08; 基类指针可指向派生类对象&#xff0c; 动态联编&#xff09; 先看示例&#xff0c;不加virtual&#xff0c;不认对象认指针。 #include <iostream>using namespace std;class A{ public:A(){ }~A(){ }void show(){cout<<"AAA…

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…

三款热门超声波清洗机对比测评:希亦、固特、大宇多维度实测!

如果你非常在意物品的健康卫生&#xff0c;并且希望能够摆脱手动清洗一些物品而彻底解放双手&#xff01;在家备一款超声波清洗机还是非常有必要的&#xff01;无论是珠宝、眼镜还是日常小物&#xff0c;都希望能够保持如新的光泽和卫生状态。那么超声波清洗机是最合适不过的&a…

ubuntu22.04工具整理以及安装使用方式

截图工具 火焰截图 安装&#xff1a; sudo apt install flameshot增加自定义快捷键&#xff1a; 然后就可是使用是指的快捷键进行截图了。 如果没有在截图上编辑的需要&#xff0c;其实自带的截图也够用的。

2 网络技术基础(2)

1.网络拓扑分类 基本的网络拓扑有五种&#xff1a;星形、环形、总线形、树形与网状。 1.1 星形拓扑 星形拓扑结构的主要特点是&#xff1a;①节点通过点-点通信线路与中心节点连接&#xff1b;②中心节点控制全网的通信&#xff0c;任何两节点之间的通信都要通过中心节点&…

文献阅读:Transformers are Multi-State RNNs

文献阅读&#xff1a;Transformers are Multi-State RNNs 1. 内容简介2. 方法介绍 1. 基础回顾 1. RNN2. Transformer 2. Transformer解构 1. MSRNN2. Transformer 3. TOVA 1. 现有转换策略2. TOVA 3. 实验考察 & 结论 1. 实验设计2. 实验结果 1. LM2. 长文本理解3. 文本生…

一. demo

1. 舞台-场景-控件 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.Arrays;public class Main e…

hive表中的数据导出 多种方法详细说明

​​​​​​文章中对hive表中的数据导出 多种方法目录 方式一&#xff1a;insert导出 方式二&#xff1a;hive shell 命令导出 方式三&#xff1a;export导出到HDFS上 目标&#xff1a; 将hive表中的数据导出到其他任意目录&#xff0c;例如linux本地磁盘&#xff0c;例如hd…

Jenkins设置root权限(13)

1.将 Jenkins 账号加入到 root 组中。 gpasswd -a jenkins root2.修改/etc/sysconfig/jenkins文件&#xff0c;添加如下配置。 JENKINS_USER"root" JENKINS_GROUP"root"3.重启 Jenkins service Jenkins restart4.验证 groups jenkins jenkins : jenkin…

pnpm项目内网迁移技巧

概述 因为公司项目需要&#xff0c;经常要从外网将代码拷贝到内网进行调试&#xff0c;因为pnpm是基于链接的npm管理工具&#xff0c;所以pnpm的项目迁移和普通的npm项目不一样。 步骤 离线安装pnpm # 在互联网设备执行 pnpm 的安装 npm i pnpm --install-strategyshallow …

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…