开发者问题收集

有没有办法设置 React Google Places AutoComplete 的初始值?

2021-08-12
8386

使用此库 - https://tintef.github.io/react-google-places-autocomplete/docs/ -我有 -

<GooglePlacesAutocomplete
      apiKey={'someKey'}
      autocompletionRequest={{
          componentRestrictions: {
              country: ['uk']
          }
      }}
      selectProps={{
          value: address,
          onChange: (o) => {
              let placeId = o["value"]["place_id"];
              setAddress(o);
              formik.setFieldValue("googlePlaceId", placeId);
          }
      }}
  />

我需要将什么作为“地址”的值传递才能获得初始值?

我尝试过 {label: "some address", place_id: "ChIJNYiUp8ROeEgRikq4Ws76OpU"} 并传递使用实用程序 geocodeByPlaceId 返回的对象。前者到目前为止有效,它在初始化时在输入字段中显示标签,但它似乎损坏了。例如,当我尝试使用退格键删除值时,我的 React 应用程序崩溃并出现控制台中的以下错误 -

Uncaught TypeError: Cannot read property 'place_id' of undefined
    at Object.getOptionValue (index.es.js:30)
    at cr (index.es.js:30)
    at eval (index.es.js:30)
    at Array.some (<anonymous>)
    at lr (index.es.js:30)
    at or (index.es.js:30)
    at eval (index.es.js:30)
    at Array.map (<anonymous>)
    at rr (index.es.js:30)
    at eval (index.es.js:30)
3个回答

最好按照创建者建议的 React-Select 文档来实现。 但要实现您想要做的事情,您需要 React State。

import { useState, useEffect } from "react";
import GooglePlacesAutocomplete from "react-google-places-autocomplete";

const Places = () => {
  const [data, setData] = useState("");
  //our default data

  useEffect(() => {
    data === "" ? setData("") : setData(data.label);
  }, [data]);
  // updating our default data

  return (
    <GooglePlacesAutocomplete
      apiKey={process.env.REACT_APP_MAP_API_KEY}
      autocompletionRequest={{
        componentRestrictions: {
          country: ["ng"], //to set the specific country
        },
      }}
      selectProps={{
        defaultInputValue: data, //set default value
        onChange: setData, //save the value gotten from google
        placeholder: "Start Destination",
        styles: {
          input: (provided) => ({
            ...provided,
            color: "#222222",
          }),
          option: (provided) => ({
            ...provided,
            color: "#222222",
          }),
          singleValue: (provided) => ({
            ...provided,
            color: "#222222",
          }),
        },
      }}
      onLoadFailed={(error) => {
        console.log(error);
      }}
    />
  );
};

export default Places;

我们使用 useEffect 来更新我们设置的默认值,前提是我们得到了实际值。如果我们没有得到实际值,我们就不会保存它。

Ace
2021-12-22

令人讨厌的是,这个库的文档引用了另一个库的文档,react-select。

这是我的组件现在的样子 -

<GooglePlacesAutocomplete
                                apiKey={''}
                                autocompletionRequest={{
                                    componentRestrictions: {
                                        country: ['uk']
                                    }
                                }}
                                selectProps={{
                                    defaultInputValue: formik.status["addressLabel"],
                                    isClearable: true,
                                    value: address,
                                    onChange: (o) => {
                                        let placeId = "";
                                        if(o){
                                            placeId = o["value"]["place_id"];
                                        }
                                        setAddress(o);
                                        formik.setFieldValue("googlePlaceId",placeId);
                                    }
                                }}
                            />

所以在更高的组件中我有 -

const [address, setAddress] = useState();

默认初始值设置如下(使用 formik) -

<Formik
                                initialValues={initialValues}
                                validationSchema={validationSchema}
                                // validationSchema={{}}
                                onSubmit={(values, actions) => {
                                    actions.setSubmitting(false);
                                    submitHandler(values, actions)
                                }}
                                initialStatus={{
                                    addressLabel: addressLabel
                                }}
                            >
                                {
                                    formik => {
                                        return (
                                            <Form formik={formik} {...formProps} />
                                        )
                                    }
                                }
                            </Formik>
user1849962
2021-08-12

我通过以下方式解决了这个问题:

import { usePlacesWidget } from 'react-google-autocomplete'

import TextField from '@mui/material/TextField';



const { ref, autocompleteRef } = usePlacesWidget({
    apiKey: googleApiKey,
    options: {
      types: ['address']
    },
    onPlaceSelected: (place) => {
      console.log(place)
      const latitude = place.geometry.location.lat();
      const longitude = place.geometry.location.lng();
      
      console.log(latitude, longitude)
      setFormState(prevState => ({
        ...prevState,
        location: place.formatted_address || "",
        lat: latitude,
        lng: longitude
      }));
    }
  });

  useEffect(()=> {
    if (!isEditing && ref.current !=null)
    {
      const inputElement = ref.current as HTMLInputElement;
      if (initialForm?.location)
      {
        inputElement.value = initialForm?.location
        inputElement.click()
      }
    }
  }, [isEditing, ref])

然后使用它

<TextField 
 label="Location"
 inputRef={ref}
 disabled={!isEditing}
 >
</TextField>

isEditing 和 initialForm 从父组件设置到子组件,基本上 useEffect 会查找 ref 和 isEditing 中的变化,如果 isEditing 为 false,则存在 initialForm.location 值,只需与 HTMLInputElement (ref.current) 交互即可设置值并单击它(此处的单击是绝对必要的,以正确触发 MUI TextField 的输入标签以正确运行)。抱歉,我今天真的很忙,现在无法发布一个好的可重现的代码片段。

Antonio Atomico Ritucci
2023-11-13