我正在try 创建一个天气应用程序https://havadurumu-7pqg.vercel.app/,并弄清楚如何使用onSubmit或onClick为input values of the search form创建动态路由.

│  pages
│   ├── _app.js
│   ├── _document.js
│   ├── hava
│   │   └── [city].jsx
│   └── index.js
│  

index.js个文件(缩写):

export default function Home() {

  const [city, setCity] = useState('')
  const [weather, setWeather] = useState([]);
  const [loading, setLoading] = useState(false);
  const router = useRouter();

  const fetchWeather = async (e) => {
    e.preventDefault();
    const axiosRequest = require('axios');
    try {
      const url = `https://api.openweathermap.org/geo/1.0/direct?q=${city}&&appid=${process.env.NEXT_PUBLIC_WEATHER_KEY}`;
      const response = await axiosRequest.get(url);
      const url2 = `https://api.openweathermap.org/data/2.5/forecast/daily?lat=${response.data[0].lat}&lon=${response.data[0].lon}&units=metric&cnt=16&appid=${process.env.NEXT_PUBLIC_WEATHER_KEY}`;
      const response2 = await axiosRequest.get(url2);
      router.push(`/hava/${city}`);
      setWeather(response2);
      // useEffect(() => {
      //   console.log(weather.data)
      // },[weather]);


    } catch (error) {
      console.error(error)
    }

  }


  if (loading) {
    return <Spinner/>
  } else {

    return (

        <form onSubmit={fetchWeather}
                    className={'flex justify-between w-full items-center m-auto p-1 bg-transparent border-2 border-gray-400 text-white rounded-2xl'}>
                <div>
                  <input
                      onChange={(e) => setCity(e.target.value)}
                      className={'bg-transparent border-none text-gray-600 focus:outline-none text-sm'}
                      type="text"
                      placeholder="Search city"/>
                </div>
                <button type="submit">
                  <BsSearch size={20}/>
                </button>
              </form>
            </div>
            {/*Weather*/}
            <div className='lg:mx-auto md:mx-auto  overflow-x-auto justify-around container'>
              {weather.data && <Weather data={weather}/>}
            </div>

              
    );
  }

[城市].jsx:

const Weather = ({data}) => {
    // const router = useRouter();
    // const {city} = router.query;
    // console.log(data)

    let dates =[];
    let tempday = [];
    let tempnight = [];
    let conditions = [];
    let description = [];
    let aciklama = []

    try {
         if (data && data.data && data.data.list){
            for (let i = 0; i < 16; i++) {
                Const dt=data.data.list[i].dt;
                const options = {month: 'short', weekday: 'short', day: 'numeric'};
                const date = new Date(dt * 1000).toLocaleDateString('tr-TR', options);
                dates.push(date);
                console.log(data.data.list[i].temp.max)
            }



                for (let i = 0; i < 16; i++) {
                    const temp = Math.trunc(data.data.list[i].temp.max);
                    tempday.push(temp);
                }


                for (let i = 0; i < 16; i++) {
                    const temp = Math.trunc(data.data.list[i].temp.min);
                    tempnight.push(temp);
                }

                for (let i = 0; i < 16; i++) {
                    const condition = data.data.list[i].weather[0].main;
                    conditions.push(condition);
                }


                const city = data.data.city.name;


            for (let i = 0; i < 16; i++) {
                const desc = data.data.list[i].weather[0].description;
                description.push(desc)
            }

            const aciklama = description.map((desc) => {
                switch (desc) {
                    case "overcast clouds":
                        return "cok bulutlu";
                    case "broken clouds":
                        return "cok bulutlu";
                    case "scattered clouds":
                        return "az bulutlu";
                    case "few clouds":
                        return "az bulutlu";
                    case "heavy intensity rain":
                        return "çok yağmur";
                    case "moderate rain":
                        return "yağmurlu";
                    case "light rain":
                        return "az yağmur";
                    case "sky is clear":
                        return "güneşli";
                    default:
                        return desc;
                }
            });
            

    } catch (error) {
        console.error(error)
    }


    return ( 
        <div className="flex">
                            <div className='w-[95px]'>
                                <a className="text-gray-50 text-xs font-bold hover:underline">{dates[0]}</a>
                            </div>
                            <div className="max-w-[24px]">
                                {description[0] === "sky is clear" &&
                                    <Image src={sun} alt='sun-icon'/> || description[0] === "light rain" &&
                                    <Image src={lightrain}
                                           alt='rain-cloud-sun-icon'/> || description[0] === "moderate rain" &&
                                    <Image src={moderaterain}
                                           alt='rain-cloud-icon'/> || description[0] === "heavy intensity rain" &&
                                    <Image src={heavyrain}
                                           alt='rain-cloud-icon'/> || description[0] === "overcast clouds" &&
                                    <Image src={cloud} alt="cloud-sun"/> || description[0] === "broken clouds" &&
                                    <Image src={midcloud} alt="cloud-sun"/> || description[0] === "scattered clouds" &&
                                    <Image src={fewcloud} alt="sun"/> || description[0] === "few clouds" &&
                                    <Image src={fewcloud} alt="sun-cloud-icon"/> || description[0] === "Snow" &&
                                    <Image className="w-3/4" src={snow} alt="snow-icon"/>}
                            </div>
                            <div className='pl-2'>
                                    <span
                                        className="p-0.5 text-xs font-normal uppercase tracking-wider text-gray-800 bg-gray-200 rounded-lg bg-opacity-50">{aciklama[0]}
                                    </span>
                            </div>
                        </div>
)}


export default Weather

版本

├── react-router-dom@6.18.0
├── react@18.2.0
├── next@13.5.6

console.log(response2)

"data": {
    "city": {
        "id": 750269,
        "name": "Bursa",
        "coord": {
            "lon": 29.0675,
            "lat": 40.1827
        },
    },
    "list": [ 
        {// the first day of the 16 days of weather forecast
            "dt": 1699174800,
            "sunrise": 1699159023,
            "sunset": 1699196252,
            "temp": {
                "day": 23.31,
                "min": 16.18,
                "max": 24.06,
                "night": 18.54,
                "eve": 22,
                "morn": 16.39
            },
            
            "pressure": 1010,
            "humidity": 44,
            "weather": [
                        {
                "id": 501,
                "main": "Rain",
                "description": "moderate rain",
                "icon": "10d"
            }
            ],

当通过搜索登录页面上的城市提交表单时,获得了一个

"TypeError: Cannot read properties of undefined (reading 'data') at Weather ([城市].jsx:30:33)"

mentioned error line "[城市].jsx:30:33" is below:

Const dt=data.data.list[i].dt;

聊天提示的可能原因是:

·正在以异步方式获取数据,检索数据时存在延迟

·确保正确定义天气组件以接受天气props

·确认Weather组件正在将天气状态作为props 接收

我的weather.jsx文件在访问来自index.js文件的数据对象时似乎遇到了问题.

推荐答案

我想你的if statement美元不对

if (!data || !data.data || !data.data.list){}

这是说

if `data` does not exist or 
    data.data does not exist or 
    data.data.list does not exist

执行if块内的代码.也许在那一刻data.data还没有被创造出来.如果将if更改为:

if (data && data.data && data.data.list){}

您的代码应该可以工作

Reactjs相关问答推荐

我想将状态设置为true,直到每一张卡片都生成并在多姆中呈现

如何实现黑暗模式 map ?

在一个blog函数中调用setState钩子

如何在MUI X数据网格列中显示IMG?

svg每条路径上的波浪动画

如何在React组件中自动更新图表数据?

如何修复ReferenceError:在构建过程中未定义导航器

如何在一个 Next.js 项目中使用两种布局?

React-router-dom的链接不改变路由(ReactRouter6)

在 reactJS 中导航时页面重新加载

当 React 中的状态发生变化时如何停止重新加载谷歌 map ?

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

Select 建议后如何关闭 vscode 添加自动完成={}

如何禁用来自 React Native API 的某些特定项目的可touch 不透明度

react-markdown 不渲染 Markdown

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

将鼠标悬停在仅适用于该类的第一个实例的 p5.js 类上

为什么我从另一个组件收到错误?

React Router 6,一次处理多个搜索参数

React中`onScroll`和`onScrollCapture`之间的区别?