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

React Router页面跳转保留输入值及输入框无法修改问题排查

问题原因分析

是的,问题确实出在Input的状态设置逻辑上。

在AddressLookup组件中,你给SearchBar传递的value是state?.postcode ?? input:

<SearchBar
  type="Address Look-up"
  placeholderText="by Postcode"
  value={state?.postcode ?? input}
  handleOnInput={(e) => setInput(e.target.value)}
  handleFind={handleFind}
/>

当从表单页跳转过来时,state.postcode存在,所以value会一直绑定state.postcode的固定值。而你修改输入框时,仅更新了input状态,但因为state.postcode始终存在,value不会切换到input,导致输入框显示的还是原始的state.postcode,看起来无法修改。

修复方案

步骤1:初始化input状态时带入state.postcode

把state.postcode作为input状态的初始值,让输入框的value仅绑定input状态:

const [input, setInput] = useState(state?.postcode ?? "");

步骤2:修改SearchBar的value传递

直接将input作为value传给SearchBar,无需再判断state.postcode:

<SearchBar
  type="Address Look-up"
  placeholderText="by Postcode"
  value={input}
  handleOnInput={(e) => setInput(e.target.value)}
  handleFind={handleFind}
/>

步骤3:简化SearchBar组件

移除SearchBar里的条件渲染,直接统一传递value,空值时也能正常显示占位符:

const SearchBar = ({ value = "", handleOnInput, handleFind }) => {
  return (
    <div>
      <Field>
        <Input value={value} onInput={handleOnInput} />
      </Field>
      <div>
        <Button appearance="primary" onClick={handleFind}>
          Find
        </Button>
      </div>
    </div>
  );
};
修改后的完整代码
const AddressLookup = () => {
  const navigate = useNavigate();
  const { state } = useLocation();
  // 初始化时带入state中的postcode
  const [input, setInput] = useState(state?.postcode ?? "");
  const [results, setResults] = useState([
    {
      postcode: "",
      street: "",
      town: "",
      country: 0,
    },
  ]);

  const handleOnClick = (postcode, street, town, country) => {
    navigate("form", {
      state: {
        postcode: postcode,
        street: street,
        town: town,
        country: country,
      },
    });
  };

  const handleFind = () => {
    //api call here
    //setResults(...);
  };

  return (
    <div>
      <SearchBar
        type="Address Look-up"
        placeholderText="by Postcode"
        value={input}
        handleOnInput={(e) => setInput(e.target.value)}
        handleFind={handleFind}
      />
      {results.map((result, index) => {
        return (
          <div
            onClick={() =>
              handleOnClick(
                result.postcode,
                result.street,
                result.town,
                result.country.id
              )
            }
            key={index}
          >
            <div>{result.postcode}</div>
            <div>{result.street}</div>
            <div>{result.town}</div>
            <div>{result.country.name}</div>
          </div>
        );
      })}
    </div>
  );
};

const SearchBar = ({ value = "", handleOnInput, handleFind }) => {
  return (
    <div>
      <Field>
        <Input value={value} onInput={handleOnInput} />
      </Field>
      <div>
        <Button appearance="primary" onClick={handleFind}>
          Find
        </Button>
      </div>
    </div>
  );
};

另外补充一个表单组件的小问题:Town字段的Input value写错了,state?.field应该改为state?.town:

<Input
  value={state?.town ?? form.town}
  onChange={(e) => setForm({ ...form, town: e.target.value })}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:02:48