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

React Google Autocomplete组件选择地点后状态重置问题求助

问题描述

我在用Google Autocomplete组件,触发onPlaceSelected事件时,想把选中的地点存到父组件的状态数组inputs里。但每次选新地点,之前的数组值都会被清成空数组,再添加新地点,没法追加到现有数组里。我猜可能和refs有关(这个组件好像用到了refs),但我对refs不熟,不知道怎么修,求帮助。

简化示例

// 初始状态:inputs = [place1];
onPlaceSelected={(place2) => {
  console.log(inputs); // 打印空数组
  addInput(place2);
}}
// 执行后得到:input = [place2]; 预期应该是 input = [place1, place2]

// addInput 大致实现
function addInput(place) {
  setInputs([...inputs, place]);
}

实际代码

// Autocomplete组件
<Autocomplete
  id="address"
  name="address"
  className="side-panel__form__input"
  placeholder="Enter an address"
  onPlaceSelected={(place, inputRef, autocomplete) => {
    console.log("inputs", inputs); // 从父组件状态传入的props,本该有元素但这里是空的
    console.log("place", place);
    console.log("inputRef", inputRef);
    console.log("autocomplete", autocomplete);
    handleAddPlace(place);
  }}
  options={{
    types: ["address"],
    componentRestrictions: { country: "us" },
  }}
/>

解决方案

问题出在状态更新的闭包捕获,和refs无关。

你的addInput函数里,setInputs([...inputs, place])依赖的是当前函数作用域里的inputs值。如果onPlaceSelected的回调被组件缓存了(比如Autocomplete内部用固定引用保存了初始回调),这个回调会一直捕获组件首次渲染时的inputs(也就是空数组),每次执行都会基于空数组添加新元素,导致旧内容丢失。

修复方法是用函数式更新获取最新状态值:

function addInput(place) {
  // 用函数接收最新的prevInputs,再返回新数组
  setInputs(prevInputs => [...prevInputs, place]);
}

或者直接在onPlaceSelected回调里写:

onPlaceSelected={(place) => {
  setInputs(prev => [...prev, place]);
}}

这样每次更新状态时,都会基于最新的数组追加元素,不会再出现覆盖旧值的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:25:00