vuex

活用控制反转 -- 解决一个棘手信息传递问题

喜夏-厌秋 提交于 2020-03-16 18:01:38
某厂面试归来,发现自己落伍了!>>> 在我初学编程的时候,还没写过完整点的项目就看过了一些高阶概念。在没有实践时,这些概念的神奇和强大之处很难被完全体会的。而一旦自己在摸索中应用了,瞬间觉得打开了一扇大门,技能又提升了一个层次。控制反转(Inversion of Control)就是这些强大概念之一。一年前在 MPJ 老师的 频道 上了解到了,但一直没自己独立创造场景用过。直到最近在项目中遇到个坑才用起来。 其实控制反转或者依赖注入(这两个感觉是同一个东西,看你从什么角度看)在前端框架中已经大量使用了。最早由 Angular 普及,后续的现代框架都有应用。比如 React 开发中目前最火的组件设计模式 Render Props,就是控制反转的一种应用。离开框架,在日常开发中,应用这种技巧可以帮助我们解决很多棘手的问题,今天就讲下我在开发中的一次应用。 项目场景是这样的:技术栈是 Nuxt + Vuex。项目需要连接 Web Socket,然后根据 Socket 传来的数据,对 Vuex 里面相应的数据进行修改。公司为了节约成本,将 Socket 数据压缩了,而且不是全量推送,这要求前端收到数据后对数据进行解压,然后对数据进行遍历查找,更新,重新计算和排序,总之对 Socket 数据的处理非常复杂。为了不影响性能,我把 Socket 连接和数据处理放进了 Web Worker

Nuxt项目中使用vuex

折月煮酒 提交于 2020-03-16 17:27:39
某厂面试归来,发现自己落伍了!>>> Nuxt项目中使用vuex vuex官网: https://vuex.vuejs.org/zh/ 搭建Nuxt项目看这个博客: 带你从不懂到搭建第一个Nuxt项目 Nuxt.js 内置引用了 vuex 模块,所以不需要额外安装。 Nuxt.js 会尝试找到应用根目录下的 store 目录,如果该目录存在,它将做以下的事情: 引用 vuex 模块 将 vuex 模块 加到 vendors 构建配置中去 设置 Vue 根实例的 store 配置项 Nuxt.js支持两种store的使用方式 普通方式: store/index.js, 返回一个vuex.sotre实例 模块方式: store目录下的所有.js文件会被转换成为状态树指定命名的子模块 (index 是根模块) 1. 在store目录下创建index.js文件 2. State: 在index.js中编写state区域 vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state.变量名 来获取我们定义的数据; /**漫路h */ export const state = () => ({ count:1 }) 2.1 直接使用state中的数据 2.1.1 代码 随便一个页面,通过this.$store.state.变量名即可获取到数据 2.1

初学Nuxt.js之Vuex状态树

瘦欲@ 提交于 2020-03-12 19:18:09
在Nuxt.js项目中,store目录下的每个.js文件会被转换成为状态树指定命名的子模块.而Index 是跟模块. Nuxt.js内置引用了vuex模块,所以不需要额外安装. Nuxt.js会尝试找到应用跟目录下的store 目录,如果该目录存在,它将会做以下的事情 : 1.引用 vuex 模块 2.将vuex 模块 加到 vendors 构建配置中去 3. 设置 Vue 根实例的 store 配置项 Nuxt.js 支持两种使用方式 store 的方式,你可以择一使用: 1. 普通方式 : store/index.js 返回一个Vuex.Store 实例 2. 模块方式 : store 目录下的每个 .js 文件会被转换成为状态树的指定命名的子模块,而index 则是根模块 这里只演示模块方式 使用状态树模块方式, store目录下的每个.js 不需要返回Vuex.Store 实例,而是应该直接将 state 区域、mutations区域 和 actions 区域暴露出来 : 在页面组件可以像这样是用user 模块 : 需要获取state区域的数据时需要这样才能获取 而需要获取mutations区域的数据时则需要先导入并解构vuex vuex并不限制你的代码结构.但是,它规定了一些需要遵循的规则: 1. 应用层级的状态应该集中到单个 store 对象中。 2.提交

老板让我十分钟上手nx-admin

家住魔仙堡 提交于 2020-03-12 11:19:34
大体流程 参考资料: nx-admin项目地址 首先这里就不讲解vue和vuex之类的基础东西了 有兴趣的可以去官方文档了解。这里根据流程走向大概说说 路由配置 首先找到路由配置,路由配置放在了 src/router/index.js 路由配置里暴露了两个常量 一个是 constantRouterMap 另外一个是 asyncRouterMap 这里先说说 constantRouterMap 。 nx-admin的权限验证大概是 1 默认大家都能访问的页面,不需要权限, 都访问的页面定义为 constantRouterMap 2 需要登录或者需要权限的页面路由定义为 asyncRouterMap 根据后台获取到用户信息role(权限)的不同来动态加载asyncRouterMap中meta.role的权限对应的页面 登录成功后做的事情 点击登录以后 左侧的侧边栏有导航列表。 这里提出两个疑问? 根据路由配置说的 动态加载对应的权限路由 那么侧边栏那么多路由 肯定不能写死吧? 我点击登录后 那些登录流程怎么走的?用户权限存在哪里?token在哪里? 侧边栏的动态渲染 根据问题1来回答 首先我们找到layout也就是 src/views/layout/Layout.vue , 因为在路由配置文件我们看见 asyncRouterMap 中好多组件的父组件都是 Layout 在 Layout

Vuex photoURL and displayName have been passed null to SetUser

假装没事ソ 提交于 2020-03-12 06:26:33
问题 My setUser setUser(state, payload) { state.user = {...payload} } my payload in setUser for random data is user === payload{"uid":"pQOQL9AqMHNsozDE2EFGbMfHZlt1","refreshToken":"AEu4IL3c4doh1ON1ywqNEIXPjijktxAyQsYusC5twuvM61bHK6PpLHENyqKRKGCvNPR5IxBRC7JLQhkjv1qqiVUPdatRVM2Q8VdBCnvxyKkBjOEt_kM6bHCiJI6cdESdmFWZf2B7EjG9MwUJ7l8ASOpdbQLLVs9NtuW94dpNg1dkQShtUXB-sVCafvgtSnluGyZSWGhkt8uJ"," photoURL ": null ," displayName ": null ,"email":"yyy@test.com"} My signUserUp signUserUp(context, payload) { /

Vuex 深知简用

巧了我就是萌 提交于 2020-03-11 11:56:52
Vuex 官网 安装 引入 1、Vuex 是什么? Vuex是一个专为Vue.js应用开发的 状态管理模式 。 它采用集中式储存管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说,用于维护组件之间的数据 什么是状态管理模式 包含以下几个部分 state,驱动应用的数据源; view,以声明方式将state映射到视图; actions,响应在view上的用户输入导致的状态变化。 根据官网总结: 就是把组件的共享状态抽取出来,以一个全局单例模式管理,不论在哪个位置, 任何组件都能获取状态或者触发行为! 好处就是通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性, 我们的代码将会变得更架构化且易维护 1.1、在什么情况下我们使用Vuex? 举个栗子:不同的组件,都需要用户信息以及一些其它的公共数据,每个组件都发一遍请求浪费,不请求组件之间参数传来传去,麻烦不说,容易出错。Vuex就帮你解决这个问题。 Vuex是为开发大型单页应用( SPA )准备的,如果需要构建一个中大型单页应用,需要考虑如何在组件外管理状态,Vuex是不二之选。 总结: Vuex可以帮助我们管理共享状态,并附带了更多的概念和框架。 2、vuex 组成 vue脚手架自动创建内容 export default new Vuex.Store({ state: { /

登录成功后跳转新页面回显用户名,需要刷新才显示的bug解决

我只是一个虾纸丫 提交于 2020-03-11 11:41:30
本篇主要解决两个问题: 一.是登录成功后跳转新页面回显用户名,需要刷新才显示的bug解决, 二.是点击退出按钮同理需要刷新才能回显到正常页面 一. 登录成功后跳转新页面回显用户名,需要刷新才显示的bug解决 原本题意正常流程分析: 存在问题: 从登录成功后,跳转到首页,存在localStorage无数据,或上一次的数据。需要刷新页面才可以获得当前的数据。 解决: 使用vuex可解决 1.首先在store的index.js文件中定义存储数据 2. 在登录页面登录的时候,把用户数据存到mutations中 3. 在App.vue这个页面,回显登录的用户名 二.是点击退出按钮同理需要刷新才能回显到正常页面 解决: 以上问题亲测解决,绝对有效,哪里不懂的私信噢!! 请给努力中的自己点个赞哦! 每天进步一点点`~~~~~ 来源: oschina 链接: https://my.oschina.net/ithuang/blog/3191586

Vuex热更替功能

微笑、不失礼 提交于 2020-03-10 03:25:59
修改state, mutations, getters 等配置时,不触发页面刷新 store.js import Vuex from 'vuex' import defaultState from './state/state' import mutations from './mutations/mutations' import getters from './getters/getters' import actions from './actions/actions' export default () => { const store = new Vuex.Store({ strict: true, //禁止在非mutations内修改data的数据 state: defaultState, mutations, getters, actions }) if (module.hot) { module.hot.accept([ './state/state', './mutations/mutations', './getters/getters', './actions/actions' ], () => { const newState = require('./state/state').default const newMutations = require('.

vuex入门及学习总结

有些话、适合烂在心里 提交于 2020-03-09 12:27:28
State State 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 的 State 中进行存储。 //store下的index.js文件 export default new Vuex.Store({ //在state内定义共享数据 state: { count: 0 }, }) 组件访问 State 中数据的第一种方式: //在组件中this可以省略 count是自定义的共享数据 this.$store.state.count 组件访问 State 中数据的第二种方式: //在template标签下 {{count}} // 1. 从 vuex 中按需导入 mapState 函数 <script> import { mapState } from 'vuex' // 2. 将全局数据,映射为当前组件的计算属性 computed: { ...mapState(['count']) } </script> Mutation Mutation 用于变更 Store中 的数据。 不建议在组件中直接对store中的数据做更改! 只能通过 mutation 变更 Store 数据,不可以直接操作 Store 中的数据。 通过这种方式虽然操作起来稍微繁琐一些,但是可以集中监控所有数据的变化。 this.$store.commit() 是触发 mutations 的第一种方式

详解vuex使用方法

大兔子大兔子 提交于 2020-03-09 09:48:44
vuex有5个属性:State,Getter,Mutation,Action,Module State: 1.可以直接使用 this.$store.state.count 获取 2.使用 mapState 获取: import { mapState } from 'vuex' export default { data ( ) { return { } ; } , computed : { ... mapState ( [ 'count' ] ) } } ; Getter: 维护由State派生的一些状态,这些状态随State状态的变化而变化, 与计算属性一样 ,Getter中的派生状态在被计算之后会被缓存起来,如果被依赖的状态没有发生改变时,就不会重新计算,直接用缓存值。 export default new Vuex . Store ( { state : { count : 1 } , getters : { addCount ( state ) { return state . count + 10 } } } ) 在组件中获取: 1.直接使用 this.$store.getters.addCount 获取 2.使用 mapGetters 获取: import { mapGetters } from 'vuex' export default { data ( ) {