595
595
  • 发布:2024-03-18 17:40
  • 更新:2024-04-01 15:02
  • 阅读:426

app端vuex的state中数据不更新

分类:uni-app

如下是store/index.js的代码

import Vue from "vue"  
import Vuex from "vuex"  

Vue.use(Vuex);  

const store = new Vuex.Store({  
    state: {  
        viewer: '1111111111', // 在这里定义你的viewer  
    },  
    mutations: {  
        setViewer(state, newViewer) {  
            state.viewer = newViewer;  
            console.log('---------------setViewer----------------');  
            console.log('--------vuex中的viewer为:' + state.viewer + '-----------');  
        }  
    },  
    getters: {  
        getViewer: state => {  
            console.log('---------------getViewer----------------');  
            console.log('--------vuex中的viewer为:' + state.viewer + '-----------');  
            return state.viewer;  
        }  
    },  
})  

export default store

在初始化viewer以后,我通过两个commit来测试:

store.commit('setViewer', '2222222');  
store.commit('setViewer', this.viewer);

在浏览器端打印如下:
17:38:19.638 ---------------setViewer---------------- at store/index.js:13
17:38:19.640 --------vuex中的viewer为:2222222----------- at store/index.js:14
17:38:19.647 ---------------setViewer---------------- at store/index.js:13
17:38:19.655 --------vuex中的viewer为:[object Object]----------- at store/index.js:14
17:38:22.141 拿到的viewer:[object Object] at components/BasicFunction.vue:197
17:38:22.149 vuex中的viewer:[object Object] at components/BasicFunction.vue:198
在app端打印如下:
17:38:23.568 ---------------setViewer---------------- at store/index.js:13 at app-view.js:1607
17:38:23.569 --------vuex中的viewer为:2222222----------- at store/index.js:14 at app-view.js:1607
17:38:23.569 ---------------setViewer---------------- at store/index.js:13 at app-view.js:1607
17:38:23.569 --------vuex中的viewer为:[object Object]----------- at store/index.js:14 at app-view.js:1607
17:38:47.482 拿到的viewer:1111111111 at components/BasicFunction.vue:197
17:38:47.484 vuex中的viewer:1111111111 at components/BasicFunction.vue:198

可以看到虽然setViewer中已经打印出state.viewer是正确的对象,但是实际拿到的仍然是store中初始化定义的viewer:1111111111,请问如何解决

2024-03-18 17:40 负责人:无 分享
已邀请:
595

595 (作者)

补充:
在其余组件中通过如下代码来取viewer,mapState和mapGetters都试过,浏览器上都可以运行,移动端上无法正常取值

computed: {  
            ...mapState(["viewer"])  
        },
喜欢技术的前端

喜欢技术的前端 - QQ---445849201

写了个简单的例子,你看看

  • 595 (作者)

    您好,根据您的回答我将this.setViewer(this.viewer);替换成了this.setViewer(this.viewer),在浏览器上可以正常运行,但是在移动端上报错:Uncaught TypeError: Cannot read property 'commit' of undefined at app-view.js:2734,这个错误我之前使用this.$store.commit也遇到过,后来我在每个组件开头都引入store:import store from "@/store/index.js"从而解决了这个错误,但是这里我并没有使用commit

    2024-03-19 09:49

  • HRK_01

    回复 FoxHunter: 你这个回复我看不太懂,你不是使用了commit了吗?

    2024-03-21 20:23

  • 595 (作者)

    回复 HRK_01: 不好意思回复的时候打错了,我本来是使用store.commit来把viewer传给vuex,这里看了楼主的回答后使用了this.setViewer(this.viewer),但是报错Cannot read property 'commit' of undefined

    2024-03-22 10:23

HRK_01

HRK_01

vue2还是vue3?

  • 595 (作者)

    {

    "dependencies": {

    "request": "^2.88.2",

    "vue": "^2.7.16",

    "vuex": "^3.6.2"

    }

    }

    使用的是vue2,vuex的版本也已经调整过了

    2024-03-21 14:13

  • 595 (作者)

    在另一个组件中我实现了对地图的放大功能,在这个功能调用的函数中,我通过

    console.log('拿到的viewer:' + this.viewer);

    console.log('vuex中的viewer:' + store.state.viewer);

    来检查拿到的viewer以及vuex中viewer的情况,结果打印的仍然是初始值1111111111,也尝试过将初始值设置为null或者空或者一个空对象,都没用。

    2024-03-21 14:26

  • HRK_01

    回复 FoxHunter: 我测试了几遍还是未复现你的问题,希望你能提供一下问题工程zip附件

    2024-03-21 20:24

  • HRK_01

    楼上的示例demo也是正常使用的,你可能没有测过,可以参考一下他的

    2024-03-21 20:25

  • 595 (作者)

    回复 HRK_01: 您好,我已经上传了问题工程zip附件

    2024-03-22 10:21

595

595 (作者)

这是问题工程zip附件

595

595 (作者)

不好意思,上面的附件有误,这个是正确的

  • HRK_01

    你这个示例工程运行不起来,应该是你删了什么东西,能否重新新建一个项目提供一个更精简的代码呢

    2024-03-22 11:48

  • 595 (作者)

    回复 HRK_01: 抱歉,我已经重新上传了一个,我这边测试过可以运行,如果地球没有出来的话麻烦您重新运行几次试试

    2024-03-22 14:31

  • 595 (作者)

    回复 HRK_01: 我这边测试的情况是跟问题描述是一样的,地球出来后您点击“放大”,在内置浏览器上应该是可以正常放大,并且打印的viewer是一个对象。但是在模拟器、移动端中,点击后无法放大,打印的viewer是null

    2024-03-22 14:34

595

595 (作者)

这是最新的问题工程

  • 木杉丶

    renderjs是一个运行在视图层的js,不能直接访问逻辑层数据也不可以使用 uni 相关接口,看了一下我感觉就是<script module="Cesium" lang="renderjs">问题,你在那个vue页面然后要传数据过去给vuex,其实实际应该是没传过去,全局的vue store根本没执行到,所以你别的页面拿不到store数据,至于你打印应该只是打印了单纯的import store from '@/store/index.js'调用的一个打印方法,所以你要不只能那个页面去掉lang="renderjs" 然后把代码能正常执行好,不然估计还是拿不到数据

    2024-03-22 16:25

  • 595 (作者)

    回复 木杉丶是的,但是我想在uniapp引入Cesium并且使用document的话,貌似只能通过renderjs。打印应该是拿到了store中的值,可以打印出来store中viewer的值。所以我想来问问移动端是否真的是取不到值

    2024-03-22 16:42

  • 木杉丶

    回复 FoxHunter: Cesium 应该不只是renderjs可以使用把,ref 获取然后再去调用不行吗

    2024-03-22 17:10

  • 595 (作者)

    回复 木杉丶: https://blog.csdn.net/VarLInKe/article/details/119568955

    我是看的这个,然后找了一个uniapp引入cesium的demo,然后就一直卡在传递viewer了

    2024-03-22 17:41

  • 木杉丶

    回复 FoxHunter: https://gitee.com/zlxfun/uniapp-renderjs-echarts/blob/master/renderjs-echarts-dome/pages/communication.vue 用这个应该可以试了一下

    2024-03-22 18:31

  • HRK_01

    回复 FoxHunter: 看了一下你的代码,你是在视图层里面设置的vuex数据,然后在逻辑层里面去拿vuex的数据,你要知道一个知识点:在APP端逻辑层跟视图层是数据是不互通的。你需要将this.viewer通过ownerInstance传递到逻辑层,但是这个viewer对象比较复杂,无法直接传递,涉及到对自身对象的引用,需要你自身做一些处理。

    2024-04-01 14:44

  • 595 (作者)

    回复 HRK_01: 原来如此,明白,非常感谢!

    2024-04-01 17:23

HRK_01

HRK_01

贴了一下initCesium的代码,可以正常传递viewer,但是需要你自己手动解决处理viewer循环引用的问题

  • 595 (作者)

    谢谢!

    2024-04-01 17:23

  • 595 (作者)

    您好!请问$ownerInstance不是必须通过点击来触发嘛,然后使用了您贴的代码,打印出来的是:

    15:22:49.602 ---------------setViewer---------------- at store/index.js:14

    15:22:49.604 --------vuex中的viewer为:[object Object]----------- at store/index.js:15

    15:22:49.723 逻辑层打印, [Object] {"_dataSourceChangedListeners":{},"_automaticallyTrackDataSourceClocks":true,"_container":{...} at components/InitCesium.vue:149

    15:23:08.393 拿到的viewer:[object Object] at components/BasicFunction.vue:194

    15:23:08.433 vuex中的viewer:[object Object] at components/BasicFunction.vue:195

    但是无法实现放大功能,是不是uniapp不适合用来实现cesium相关项目呢

    2024-04-03 15:23

  • 595 (作者)

    我尝试将你的代码放到项目中,但是经过测试,虽然拿到的viewer都显示是个对象,但是这个经过JSON.stringify传递的viewer貌似是有一点问题。

    [Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'x' of undefined"


    found in


    ---> <BasicFunction> at components/BasicFunction.vue

    我点击放大按钮后会出现这个报错,但是我在放大功能函数中没有“x”这个变量,应该是viewer中的错误

    2024-04-03 15:53

  • HRK_01

    回复 FoxHunter: 是有问题,上面说了viewer里面有很多不给序列化的东西,但是想要让视图层跟逻辑层通信又只能先序列化对象,暂时没有什么好办法。

    2024-04-03 17:03

  • 595 (作者)

    回复 HRK_01: 那请问您还有什么建议的解决办法吗,还能通过其他方式引入cesium从而避开renderjs嘛

    2024-04-07 09:36

  • HRK_01

    回复 FoxHunter: 要引入这种操作dom的库,只能通过renderjs

    2024-04-07 11:31

要回复问题请先登录注册