如何在Vue3中做一个简单的倒计时?
How to make a simple countdown in Vue3?
我一直在尝试使用 Vue3 设置一个简单的倒计时,但我无法使其正常工作。这在 React 中很容易实现,但我根本不理解 Vue 中的逻辑(3)。所以,我想出了这个:
<script>
export default {
data() {
return {
timer: 10,
interval: ""
}
},
emits: ["start-game"],
methods: {
startGame() {
this.$emit("start-game")
this.startTimer()
},
startTimer() {
clearInterval(this.interval)
while(this.timer != 0) {
this.interval = setInterval(() => {
this.timer--
}, 1000)
}
}
}
}
</script>
您可能希望这会起作用,但它会造成无限循环。不知何故,你不能只在 vue 方法中使用 while
。如果我删除 while
它实际上会无限期地倒计时,但是一旦计时器 运行 结束(命中 0),我需要其他功能来 运行 。 Vue 的处理方式是什么?
不要认为这与 React 或 Vue 有任何关系。您需要在 setInterval
回调中清除您的间隔,以便它知道何时停止。不需要 while
循环:
this.interval = setInterval(() => {
if (this.timer === 0) {
clearInterval(this.interval)
} else {
this.timer--
}
}, 1000)
同时查看这个纯 js 示例:
let timer = 10;
let interval = setInterval(() => {
if (timer === 0) {
clearInterval(interval)
} else {
timer--
console.log(timer)
}
}, 1000)
我遇到了同样的麻烦,我非常高兴地做出反应 react-hook-timer
但 vue 3 中什么都没有。
所以我让你有 3 个主要特征:
- 计时器
- 秒表
- 时间
对于您的用例,计时器是您所需要的,请按照以下步骤操作:
npm i vue-timer-hook
<script>
import { useTimer } from "vue-timer-hook";
export default {
emits: ["start-game"],
setup(props, { emit }) {
const timer = useTimer(10 * 1000, false);
const startGame = () {
emit("start-game")
timer.start()
}
return {
startGame,
timer,
};
},
}
</script>
为了让它工作,我在 mount()
:
中做了这个
let this_ = this; // to make this available as a closure
setInterval(() => {
this_.$options.timer.bind(this_)(); // methods are available in $options, need to bind `this`
}, 1000)
我一直在尝试使用 Vue3 设置一个简单的倒计时,但我无法使其正常工作。这在 React 中很容易实现,但我根本不理解 Vue 中的逻辑(3)。所以,我想出了这个:
<script>
export default {
data() {
return {
timer: 10,
interval: ""
}
},
emits: ["start-game"],
methods: {
startGame() {
this.$emit("start-game")
this.startTimer()
},
startTimer() {
clearInterval(this.interval)
while(this.timer != 0) {
this.interval = setInterval(() => {
this.timer--
}, 1000)
}
}
}
}
</script>
您可能希望这会起作用,但它会造成无限循环。不知何故,你不能只在 vue 方法中使用 while
。如果我删除 while
它实际上会无限期地倒计时,但是一旦计时器 运行 结束(命中 0),我需要其他功能来 运行 。 Vue 的处理方式是什么?
不要认为这与 React 或 Vue 有任何关系。您需要在 setInterval
回调中清除您的间隔,以便它知道何时停止。不需要 while
循环:
this.interval = setInterval(() => {
if (this.timer === 0) {
clearInterval(this.interval)
} else {
this.timer--
}
}, 1000)
同时查看这个纯 js 示例:
let timer = 10;
let interval = setInterval(() => {
if (timer === 0) {
clearInterval(interval)
} else {
timer--
console.log(timer)
}
}, 1000)
我遇到了同样的麻烦,我非常高兴地做出反应 react-hook-timer
但 vue 3 中什么都没有。
所以我让你有 3 个主要特征:
- 计时器
- 秒表
- 时间
对于您的用例,计时器是您所需要的,请按照以下步骤操作:
npm i vue-timer-hook
<script>
import { useTimer } from "vue-timer-hook";
export default {
emits: ["start-game"],
setup(props, { emit }) {
const timer = useTimer(10 * 1000, false);
const startGame = () {
emit("start-game")
timer.start()
}
return {
startGame,
timer,
};
},
}
</script>
为了让它工作,我在 mount()
:
let this_ = this; // to make this available as a closure
setInterval(() => {
this_.$options.timer.bind(this_)(); // methods are available in $options, need to bind `this`
}, 1000)