我有一个使用React构建的简单天气应用程序.App.js代码在其return()语句中包括以下内容:

<Routes>
  <Route exact path="/" element={<Form />} />
  <Route exact path="/weather/*" element={<Weather />} />
</Routes>

Form.jsx接受用户输入,设置为状态,如下所示:

export default function Form() {
  const [zipCode, setZipCode] = useState('');
  const getZip = (e) => {
    e.preventDefault();
    setZipCode(e.target[0].value);
  }

  return (
    <div>
      <form onSubmit={getZip}>
        <input id="zip" />
    <label htmlFor="zip">Your Zip Code</label>
        <Link to="/Weather" role="button" type="submit" className="btn btn-primary">Enter</Link>
      </form>
  )}

Weather.jsx应该使用该邮政编码并进行API调用以获取天气数据:

function Weather() {
  const { zipCode } = useParams();
  const [forecastObj, setForecastObj] = useState({});

  useEffect(() => {
    fetch(`https://apiservice.com/forecast/loc=${zipCode}`)
}

该应用程序应该显示Form.jsx,并在提交邮政编码后切换到Weather.jsx.当我输入邮政编码时,我得到一个错误:GET https://apiservice.com/forecast/loc=undefined 400,所以邮政编码没有被传递到Weather.jsx.我通过google找到的大多数资源似乎都是针对旧版本的(很多是this.state = state或类似版本).其他资源说使用useParams,这是我在Weather.jsx中设置的.

我错过了什么?

推荐答案

如果将weather Route路径设置为接受zipCode参数,则可以使用Form组件中捕获的值强制导航到那里(而不是使用Link).

然后在Weather组件中,可以使用useParams访问路由参数.

import React, { useState } from "react";
import {
  BrowserRouter as Router,
  Routes,
  Route,
  useParams,
  useNavigate
} from "react-router-dom";

export default function App() {
  return (
    <Router>
      <Routes>
        <Route exact path="/" element={<Form />} />
        <Route exact path="/weather/:zipCode" element={<Weather />} />
      </Routes>
    </Router>
  );
}

function Form() {
  let navigate = useNavigate();
  const [zipCode, setZipCode] = useState("");

  const onSubmit = () => {
    navigate(`/weather/${zipCode}`);
  };

  return (
    <form onSubmit={onSubmit}>
      <label>
        Your Zip Code{" "}
        <input onChange={(e) => setZipCode(e.target.value)} />
      </label>
      <button>submit</button>
    </form>
  );
}

function Weather() {
  const { zipCode } = useParams();

  return `Weather for ${zipCode}`;
}

Edit blissful-snowflake-jklbxb

Javascript相关问答推荐

一次仅播放一个音频

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

vscode扩展-webView Panel按钮不起任何作用

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

Javascript,部分重排序数组

使搜索栏更改语言

使用Java脚本根据按下的按钮更改S文本

虚拟滚动实现使向下滚动可滚动到末尾

如何控制Reaction路由加载器中的错误状态?

ChartJs未呈现

在浏览器中触发插入事件时检索编码值的能力

第二次更新文本输入字段后,Reaction崩溃

Node.js API-queryAll()中的MarkLogic数据移动

为什么我不能使用其同级元素调用和更新子元素?

在ChartJS中使用spanGaps时,是否获取空值的坐标?

Firefox的绝对定位没有达到预期效果

material UI自动完成全宽

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

JavaScript -如何跳过某个字符(S)来打乱字符串中的字符

单击子按钮时将活动切换类添加到父分区