Got error: `RangeError: invalid time value` while set XAxis date value use date-fns

Got error: `RangeError: invalid time value` while set XAxis date value use date-fns

我正在使用重新图表将数据数组呈现为面积图。 我的代码使用以下行从远程 API 获取 mydata 数组:

const [myData, setMyData] = useState([]);
useEffect(() => {
const getData = async () => {
      const resp =  await fetch('https://api.contoso.xyz/api');
      const jsonResp = await resp.json();
      setMyData(jsonResp);
    };

    getData();
    }, []);

数据 JSON 数组如下所示:

[
{"date": "2022-03-01",
"value": 123456,
},
{"date": "2022-03-02",
"value": 100000,
}
]

React 图表组件如下所示:

...
import { format, parseISO } from date-fns
...
<ResponsiveContainer width="100%" height={400}>
  <AreaChart data={mydata} >
      <Area type="monotone" dataKey="value" stroke="#82CA9D" fill="#82CA9D" />
      <XAxis dataKey="date" tickFormatter={(str) => {
              const dateObj = parseISO(str);
              return format(dateObj, "MMM d");
            }}/>
     <YAxis />
     <Tooltip />
     <CartesianGrid opacity={0.5}/>
  </AreaChart>
</ResponsiveContainer>

当 运行 反应站点时,我收到以下错误

RangeError: Invalid time value
    at Em (main.5e916930.js:2:575929)
    at tickFormatter (main.5e916930.js:2:577712)
    at Function.value (main.5e916930.js:2:406091)
    at Function.value (main.5e916930.js:2:404369)
    at a.value (main.5e916930.js:2:402724)
    at a.value (main.5e916930.js:2:403854)
    at Eu (main.5e916930.js:2:143688)
    at Su (main.5e916930.js:2:143484)
    at pl (main.5e916930.js:2:178073)
    at lc (main.5e916930.js:2:163912)

奇怪的是,如果我将 XAxis 部分更改为下面的内容,本地 运行 实际上会成功显示图表。

<XAxis dataKey="date" tickFormatter={(str) => {
              const dateObj = parseISO(str);
              return format(dateObj, "MMM d");
              return str;
            }}/>

现在,如果我从上面的代码部分中删除 return str;,该图表仍将在本地工作。 当图表不起作用时,如果我在 const dateObj = parseISO(str); 前面添加 console.log(str),我在控制台中获得的输出显示 auto 而不是实际的日期字符串。

不确定是什么导致了这种行为。有人知道我的代码是怎么回事吗?

我只是猜想你可能错过了将你的 string 日期解析为 Date 类型。 format from date-fns 当您将字符串作为输入传递时抛出 RangeError: Invalid time value

下面是包含您的代码的沙箱,它运行良好。

找出问题所在。 myData 数组在最初加载页面时尚未填充(因为提取是异步的?)。这导致 str 值为 auto0(不知道确切原因)。每次我 re-started 在本地测试站点时都会发生这种情况。如果我在本地测试站点已经启动时更改代码,则图表会成功加载而不会出现问题,因为数组已经被填充。​​

为了解决这个问题,我在重新格式化日期字符串之前添加了一个检查条件。

if ( str === 'auto' || str === 0){
      return str;
}else{
      console.log(str
      const dateObj = parseISO(str);
      return format(dateObj, "MMM d");
  }

不确定这是否是解决此类问题的最佳方法。欢迎大家提出更好的建议。