什么是状态管理工具?(vuex)

简介: 什么是状态管理工具?(vuex)

直接使用全局对象的问题



  1. 全局对象里面的数据是普通的JavaScript数据类型,它们不是响应式的,也就说第一次读取渲染有可能没有问题,但是当数据修改过以后,界面没法作出对应的更新,这是一个很大的问题
  2. 全局对象的修改无法追踪,也就是说在应用中的任何一处代码,都可以有机会拿到全局数据,并作出对应的修改,但是我们根本没有办法搞清楚是哪行代码,哪个文件修改了全局数据,这样就非常容易产生bug,而且难以追踪,这就很危险了。
  3. vue是组件化的世界,就像我们的程序,大家也可以发现,组件的构成就像一棵树一样,全局数据一般是从父组件一层层的传递给子组件的。直接从一个组件获取数据被视为一种反模式,这样很容易造成数据的混乱


状态管理三杰



设计理念


  • 一个类似object的全局数据结构 - 称之为store
  • 只能调用特定的方法完成数据的修改


Vuex简介和安装



每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。  Vuex 和单纯的全局对象有以下两点不同:

  • Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  • 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。


新版 Vuex 安装


npm install vuex@next --save
// 保证安装完毕的版本是 4.0.0 以上的
复制代码


测试 Vuex store


import { createStore } from 'vuex'
// 从 vuex 导入 createStore 这个函数,我们发现 vue3 以后,这些第三方的官方库,名字出奇的相似,vue-router 也是以create 开头的,看起来非常的清楚。
const store = createStore({
  state: {
    count: 0
  },  
})
// createStore 接受一个对象作为参数,这些对象中包含了 vuex 的核型概念,第一个概念称之为 state,这里面包含的是我们想放入的在全局共享的数据,这里我们放入一个简单的 count。
// 现在我们已经可以直接访问这个值了,我们可以直接使用 store.state.count 来访问它。
console.log('store', store.state.count)
// 接下来我们来更改状态,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
  mutations: {
    add (state) {
      state.count++
    }
  }
// 有了 mutations 以后,让我们来触发它,要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:
store.commit('add')
console.log('count', store.state.count)
复制代码


Vuex 整合当前应用


定义 store 文件


import { createStore } from 'vuex'
import { testData, testPosts, ColumnProps, PostProps } from './testData'
interface UserProps {
  isLogin: boolean;
  name?: string;
  id?: number;
}
export interface GlobalDataProps {
  columns: ColumnProps[];
  posts: PostProps[];
  user: UserProps;
}
const store = createStore<GlobalDataProps>({
  state: {
    columns: testData,
    posts: testPosts,
    user: { isLogin: false }
  },
  mutations: {
    login(state) {
      state.user = { ...state.user, isLogin: true, name: 'viking' }
    }
  }
})
export default store
复制代码


使用


import { useStore } from 'vuex'
import { GlobalDataProps } from '../store'
...
const store = useStore<GlobalDataProps>()
const list = computed(() => store.state.columns)
复制代码


Vuex getters


vuex getters 文档 :vuex.vuejs.org/zh/guide/ge…

Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。


getters: {
  biggerColumnsLen(state) {
    return state.columns.filter(c => c.id > 2).length
  }
}
// 定义完毕,就可以在应用中使用这个 getter 了
// Getter 会暴露为 store.getters 对象,你可以以属性的形式访问这些值:
const biggerColumnsLen =computed(()=>store.getters.biggerColumnsLen)
复制代码


getColumnById: (state) => (id: number) => {
  return state.columns.find(c => c.id === id)
},
getPostsByCid: (state) => (id: number) => {
  return state.posts.filter(post => post.columnId === id)
}
// 定义完毕以后就可以在应用中使用 getter 快速的拿到这两个值了
const column = computed(() => store.getters.getColumnById(currentId))
const list = computed(() => store.getters.getPostsByCid(currentId))


相关文章
|
Web App开发 Rust JavaScript
webRTC 实现人脸识别
webRTC主要是帮我们处理多媒体应用,如音视频通话,屏幕共享都可以实现,主要基于浏览器API调用,其底层浏览器会调用native C++ 等一些库帮我们实现的,而我们在应用层掉API 即可。
456 0
webRTC 实现人脸识别
|
10月前
|
机器学习/深度学习 人工智能 开发者
阿里云支持DeepSeek-V3和DeepSeek-R1全自动安装部署,小白也能轻松上手!
阿里云PAI平台支持DeepSeek-V3和DeepSeek-R1大模型的全自动安装部署,零代码一键完成从训练到推理的全流程。用户只需开通PAI服务,在Model Gallery中选择所需模型并点击部署,即可快速生成PAI-EAS服务,获取调用信息。整个过程简单快捷,适合各水平开发者轻松上手。
3242 80
|
11月前
|
安全 Shell Linux
Git 基础——《Pro Git》
Git 是一个分布式版本控制系统,支持多种操作来管理和跟踪代码库的变化。以下是常用的操作和命令:
733 37
|
10月前
|
供应链 Serverless BI
基于阿里云区块链服务(BaaS)的供应链金融系统开发与部署
随着区块链技术的快速发展,其在供应链金融领域的应用成为热点。阿里云区块链服务(BaaS)提供安全、高效、易用的平台,支持Hyperledger Fabric和蚂蚁区块链,帮助企业快速构建供应链金融系统。本文通过实战案例展示基于阿里云BaaS开发供应链金融系统的全流程,涵盖企业认证、应收账款融资、交易记录及数据分析等功能,显著提升透明度和可信度,降低融资成本。
|
监控 网络协议 Linux
在Linux中,如何查看当前系统每个 IP 的连接数?
在Linux中,如何查看当前系统每个 IP 的连接数?
|
传感器 Web App开发
示例七、超声波传感器测距
示例七、超声波传感器测距
527 1
WebSocket 心跳机制如何实现
WebSocket 心跳机制如何实现
306 0
|
存储 NoSQL MongoDB
MongoDB数据模型与文档结构详解
【4月更文挑战第30天】MongoDB是一个基于文档的NoSQL数据库,其数据模型由文档(类似键值对集合,支持嵌套和数组)、集合(无需预定义结构的文档组)和数据库(包含集合的组织单元)构成。文档使用BSON格式,支持多种数据类型。在设计数据模型时,应注意避免过度嵌套,利用索引优化查询,并考虑数据生命周期。MongoDB通过引用处理文档间关系,提供灵活性以适应复杂数据结构。
|
缓存 前端开发
前端如何在没有后端配合的情况下获取服务器时间?
现在有一个需求,前端需要同步服务器的时间,因为前端的时间是不可靠的,解决方案有很多,但是不管什么方案,都是需要和服务端进行交互,那么怎么减轻后端的工作量直接实现呢?
668 0
前端如何在没有后端配合的情况下获取服务器时间?
|
弹性计算 网络安全 网络虚拟化
基于CEN、SAG、VPN实现内网互通
当前云计算发展迅速,很多企业会选择上云,但在云上因为各种业务原因,或者是子公司原因,会在云上选择多地域,但云上多地域之间,会有网络隔离无法直接实现内网,在此场景下,内网互通成为一个亟待解决的问题。
基于CEN、SAG、VPN实现内网互通