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

React天气站点添加.toFixed后页面空白问题求助

React天气站点添加温度计算代码后页面空白的修复方案

问题原因

你遇到的页面空白是因为组件初始渲染时data是空对象,此时data.main为undefined,尝试访问data.main.temp会触发Cannot read properties of undefined (reading 'temp')错误,导致React组件崩溃。

组件挂载后,useEffect会发起天气请求,但请求完成前组件已经完成第一次渲染,这时候data仍为初始的{},无法读取嵌套的main.temp属性。


修复方案

方案1:使用可选链操作符(推荐)

在访问嵌套属性时添加可选链?.,当属性不存在时返回undefined,配合空值合并操作符??设置默认值,避免报错:

<div><h2>{((data.main?.temp ?? 0) - 273.15).toFixed(2)}°C</h2></div>
  • data.main?.temp:若main不存在,直接返回undefined,避免抛出错误
  • ?? 0:当temp未加载时,用0作为默认值,防止计算出现NaN

方案2:条件渲染

判断data.main存在后再渲染温度元素,确保只有当数据加载完成后才执行计算:

{data.main && (
  <div><h2>{((data.main.temp)-273.15).toFixed(2)}°C</h2></div>
)}

方案3:初始化data时设置默认结构

在useState初始化时给data设置包含main的默认结构,保证初始渲染时所有需要访问的属性都存在:

const [data, setData] = useState({main: {temp: 0}, name: "加载中..."})

完整修复代码(方案1示例)

import axios from "axios";
import React, { useEffect, useState } from "react";
import './style.css';
export function Weather (){

  const apikey = "1815b2003ad4cef38e6b16343a9034ca"
  const [input, setInput] = useState("")
  const [data, setData] = useState({})


const getdetail = (cityName) => {
  const apiURL = "https://api.openweathermap.org/data/2.5/weather?q=" + cityName + "&appid=" + apikey
  axios.get(apiURL).then((res)=>{
    console.log("response",res.data)
    setData(res.data)
  }).catch((err)=> {
    console.log("err", err)
  })
}
const handleinput = (e) =>{
  setInput(e.target.value)
}

const handle = () => {
  getdetail(input)
}
useEffect(()=>{
  getdetail("delhi")
}, [])
  return(
    <>
      <div className="col-md-12">
        <div className="weat">
          <div className="container"> 
            <h2 className="hed">Weather</h2>
          </div>
          <img className="img-fluid" src="bc.jpg" alt="" />
          <div><h3>{data.name ?? "加载中..."}</h3></div>
          <div><h2>{((data.main?.temp ?? 0)-273.15).toFixed(2)}°C</h2></div>
          <div className="container in">
            <input type="text" value={input} onChange={handleinput}/><br/><br/>
            <button className="btn btn-danger" onClick={handle}>查询天气</button>
          </div>
        </div>
      </div>
    </>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:15:08