gpt4 book ai didi

javascript - React-Redux 中的倒计时功能

转载 作者:行者123 更新时间:2023-11-29 22:57:09 25 4
gpt4 key购买 nike

所以我在 Symfony 中创建了这个特定的 javascript 函数,遗憾的是,现在我必须在 React-Redux 中重做这一切,将数据从 Symfony 后端发送到 React App。遗憾的是,我仍然是 React 的初学者,我无法让它工作。

这是我的问题的详细信息:我有一个列表,显示停在我 parking 场的所有汽车,每辆车都有一个日期时间值,显示该车何时停放,另一个整数值显示该车将停放多少分钟。

我的函数获取日期时间值,将其转换为 UTC 并向其添加整数值分钟,因此它会给出汽车必须离开 parking 场的时间。

然后它生成当前时间的另一个值:并执行此功能:endingtime - currentTime。

所以我得到了所有汽车的列表,每辆汽车前面都有一个倒计时。

正如我所说,现在我必须将此功能集成到 React-Redux 中:

这是我的 PHP 代码:我会在实体类本身中计算过期时间

    public function getExpiresAt()
{
$parkedAt= $this->getParkedAt();
$expires = clone $parkedAt;
$expires->modify('+' . $this->getTime() . ' min');

return $expires->format('U');
}

之后,我创建了一个在 Twig 中承载该值的跨度

    <td>
<span class="timer" data-expires="{{ car.getExpiresAt() }}"></span>
</td>

并使用这个函数来创建倒计时:

<script>
var timers = document.querySelectorAll('.timer')

function updateTimers () {

var rightNow = Math.floor((Date.now()/1000)+3600) // in seconds
timers.forEach(function (timer) {
var expires = parseInt(timer.dataset.expires) // in seconds

if (rightNow > expires) {
timer.innerText ='expired'

} else {
// console.log('expires',expires,'rightNow',rightNow);
var seconds = expires - rightNow
var minutes = Math.floor(seconds/60)
var hours = Math.floor(minutes/60)
var days = Math.floor(hours/24)
seconds = ('0' + String(seconds%60)).slice(-2)
minutes = ('0' + String(minutes%60)).slice(-2)
hours = ('0' + String(hours%24)).slice(-2)
timer.innerText = days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's'

}

})

setTimeout(function () {
updateTimers()
}, 100)

}

updateTimers()
</script>

最后这是我的 React 应用程序中的 carList.js:

import React from 'react';
import {Message} from "./Message";
import {Spinner} from "./Spinner";

export class CarList extends React.Component {
render() {
const {carList}=this.props;
console.log(carList);


if (null === carList){
return (<Message message="No cars"/>);
}

return (

<div className="card mb-3 mt-3 shadow-sm">
{ carList.map(car => {
return (

<div className="card-body border-bottom" key={car.id}>
<p className="card-text mb-0">
{car.number}
</p>
<p className="card-text">
<small className="text-muted">{car.parkedAt}</small>
</p>

<p>
<span className="timer"></span>
</p>
</div>

);


})}
</div>
)
}



}

最佳答案

我可以假设你会在 car.expires 中提供汽车停留时间

所以,你应该在 reacts render 中计算过期倒计时:

{carList.map(car => {
return (
<div className="card-body border-bottom" key={car.id}>
.....
<p className="card-text">
<small className="text-muted">Experies in: {this.getExirationTime(car.expires)}</small>
</p>

....
</div>
);
})}

然后您将在我们的 CarList 类中声明此 getExirationTime 方法。此外,您还使用两种 react 方法 (componentDidMount/componentDidUpdate) 通过重新渲染此组件来安排下一次更新 timeres。

export class CarList extends React.Component {
componentDidMount() {
// Schedule the updates and forcer re-render if we had cars.
this.timer = setInterval(() => {
// this.props should be different each time.
const { carList } = this.props;

if (carList !== null && carList.length) {
this.forceUpdate()
};
}, 1000)
}

componentWillUnmount() {
clearInterval(this.timer);
}

getExirationTime(expireIn) {
// modified code from your code
var right Now = Math.floor((Date.now()/1000)+3600);
var expires = parseInt(timer.dataset.expires) // in seconds

if (rightNow > expireIn) {
return 'expired';
} else {
var seconds = expireIn - rightNow
var minutes = Math.floor(seconds/60)
var hours = Math.floor(minutes/60)
var days = Math.floor(hours/24)
seconds = ('0' + String(seconds%60)).slice(-2)
minutes = ('0' + String(minutes%60)).slice(-2)
hours = ('0' + String(hours%24)).slice(-2)

return days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's'
}
}

render() {
const {carList}=this.props;
console.log(carList);
......

仅此而已。如果有汽车,此组件将每秒更新一次。

关于javascript - React-Redux 中的倒计时功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56446518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com