Reactjs 需要帮助将此代码从类组件转换为函数挂钩(React)
目前正在我的项目上使用React版本16.13.1的TypeScript 试图让Autocomplete函数从此开始工作,但示例是类内组件,我正在使用函数挂钩 知道我的代码有什么问题吗?这是我从图书馆得到的一个例子 下面的代码示例Reactjs 需要帮助将此代码从类组件转换为函数挂钩(React),reactjs,Reactjs,目前正在我的项目上使用React版本16.13.1的TypeScript 试图让Autocomplete函数从此开始工作,但示例是类内组件,我正在使用函数挂钩 知道我的代码有什么问题吗?这是我从图书馆得到的一个例子 下面的代码示例 class MyMapWithAutocomplete扩展组件{ 建造师(道具){ 超级(道具) this.autocomplete=null this.onLoad=this.onLoad.bind(this) this.onPlaceChanged=this.on
class MyMapWithAutocomplete扩展组件{
建造师(道具){
超级(道具)
this.autocomplete=null
this.onLoad=this.onLoad.bind(this)
this.onPlaceChanged=this.onPlaceChanged.bind(this)
}
加载(自动完成){
log('autocomplete:',autocomplete)
this.autocomplete=自动完成
}
onPlaceChanged(){
如果(this.autocomplete!==null){
console.log(this.autocomplete.getPlace())
}否则{
console.log('Autocomplete尚未加载!')
}
}
渲染(){
返回(
)
}
}
我目前拥有的
function GoogleMaps({ data = [], center, withAutocomplete = false }: MapProps) {
const [setAutocomplete, autocomplete] = useState() as any
const { isLoaded, loadError } = useLoadScript({
googleMapsApiKey: 'xxx',
libraries: ['places']
})
const onLoad = useCallback((props) => {
setAutocomplete(props)
}, [])
const onPlaceChanged = () => {
console.log('place', onLoad)
if (autocomplete !== null) {
console.log('test', autocomplete.getPlace())
}
}
const renderMap = () => {
return (
<GoogleMap
options={{
mapTypeControl: false,
streetViewControl: false
}}
mapContainerStyle={{ height: '600px' }}
center={center}
zoom={12}>
{data.length > 0 &&
data.map((d, idx) => {
const position = { lat: d.lat, lng: d.lng }
return <Marker position={position} key={`marker-${idx}`} />
})}
{withAutocomplete && (
<Autocomplete onLoad={onLoad} onPlaceChanged={onPlaceChanged}>
<TextField variant="outlined" />
</Autocomplete>
)}
</GoogleMap>
)
}
if (loadError) {
return <div>Map cannot be loaded right now, sorry.</div>
}
return isLoaded ? renderMap() : <CircularProgress />
}
function GoogleMaps({data=[],center,withAutocomplete=false}:MapProps){
const[setAutocomplete,autocomplete]=useState()如有
常量{isLoaded,loadError}=useLoadScript({
谷歌地图:“xxx”,
图书馆:[“地点”]
})
const onLoad=useCallback((道具)=>{
设置自动完成(道具)
}, [])
const onPlaceChanged=()=>{
console.log('place',onLoad)
如果(自动完成!==null){
console.log('test',autocomplete.getPlace())
}
}
常量renderMap=()=>{
返回(
{data.length>0&&
data.map((d,idx)=>{
常量位置={lat:d.lat,lng:d.lng}
返回
})}
{使用自动完成&&(
)}
)
}
如果(加载错误){
很抱歉,现在无法加载返回地图。
}
返回已加载?renderMap():
}
我运行这个时出错了TypeError:setAutocomplete不是函数您在
useState
向后调用中有数组项:
const[setAutocomplete,autocomplete]=useState()如有
你想要这个:
const[autocomplete,setAutocomplete]=useState()如有
数组中的第一项是保存状态值的变量,第二项是React用于维护状态值的函数。在当前代码中,
setAutoComplete
不是一个函数,但autoComplete
是一个函数。您在useState
回调中有数组项:
const[setAutocomplete,autocomplete]=useState()如有
你想要这个:
const[autocomplete,setAutocomplete]=useState()如有
数组中的第一项是保存状态值的变量,第二项是React用于维护状态值的函数。在您当前的代码中,
setAutoComplete
不是一个函数,但autoComplete
是。可能最好将和任何一样去掉-可能有助于捕获此类错误。您可以正确地键入useState
如下:useState('initial val')
或任何状态类型。是的,我不会不同意,wtf对我来说是错误的。我一点也没想到。哦,上帝。这就解决了。是的,我只是为了测试目的才加上的。稍后我将添加适当的类型,最好是去掉,因为任何都可能有助于捕获此类错误。您可以正确地键入useState
如下:useState('initial val')
或任何状态类型。是的,我不会不同意,wtf对我来说是错误的。我一点也没想到。哦,上帝。这就解决了。是的,我只是为了测试目的才加上的。稍后我将添加适当的类型
function GoogleMaps({ data = [], center, withAutocomplete = false }: MapProps) {
const [setAutocomplete, autocomplete] = useState() as any
const { isLoaded, loadError } = useLoadScript({
googleMapsApiKey: 'xxx',
libraries: ['places']
})
const onLoad = useCallback((props) => {
setAutocomplete(props)
}, [])
const onPlaceChanged = () => {
console.log('place', onLoad)
if (autocomplete !== null) {
console.log('test', autocomplete.getPlace())
}
}
const renderMap = () => {
return (
<GoogleMap
options={{
mapTypeControl: false,
streetViewControl: false
}}
mapContainerStyle={{ height: '600px' }}
center={center}
zoom={12}>
{data.length > 0 &&
data.map((d, idx) => {
const position = { lat: d.lat, lng: d.lng }
return <Marker position={position} key={`marker-${idx}`} />
})}
{withAutocomplete && (
<Autocomplete onLoad={onLoad} onPlaceChanged={onPlaceChanged}>
<TextField variant="outlined" />
</Autocomplete>
)}
</GoogleMap>
)
}
if (loadError) {
return <div>Map cannot be loaded right now, sorry.</div>
}
return isLoaded ? renderMap() : <CircularProgress />
}