Vue 3 setInterval 方法行为
Vue 3 setInterval Methods behavior
环境
我有一个 Vue 3 应用程序,它需要一个常量 setInterval()
在后台(游戏循环)中为 运行。
我把它放在 store/index.js
中,然后在 mounted()
上从 views/Playground.vue
调用它。
离开 Playground
时,我打电话给 beforeUnmount()
。确保没有多个 setInterval()
是 运行.
// store/index.js
startGameLoop({ commit, dispatch, getters }) {
commit(
"setIntervalId",
setInterval(() => {
dispatch("addPower", getters["ship/getFuelPerSecond"]);
}, 1000)
);
},
// Playground.vue
beforeUnmount() {
clearInterval(this.intervalId);
}
在 Playground.vue
的顶部有一个分数显示并在 setInterval()
中更新。我使用一个名为 gsap
的库来使不断变化的数字看起来更悦目。
<h2>Points: {{ tweened.toFixed(0) }}</h2>
watch: {
points(n) {
console.log("gsap");
gsap.to(this, { duration: 0.2, tweened: Number(n) || 0 });
},
},
问题
methods
来自 Playground.vue
的发射方式不同,我正在努力理解为什么会这样。
gsap
gsap
中的 watch
每秒都会被触发,就像我对 setInterval()
的期望一样,但是...
图片
我在 Playground 的中心显示和图像,其中 src
部分是 v-bind
到一个名为 getEnemyShipImage
的方法。将来我想以编程方式更改显示的敌舰 - 但该方法每秒调用 34 次。这是为什么?
<img
:class="{ flashing: flash }"
@click="fightEnemie()"
:src="getEnemyShipImage()"
alt=""
/>
getEnemyShipImage() {
console.log("image");
return require("@/assets/ships/ship-001.png");
}
日志(浏览器)
Console Log Output
在不使用 method
的情况下将其移动到某个部分,并将更改图像切换为 watch
。
data: () => {
return {
...
selectedImages: "",
images: [
require("@/assets/ships/ship-001.png"),
require("@/assets/ships/ship-002.png"),
require("@/assets/ships/ship-003.png"),
],
};
},
// initial value
mounted() {
this.selectedImages =
this.images[Math.floor(Math.random() * this.images.length)];
this.$store.dispatch("startGameLoop");
}
// watch score
watch: {
score() {
this.selectedImages =
this.images[Math.floor(Math.random() * this.images.length)];
},
}
它并不完美,但作为初始状态更好。
环境
我有一个 Vue 3 应用程序,它需要一个常量 setInterval()
在后台(游戏循环)中为 运行。
我把它放在 store/index.js
中,然后在 mounted()
上从 views/Playground.vue
调用它。
离开 Playground
时,我打电话给 beforeUnmount()
。确保没有多个 setInterval()
是 运行.
// store/index.js
startGameLoop({ commit, dispatch, getters }) {
commit(
"setIntervalId",
setInterval(() => {
dispatch("addPower", getters["ship/getFuelPerSecond"]);
}, 1000)
);
},
// Playground.vue
beforeUnmount() {
clearInterval(this.intervalId);
}
在 Playground.vue
的顶部有一个分数显示并在 setInterval()
中更新。我使用一个名为 gsap
的库来使不断变化的数字看起来更悦目。
<h2>Points: {{ tweened.toFixed(0) }}</h2>
watch: {
points(n) {
console.log("gsap");
gsap.to(this, { duration: 0.2, tweened: Number(n) || 0 });
},
},
问题
methods
来自 Playground.vue
的发射方式不同,我正在努力理解为什么会这样。
gsap
gsap
中的 watch
每秒都会被触发,就像我对 setInterval()
的期望一样,但是...
图片
我在 Playground 的中心显示和图像,其中 src
部分是 v-bind
到一个名为 getEnemyShipImage
的方法。将来我想以编程方式更改显示的敌舰 - 但该方法每秒调用 34 次。这是为什么?
<img
:class="{ flashing: flash }"
@click="fightEnemie()"
:src="getEnemyShipImage()"
alt=""
/>
getEnemyShipImage() {
console.log("image");
return require("@/assets/ships/ship-001.png");
}
日志(浏览器)
Console Log Output
在不使用 method
的情况下将其移动到某个部分,并将更改图像切换为 watch
。
data: () => {
return {
...
selectedImages: "",
images: [
require("@/assets/ships/ship-001.png"),
require("@/assets/ships/ship-002.png"),
require("@/assets/ships/ship-003.png"),
],
};
},
// initial value
mounted() {
this.selectedImages =
this.images[Math.floor(Math.random() * this.images.length)];
this.$store.dispatch("startGameLoop");
}
// watch score
watch: {
score() {
this.selectedImages =
this.images[Math.floor(Math.random() * this.images.length)];
},
}
它并不完美,但作为初始状态更好。