目录版本 环境搭建新建vue 增加ArcGIS JavaScript 包引用 拷贝资源信息页面测试版本 Vue 2 ArcGIS JavaScript 4.22 注意 ArcGIS JavaScrip
顺晟科技
2022-09-23 10:58:07
187
time-travel 调试、状态快照导入导出等高级调试功能。我们知道, 要在单个组件中进行状态管理是一件非常简单的事情
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmJKAjRx-1630130671727)(img/image-20210609093647215.png)]](/uploads/image/20220923/7ff1bf5026834e19befee7449b24133d.png)
这图片中的三种东西, 怎么理解呢?

Vue 已经帮我们做好了单个界面的状态管理, 但是如果是多个界面呢?
也就是说对于某些状态 (状态1\状态2\状态3) 来说只属于我们某一个视图, 但是也有一些状态( 状态a\状态b\状态c ) 属于多个视图共同想要维护的
全局单例模式 (大管家)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSHGEakV-1630130671731)(img/image-20210609112315789.png)]](/uploads/image/20220923/73e735c96b1f43e29dbafda93cb1e003.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AyjGRPr-1630130671733)(img/image-20210609113931957.png)]](/uploads/image/20220923/4dc95bbc0e5848688a42321fc4e9cfc9.png)
首先, 我们需要在某个地方存放我们的Vuex 代码:
其次, 我们让所有的Vue组件都可以使用这个 store 对象
来到main.js文件, 导入store对象, 并且放在 new Vue中
这样, 在其他的Vue组件中, 我们就可以通过 $store的方式, 获取到这个store对象了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifhPbJqh-1630130671735)(img/image-20210609114408524.png)]
使用Vuex 的 content
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ad44ZIOL-1630130671736)(img/image-20210609115136417.png)]](/uploads/image/20220923/f127f7753ca4491692f6c72c0fd5c419.png)
this.$store.state.属性的方式来访问状态this.$store.commit( 'mutation中方法' ) 来修改状态mutation的方式, 而非直接改变store.state.count
store.state.count的值有时候,我们需要从store中获取一些state变异后的状态,比如下面的Store中:
// 获取 state 平方后的值
const store = new Vuex.Store({
state: {
content: 1000
}
}
我们可以在 Store 中定义 getters
const store = new Vuex.Store({
state: {
content: 1000
},
getters: {
powerContent(state) {
return state.content * state.content;
}
}
})
在组件中调用
<template>
<div id="app">
<h2>-----------app组件 getters 相关信息-------------</h2>
<p>content的平方{{ $store.getters.powerContent }}</p>
</div>
</template>
<script>
import HelloVuex from "./components/HelloVuex";
export default {
name: 'App',
components: {
HelloVuex
}
}
</script>
<style>
</style>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8xElOnz-1630130671737)(img/image-20210609193249477.png)]](/uploads/image/20220923/90911ebea0f9476cade008a7a73d4abb.png)
如果我们已经有了一个获取所有年龄大于20岁学生列表的 getter, 那么代码可以这样来写

getters默认是不能传递参数的, 如果希望传递参数, 那么只能让getter 本身返回另一个函数
比如上面的案例中, 我们希望根据 age 获取用户信息
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5dLuSe95-1630130671737)(img/image-20210610113326867.png)]](/uploads/image/20220923/c8dfbe4fc1f24e87be1024faa1461dd2.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2dMxIgh-1630130671738)(img/image-20210610113312679.png)]](/uploads/image/20220923/1d077be20809452b95e9937a77b56c16.png)
Vuex 的store 状态的更新唯一方式: 提交Mutation
Mutation主要包括两部分:
mutation 的定义方式:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4WB160Pu-1630130671739)(img/image-20210610113935427.png)]](/uploads/image/20220923/325126c0a3c94f32990774095dd14b2a.png)
通过mutation更新状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWyLRswx-1630130671739)(img/image-20210610114006902.png)]](/uploads/image/20220923/a3f867b6205147ea9bc4b487273b225a.png)
在通过mutation 更新数据的时候, 有可能我们希望携带一些额外的参数
Mutation中的代码:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynHPgdW6-1630130671740)(img/image-20210610120032755.png)]](/uploads/image/20220923/de788f1c32bb4c88aab5973a97e2aa93.png)
组件中的代码:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJLsDv7a-1630130671740)(img/image-20210610120055847.png)]](/uploads/image/20220923/5112c22818264d36a8343e80110ec79b.png)
但是如果参数不是一个呢?
methods: {
addCount(count){
this.$store.commit({
type:'increaseCount',
count
})
}
}
mutations: {
increaseCount(state, payload) {
console.log(payload);
state.content += payload.count;
}
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sva0Kiy7-1630130671740)(img/image-20210610121223962.png)]](/uploads/image/20220923/09b3d236a16f4969a97648e18a9ca35a.png)
Vuex 的store 中的state是响应式的, 当state中的数据发生改变时, Vue组件会自动更新
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzlo1b3S-1630130671741)(img/属性被添加到响应式系统中.jpg)]
这就要求我们必须遵守一些Vuex对应的规则:
Vue.set(obj,'newProp',123);
Vue.delete(state,'key')![* [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdJkJ0Sr-1630130671741)(img/image-20210615105432004.png)]](/uploads/image/20220923/b24c6a03b64146f0b177b8a1e7e7120c.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r34lkPry-1630130671742)(img/image-20210615105443464.png)]](/uploads/image/20220923/b5c44a81397b4164a7766c893e6a8bc6.png)



通常情况下, Vuex 要求我们 Mutation中的方法必须是同步方法
比如我们之前的代码, 当执行更新时, devtools 中会有如下信息


但是, 如果Vuex中的代码使用了异步函数


你会发现state中的info数据一直没有被改变, 因为它无法追踪到
我们强调, 不要在Mutation中进行异步操作
Action的基本使用代码如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fel1wxKd-1630130671742)(img/image-20210615145518468.png)]](/uploads/image/20220923/02dfcf5f9d1b4fcd97b46a2d9b98742b.png)
context 是什么?
这样的代码是否多此一举呢?
在Vue组件中, 如果我们调用action中的方法, 那么就需要使用dispatch
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传![(img-VWWHXM0l-1630130671743)(img/image-20210615152539535.png)]](/uploads/image/20220923/316ebaef9d8f41c9af6b9480d8d6a521.png)
同样的, 也是支持传递payload
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rQWVOub9-1630130671745)(img/image-20210615152553344.png)]](/uploads/image/20220923/8da8be7db4084cac8786da948aff7dee.png)
前面我们学习ES6语法的时候说过, Promise经常用于异步操作
ok , 我们来看下面的代码:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIwrMjjn-1630130671746)(img/image-20210615152818172.png)]](/uploads/image/20220923/cdc0582f11e247cfb24f0fac3bd2f986.png)

Modules 是模块的意思, 为什么在Vuex 中我们要使用模块呢?
我们按照什么样的方式来组织模块呢?

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bFej7Ue-1630130671747)(img/image-20210615163913336.png)]](/uploads/image/20220923/12e13b36cc2546d19dd2529808fd9a0c.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4AH1tOi-1630130671747)(img/image-20210615163904913.png)]](/uploads/image/20220923/68d167c623214e9690f4e18057aadd26.png)
this.$store来调用的
上面的代码中, 我们已经有了整体的组织结构, 下面我们来看看具体的局部模块中的代码如何书写

注意:
this.$store来调用的当我们的Vuex 帮助我们管理过多的内容时, 好的项目结构可以让我们的代码更加清晰
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMczg1G8-1630130671747)(img/image-20210615165524047.png)]](/uploads/image/20220923/ac4ab35254184713b7597a0f9368c2bc.png)
09
2022-11
09
2022-11
09
2022-11
19
2022-10
19
2022-10
19
2022-10