状态管理 - 全局状态管理工具

文章目录

          • 一、单向数据流
            • 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>

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

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

相关文章

Nacos SDK for Scala 发布

脱胎于历经阿里巴巴10年生产验证的内部产品&#xff0c;支持具有数百万服务的大规模场景&#xff0c;Nacos作为高性能的动态服务发现、配置管理和服务管理平台从2018年开源以来&#xff0c;版本迭代速度很快&#xff0c;已经发布到1.2.1&#xff0c;已支持企业使用Nacos生产高可…

对话阿里云:开源与自研如何共处?

头图 | CSDN 下载自东方 IC来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;责编 | 晋兆雨从「鲜为人知」的专业名词&#xff0c;到 2006 年的精准定义&#xff0c;再到如今全面上云时代的「百花齐放」&#xff0c;云计算的发展趟过蛮荒之地&#xff0c;已形成极具规…

Flink 流批一体的实践与探索

自 Google Dataflow 模型被提出以来&#xff0c;流批一体就成为分布式计算引擎最为主流的发展趋势。流批一体意味着计算引擎同时具备流计算的低延迟和批计算的高吞吐高稳定性&#xff0c;提供统一编程接口开发两种场景的应用并保证它们的底层执行逻辑是一致的。对用户来说流批一…

uniapp 用户登录

文章目录一、登录基础1. 登录组件2. 页面引用组件3. 明确登录的实现思路4. 封装 action 调用登录接口5. 保存用户登录状态6. 成已登录的用户视图6. 现退出登录功能一、登录基础 1. 登录组件 对于 登录 功能来说提供了两个登录的入口。 那么大家想一下&#xff0c;现在我们已…

Vue 组件开发 - 数据输入框组件

目录 设计通用组件的一般思路组件效果1. HTML结构2. index.js3. input-number.js3.1 input-number.js代码注解设计通用组件的一般思路 明确需求; 设计API(组件的API:只来自props、events 和 slots); 2.1 确定命名、规则 2.2 编写业务逻辑 即使逻辑的第一版没做好,后续还可…

活动预告 | 2020移动云客户高端峰会即将揭幕,邀您一起携手云端!

一直以来&#xff0c;移动云致力于不断丰富自身产品体系&#xff0c;延伸服务深度和广度&#xff0c;提供“云网一体、贴身服务、随心定制、安全可控”的云服务&#xff0c;致力成为5G时代你身边的智慧云。依托中国移动网络资源与本地化服务团队&#xff0c;移动云为政府、互联…

如何在CDN边缘节点执行你的JavaScript?

Serverless和边缘计算都是目前云计算领域备受瞩目的研究和应用方向。做为拥有超过130Tbps带宽分发能力的阿里云CDN&#xff0c;巨大的边缘网络有超过2800个节点遍布全球&#xff0c;如何将中心源站的计算能力下沉到边缘节点&#xff0c;进一步降低客户端访问延时进而提升用户体…

微信小程序+腾讯地图 获取定位与地图选点插件

文章目录一、思路二、逆地址解析2.1. app.json2.2. 页面加入2.3. 后台代码三、地图插件调用3.1. app.json加入3.2. js页面加入3.3. wxml页面成功截图:腾讯位置服务官网&#xff1a; https://lbs.qq.com一、思路 通过 wx.getLocation 返回经纬度传到后台&#xff0c;后台调用腾…

前端工具安装和运行相关

目录1. nodemon 运行出错&#xff1a;无法运行脚本2. XXX~待续1. nodemon 运行出错&#xff1a;无法运行脚本 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\nodemon.ps1&#xff0c;因为在此系统上禁止运行脚本。 解决办法&#xff1a; 管理员身份打开powerShell&#xf…

友盟+联合EB级云数据 实现友盟域和企业私域数据全面融合

友盟联合EB级云数据 实现友盟域和企业私域数据全面融合 2020-04-28 互联网大数据计算 国内领先的第三方全域数据智能服务商友盟&#xff0c;联合阿里云EB级云数据仓库MaxCompute为企业提供面向分析的&#xff0c;实现友盟域数据与企业私域数据全面融合的自助分析服务“U-DOP…

微信小程序之实现地图定位(使用腾讯位置服务插件)

文章目录一. 腾讯位置服务插件简介1. 完整的地图能力2. 地图插件的优势二. 开通腾讯位置服务三、接入插件四、 开发者密钥配置五、插件的使用一. 腾讯位置服务插件简介 1. 完整的地图能力 腾讯位置服务基于微信提供的小程序插件能力&#xff0c;专注于&#xff08;围绕&#…

分享16个经典的免费UI素材网站

免费字体 www.fontspace.com 一键AI抠图 www.remove.bg/zh 在线PS工具/可以转换Sketch文件

单人开发场景下的测试环境实践

在软件研发过程中&#xff0c;“测试环境”是部署最频繁、也是开发者使用最频繁的一种运行环境&#xff0c;稳定而易用的测试环境能够极大提高开发者的工作效率和幸福感。为更好的将阿里巴巴在测试环境管理方面的实践和经验跟广大开发者分享&#xff0c;《云效说码》策划了《阿…

函数计算如何访问 PostgreSQL 数据库

函数计算&#xff08;Function Compute&#xff09;&#xff1a;函数计算 是事件驱动的全托管计算服务。使用函数计算&#xff0c;您无需采购与管理服务器等基础设施&#xff0c;只需编写并上传代码。函数计算为您准备好计算资源&#xff0c;弹性地可靠地运行任务&#xff0c;并…

智能可穿戴迎来长续航焕新活力 出门问问TicWatch Pro 3即将国内上市

人工智能独角兽公司出门问问将于10月21日面向国内市场正式发布全新一代旗舰级全智能手表TicWatch Pro 3&#xff08;4G版&#xff09;。出门问问携手新浪科技举行新品线上发布会&#xff0c;出门问问创始人兼CEO李志飞以及出门问问研发高级总监张博将以直播形式与消费者见证Tic…

uniapp 微信小程序打包发布

文章目录一、打包小程序1. HBuilder X打包2. 小程序发行3. 点击上传4. 扫码体验5. 正式版本一、打包小程序 1. HBuilder X打包 选中项目-点击发行&#xff08;U&#xff09;- 小程序-(微信仅适用于uniapp)&#xff08;W&#xff09; 2. 小程序发行 填写微信小程序名称和微…

祝贺!两位 Apache Flink PMC 喜提 Apache Member

摘要&#xff1a;近期 Apache 软件基金会&#xff08;以下简称 ASF &#xff09;举行了一年一度的董事会选举会议&#xff0c;两位 Apache Flink PMC 当选为 2020 年 ASF 新成员&#xff0c;即 Apache Member。目前&#xff0c;国内&#xff08;华人&#xff09;近 30 位 Apach…

Iceberg 在基于 Flink 的流式数据入库场景中的应用

本文以流式数据入库的场景为基础&#xff0c;介绍引入 Iceberg 作为落地格式和嵌入 Flink sink 的收益&#xff0c;并分析了当前可实现的框架及要点。 应用场景 流式数据入库&#xff0c;是大数据和数据湖的典型应用场景。上游的流式数据&#xff0c;如日志&#xff0c;或增量…

uniapp H5页面打包发布

文章目录1. 打开 HBuilder2. 打开项目3. 点击发行4. 等待项目编译5. 查看路径6. 安装7. 启动1. 打开 HBuilder 2. 打开项目 打开当前要打包的项目 3. 点击发行 &#xff0c;找到【网站 - PC web 或手机 H5 】 确认【网站标题】&#xff0c;无需【网站域名】&#xff0c;直…

Python 让我再次在女同学面前长脸了!(真实案例)

事情是经过这样的&#xff1a;晚上在家王者的时候&#xff0c;微信突然弹出了一条好友添加提醒&#xff0c;一看昵称&#xff0c;居然是我们大学的班花&#xff01;&#xff01;&#xff01;这真是奇怪了&#xff0c;我之前连班花的微信都没加上&#xff0c;这次却突然主动加我…