文章目录

  • 一、单向数据流
    • 1. 理念示意图
    • 2. 简述
  • 二、什么是全局状态管理模式
  • 三、重点概念
    • 3.1. 什么是全局状态管理模式?
    • 3.2.全局状态管理工具?
    • 3.3. 什么是 vuex
  • 四、在项目中导入 vuex
    • 4.1. 状态管理配置
    • 4.2. 注册vuex
  • 五、测试 vuex 是否导入成功
    • 5.1. 创建搜索模块
    • 5.2. 注入模块
    • 5.3. 页面使用模块中的数据
    • 5.4. 构建 search 模块
    • 5.5. 对vuex数据操作
  • 六、vuex数据持久化
    • 6.1. 搜索模块数据持久化
    • 6.2. 搜索api
    • 6.3. 页面使用
一、单向数据流
1. 理念示意图

“单向数据流” 理念示意图

2. 简述
  • state,驱动应用的数据源;
  • view,以声明方式将 state 映射到视图;
  • actions,响应在 view 上的用户输入导致的状态变化。

但是,当我们的应用遇到**多个组件共享状态(数据)**时,单向数据流的简洁性很容易被破坏(回忆 search-blogsearch-history 的代码):

  • 多个视图依赖于同一状态(数据)。
  • 来自不同视图的行为需要变更同一状态(数据)。

所以我们不得不通过 父子组件传递数据 的方式,来频繁的修改状态(数据)。但是这种方式是 非常脆弱,通常会导致无法维护的代码。

二、什么是全局状态管理模式

所以我们就需要就想到了一种方案,我们把:

把多个组件之间共用的数据抽离出来,通过一个 单例模式 进行管理,而这种管理的方式就叫做【全局状态管理模式】。

具备 【全局状态管理模式】 的库,就是 【全局状态管理工具】

而在 vue 中存在一个专门的 【全局状态管理工具】,叫做 vuex

因为 uniapp 追随 vue微信小程序 的语法,所以我们可以在 uniapp 中使用 vuex 来进行 【全局状态管理】,并且这是一个 非常被推荐 的选择。

三、重点概念
3.1. 什么是全局状态管理模式?

模式:把多个组件之间共用的数据抽离出来,通过一个 单例模式 进行管理。

3.2.全局状态管理工具?

工具:具备 【全局状态管理模式】 的库

3.3. 什么是 vuex

vue 应用程序进行全局状态管理的工具

四、在项目中导入 vuex
4.1. 状态管理配置

在项目根目录下创建store文件夹,并在store文件夹下创建index.js
内容如下:

// 1. 导入 Vue 和 Vuex
import Vue from 'vue';// uniapp 已默认安装,不需要重新下载
import Vuex from 'vuex';// 2. 安装 Vuex 插件
Vue.use(Vuex);// 3. 创建 store 实例
const store = new Vuex.Store({});export default store;
4.2. 注册vuex

在 main.js 中注册 vuex 插件

// 导入 vuex 实例
import store from './store';
...const app = new Vue({...App,store // 挂载实例对象
});
app.$mount();
五、测试 vuex 是否导入成功

,可以按照模块单独配置,然后,在index.js中引入,来进行对各模块的统一状态管理

5.1. 创建搜索模块

在store文件夹下,创建modules文件夹,并在此文件夹下创建search模块(search.js)
内容如下:

export default {// 独立命名空间namespaced: true,// 通过 state 声明数据state: () => {return {msg: 'hello vuex'};}
};
5.2. 注入模块

index.js 中注入模块

...
// 导入 search.js 暴露的对象
import search from './modules/search';// 2. 安装 Vuex 插件
Vue.use(Vuex);
// 3. 创建 store 实例
const store = new Vuex.Store({modules: {search}
});
export default store;
5.3. 页面使用模块中的数据

有3步:

  1. 导入 mapState 函数
  2. 在 computed 中,通过 mapState 函数,注册 state 中的数据,导入之后的数据可直接使用(就像使用 data 中的数据一样)
    // mapState(模块名, [‘字段名’,‘字段名’,‘字段名’])
  3. 使用导入的 vuex 模块中的数据

index.vue 中使用 模块中的数据

<template><view class="search-blog-container"><!-- 3. 使用导入的 vuex 模块中的数据 --><view>{{ msg }}</view>...</view>
</template><script>
// 1. 导入 mapState 函数
import { mapState } from 'vuex';
...
export default {...computed: {// 2. 在 computed 中,通过 mapState 函数,注册 state 中的数据,导入之后的数据可直接使用(就像使用 data 中的数据一样)// mapState(模块名, ['字段名','字段名','字段名'])...mapState('search', ['msg'])}
};
</script>
5.4. 构建 search 模块

search.js

export default {// 独立命名空间namespaced: true,// 通过 state 声明数据state: () => ({searchData: []}),// 更改 state 数据的唯一方式是:提交 mutationsmutations: {/*** 添加数据*/addSearchData(state, val) {if (!val) return;const index = state.searchData.findIndex((item) => item === val);if (index !== -1) {state.searchData.splice(index, 1);}state.searchData.unshift(val);},/*** 删除指定数据*/removeSearchData(state, index) {state.searchData.splice(index, 1);},/*** 删除所有数据*/removeAllSearchData(state) {state.searchData = [];}}
};
5.5. 对vuex数据操作

对vuex数据操作步骤:

  1. 导入mapMutations 函数,处理mutation的问题
  2. 利用 mapMutations函数,可以直接把vuex中的mutation合并到当前组件的methods中,合并之后,使用mutation就像使用methods中的方法一样
<template><view class="hot-container"><view v-for="(item, index) in tabData" :key="index">{{ item.label }} - {{ index }}</view></view>
</template><script>
// 1. 导入 mapState 函数
// 2. 导入mapMutations 函数,处理mutation的问题
import { mapState, mapMutations } from 'vuex';
import { getHotTabs } from 'api/hot';
export default {data() {return {tabData: [],};},// 组件实例配置完成,但是DOM尚未渲染,进行网络请求,配置响应数据created() {this.loadHotTabs();},methods: {// 利用 mapMutations函数,可以直接把vuex中的mutation合并到当前组件的methods中,合并之后,// 使用mutation就像使用methods中的方法一样...mapMutations('search', ['removeSearchData', 'removeAllSearchData']),// 删除所有数据onDelAllClick() {this.removeAllSearchData();},//  删除指定数据 index角标onClearAll(item, index) {this.removeSearchData(index);},/*** 获取热搜标题数据*/async loadHotTabs() {// uniapp 支持 async awaitconst  res= await getHotTabs();this.tabData = res.content;console.log('res', res.content);},},computed: {// 2. 在 computed 中,通过 mapState 函数,注册 state 中的数据,导入之后的数据可直接使用(就像使用 data 中的数据一样)// mapState(模块名, ['字段名','字段名','字段名'])...mapState('search', ['searchData']),},
};
</script><style lang="scss"></style>
六、vuex数据持久化

已完成 数据和组件的分离,所以【数据持久化】不需要涉及到组件内的代码
用到的api是uni.setStorage,参数key value形式
案例演示:搜索模块

6.1. 搜索模块数据持久化

store/search.js

const STORAGE_KEY = 'search-list';
const HISTORY_MAX = 10;export default {// 独立命名空间namespaced: true,// 通过 state 声明数据state: () => ({// 优先从 storage 中读取searchData: uni.getStorageSync(STORAGE_KEY) || []}),// 更改 state 数据的唯一方式是:提交 mutationsmutations: {/*** 保存数据到 storage*/saveToStorage(state) {uni.setStorage({key: STORAGE_KEY,data: state.searchData});},/*** 添加数据*/addSearchData(state, val) {if (!val) return;const index = state.searchData.findIndex((item) => item === val);if (index !== -1) {state.searchData.splice(index, 1);}// 判断是否超过了最大缓存数量if (state.searchData.length > HISTORY_MAX) {state.searchData.splice(HISTORY_MAX - 1, state.searchData.length - HISTORY_MAX - 1);}state.searchData.unshift(val);// 调用 saveToStoragethis.commit('search/saveToStorage');},/*** 删除指定数据*/removeSearchData(state, index) {state.searchData.splice(index, 1);// 调用 saveToStoragethis.commit('search/saveToStorage');},/*** 删除所有数据*/removeAllSearchData(state) {state.searchData = [];// 调用 saveToStoragethis.commit('search/saveToStorage');}}
};
6.2. 搜索api

搜索结果 - 获取搜索结果数据

import request from '../utils/request';/*** 搜索结果*/
export function getSearchResult(data) {return request({url: '/search',data});
}
6.3. 页面使用

search-result-list.vue

<template><view> 搜索结果 </view>
</template><script>
import { getSearchResult } from 'api/search';
export default {name: 'search-result-list',props: {// 搜索关键字queryStr: {type: String,required: true}},data() {return {// 数据源resultList: [],// 页数page: 1};},created() {this.loadSearchResult();},methods: {/*** 获取搜索数据*/async loadSearchResult() {const { data: res } = await getSearchResult({q: this.queryStr,p: this.page});this.resultList = res.list;console.log(this.resultList);}}
};
</script><style lang="scss"></style>

状态管理 - 全局状态管理工具相关推荐

  1. flutter 局部状态和全局状态区别_Flutter状态管理

    Flutter状态管理 状态管理是声明式编程非常重要的一个概念,我们在前面介绍过Flutter是声明式编程的,也区分声明式编程和命令式编程的区别. 这里,我们就来系统的学习一下Flutter声明式编程 ...

  2. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南

    这篇文档旨在帮助 Android 开发者利用既有的 Android 知识来通过 Flutter 开发移动应用.如果你了解 Android 框架的基本知识,你就可以使用这篇文档作为 Flutter 开发 ...

  3. flutter 局部状态和全局状态区别_Android 开发者遇到 5G、AI,写给 Android 开发者的 Flutter 指南

    ​前言 Flutter 是 Google 用以帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK.Flutter 兼容现有的代码,免费并且开源,在全球开发者中广泛被 ...

  4. react获取全局_使用react hooks实现的简单全局状态管理

    注意,此代码存储库已被弃用,不会再更新维护了. Note that this code repository has been deprecated and will not be updated a ...

  5. vue3使用Pinia进行全局状态管理,Pinia安装和使用,Pinia 和 Vuex的对比

    介绍--为什么要使用 Pinia? Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态. 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export c ...

  6. 在vue项目中引入vuex(全局状态管理器)

    目录 Vuex是什么? State Getter Mutation Action Module 项目结构 Vuex是什么? Vuex是一个专为Vue.js应用程序开发的状态管理模式.它采用集中式存储管 ...

  7. 微信小程序:全局状态管理mobx-miniprogram(类似store)

    一.背景 需求是,每个播放视频的地方都有控制是否静音的按钮,点某一个静音则全局静音. 问题:由于我的每个小卡片都是一个组件,本质是每个页面引几次同一个组件,刚开始用的setData,但是这样每个卡片中 ...

  8. 微信小程序全局状态管理store

    wxMiniStore 一个基于原生小程序的Mini全局状态管理库,跨页面/组件的数据共享. 1.安装 npm init npm install wxministore -S 2.微信开发者工具中勾选 ...

  9. 小程序全局状态管理,在页面中获取globalData和使用globalSetData

    GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex.redux全局状态管理的解决方案,但是在一个完整的项目中各组件 ...

最新文章

  1. 南昌职高计算机录取分数线,南昌运输职业技术学校2021年招生录取分数线
  2. python爬取天气_python3爬取各类天气信息
  3. 没想到租房也要会编程?
  4. BIO bi_sector submit_bio make_request_fn
  5. Microsoft SQL Server中的事务(转载)
  6. php 正规标题,一些PHP面试标题
  7. [机器学习]总结特征工程干货
  8. [HTML]HTML5实现可编辑表格
  9. QlikSense导入oracle数据,【主流BI分析工具对比】12款顶级BI分析工具最佳用例
  10. 图像处理_Opencv中Mat矩阵中data、size、depth、elemSize、step等属性的理解
  11. 前端实战项目:前端框架Vue3.0项目教程(一)Vue3.0环境的搭建
  12. 网页自动填表html,风越网页表单批量自动填写工具
  13. java中.rtf文件变成文本文件
  14. Vimium、CrxMouse配置信息
  15. 008 怎么取消隐藏文件扩展名
  16. Visual Studio 2017卸载不干净
  17. 外置USB供电与内置锂电池供电自动切换电路
  18. 高科路由器有虚拟服务器设置吗,高科(GAOKE)路由器怎么设置无线网络?
  19. 还在做创业梦?醒醒!
  20. C语言象棋小程序1.0版(def C++版)

热门文章

  1. AI顶会,正在使用AI来审阅AI论文
  2. 汤涛院士:科技强,必须应用数学强
  3. 教育部:到2021年建设1万个左右国家级一流本科专业点
  4. 数学史上最简单却最复杂的公式在此
  5. 这28张图绝非超现实,都是在真实世界中存在的
  6. java文件下载至linux乱码,JAVA 文件下载乱码问题解决办法
  7. SQLite、MySQL和PostgreSQL 三种关系数据库比较
  8. 有向图的邻接表描述 c++
  9. 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
  10. 据说这是双11前互联网人的一天~