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

如何在React Native中利用isFocused方法变更组件状态

解决React Native中GooglePlacesAutocomplete聚焦状态监听与UI更新问题

你的代码里直接在渲染逻辑中调用ref.current?.isFocused()无法实现UI自动更新,因为组件只有在状态或props变化时才会触发重新渲染,聚焦状态的改变不会主动触发组件重渲染。下面是常规解决思路和修改后的代码:

核心思路

  • 用useState维护一个聚焦状态变量,以此触发组件重新渲染
  • 借助GooglePlacesAutocomplete封装的onFocus和onBlur回调(该组件基于TextInput实现,原生支持这两个回调)更新状态变量
  • 根据状态变量的值切换UI显示内容

修改后的代码

import React, { useEffect, useRef, useState } from 'react'
import { Animated, Text, View } from 'react-native'
import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete'
import { GOOGLE_PLACES_API_KEY } from '@env'

export default function SearchComponent({ expanded = false, setExpanded }) {

    const ref = useRef();
    const [top] = useState(new Animated.Value(0))
    // 新增状态变量跟踪输入框聚焦状态
    const [isInputFocused, setIsInputFocused] = useState(false)

    useEffect(() => {
        Animated.timing(top, {
            toValue: !expanded ? 70 : 80,
            duration: 150,
            useNativeDriver: false
        }).start();
    }, [expanded, top]);

    return (
        <Animated.View style={{ top }}>
            <GooglePlacesAutocomplete
                ref={ref}
                placeholder='Search'
                onPress={(data, details = null) => {
                    console.log(data, details);
                }}
                // 通过聚焦/失焦回调更新状态
                onFocus={() => setIsInputFocused(true)}
                onBlur={() => setIsInputFocused(false)}
                query={{
                    key: GOOGLE_PLACES_API_KEY,
                    language: 'en',
                    components: 'country:ca'
                }}
            />
            {/* 根据状态变量切换显示文本 */}
            {isInputFocused ? <Text>Hello</Text> : <Text>Hi</Text>}
        </Animated.View>
    )
}

补充说明

如果遇到组件未暴露onFocus/onBlur的特殊场景,也可以通过ref结合定时器或事件监听来检测状态变化,但这种方式效率低于直接使用组件回调,优先推荐前者。

内容的提问来源于stack exchange,提问作者noor.soreti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:34