在 Vue 中,如果我需要在挂载生命周期钩子时使用来自 getter 的状态怎么办?

In Vue, what if I need to use state from getters while mounted life cycle hook?

我尝试在挂载生命周期挂钩期间使用来自 vuex 的数据。 但是,似乎在我从 vuex 获取数据之前执行了已安装的生命周期挂钩。 如何从 vuex 访问数据并在挂载生命周期挂钩期间使用它?

代码如下

  1. 我是这样用getter带数据的

     computed:{
     targetCounty(){
     return this.$store.getters['parkingModule/byCounty'][this.countyname]
     }
    
  2. 然后我需要通过 init() 方法

    将这些数据提供给我的 class 构造函数
     init(){
     scene =new THREE.Scene();
     const canvas=document.querySelector('#myCanvas');
     canvas.width=innerWidth;
     canvas.height=innerHeight;
    
     camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 
     1000 );
     renderer=new THREE.WebGLRenderer({canvas:canvas})
     renderer.setSize( window.innerWidth, window.innerHeight );
    
     let texture = new THREE.TextureLoader().load('disc.png');
     let rawRad = this.rawRadius
     console.log(this.targetCounty)
     const meshobject =new 
     ParkingSpot(rawRad,this.targetCounty.length,100,texture,this.targetCounty)
     sphereMesh= meshobject.createMesh();
     camera.position.z = 5
     scene.add(sphereMesh);
    
     console.log(sphereMesh.material.size)
    
     },
    
  3. 这个 init() 方法在挂载的生命周期钩子中被调用。

     mounted(){
    
     this.init()
     this.animate();
     // window.addEventListener()
     },
     created(){
     console.log(this.targetCounty)
         // setTimeout(()=>{console.log(this.targetCounty[0])},3000)
    
    
    
     },
    

然而,当我登录 this.targetCounty 时,它 returns 空数组。所以我解决了它 通过在 DOM 中渲染计算 属性 导致计算 属性 运行仅渲染元素。

<template>
    <div>
        <canvas id="myCanvas"></canvas>
    </div>
    <p v-show='false'>{{targetCounty}}</p>
</template>

我创建虚拟 DOM 元素只是为了得到我已安装生命周期的计算 属性(我认为这是非常糟糕的方法)

解决这个问题的方法是什么?

为什么不尝试创建一个显式 returns 值的函数,然后在 mounted() 生命周期挂钩中调用它,将其保存为常量。然后将该常量传递给您的初始化函数。

const targetCountry = this.$store.getters['parkingModule/byCounty'[this.countyname]
this.init(targetCountry)

您可以在 mounted() 挂钩中使用 vm.$watch() 来观察商店的 getter 初始值:

export default {
  mounted() {
    const unwatch = this.$watch(
      () => this.$store.getters['parkingModule/byCounty'][this.countyname],
      targetCounty => {
        if (targetCounty) {
          // handle initial value here...
          this.targetCounty = targetCounty
          this.init()
          this.animate()

          unwatch()
        }
      }
    )
  }
}

demo