You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React+Redux项目中使用javascript-time-ago实现相对时间展示

React+Redux待办应用动态相对时间实现方案

核心问题说明:你当前的实现逻辑存在本质缺陷,添加待办时直接将格式化后的静态相对时间字符串存入了Redux,这个值不会随着时间推移自动更新,无法实现类似聊天应用的实时相对时间展示效果。


调整思路

  • Redux中仅存储待办添加时的原始时间戳,不存储格式化后的时间文本
  • 在列表渲染组件中实时计算相对时间,同时适配小于1分钟时显示「刚刚添加」的需求
  • 全局注册一次语言包即可,不要放在组件渲染逻辑中重复执行

修改后 Addtodo.js 代码

import { useState } from "react";
import { useDispatch } from "react-redux";
import { addTodos } from "./action";
import ShowData from "./ShowData";

export default function Add() {
  const dispatch = useDispatch();
  const [note, setNewNote] = useState('');

  const add = () => {
    // 直接存入原始时间戳到Redux
    dispatch(addTodos({ name: note, time: Date.now() }));
  };

  return (
    <div>
      <input
        type="text"
        value={note}
        onChange={(e) => setNewNote(e.target.value)}
      />
      <button onClick={add}>添加新待办</button>
      <ShowData />
    </div>
  );
}

修改后 Showtodo.js 代码

import TimeAgo from "javascript-time-ago";
import en from "javascript-time-ago/locale/en";
import { useSelector } from "react-redux";

// 全局注册语言包,仅执行一次
TimeAgo.addDefaultLocale(en);
const timeAgo = new TimeAgo("en-US");

export default function ShowData() {
  const todos = useSelector((state) => state.todos);
  const now = Date.now();

  // 自定义时间格式化逻辑
  const formatTime = (timestamp) => {
    const diff = now - timestamp;
    // 小于60秒展示「刚刚添加」
    if (diff < 60 * 1000) {
      return '刚刚添加';
    }
    return timeAgo.format(timestamp);
  }

  return (
    <div>
      {todos.map((item, i) => (
        <li key={i}>
          {item.name}
          <span style={{ marginLeft: "15px" }}>{formatTime(item.time)}</span>
        </li>
      ))}
    </div>
  );
}

如果需要实现时间自动刷新(比如待办放置1分钟后自动从「刚刚添加」更新为「1 minute ago」),只需要在ShowData组件中添加1分钟触发一次的定时器,更新当前时间触发组件重渲染即可。


内容的提问来源于stack exchange,提问作者Khan Iqbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:21:01