reactjs - React Native - 关注列表中的第一个可触摸对象
问题描述
我试图在渲染后获得第TouchableOpacity
一个焦点。FlatList
我尝试使用 refs 并从中触发焦点,useEffect
但我无法弄清楚。
这是代码:
import React, {useRef, useEffect} from "react";
import {FlatList, Text, TouchableOpacity, View} from "react-native";
const MyScreen = () => {
const refs = useRef([]);
useEffect (() => {
refs.current[0].focus()
}, []);
const setFocusedElement = (element) => {
console.log(element);
}
return (
<View>
<FlatList
data={[1, 2, 3]}
keyExtractor={(item) => item}
renderItem={({ item, index }) => {
return (
<TouchableOpacity ref={el => refs.current[index] = el} onFocus={() => setFocusedElement(item)}>
<View><Text>{item}</Text></View>
</TouchableOpacity>
);
}}
/>
</View>
);
}
export default MyScreen;
我收到如下错误:“TypeError: undefined is not an object (evalating 'refs.current[0].focus')”
[编辑] 在基于@drew-reese 很好的答案进行了小幅编辑后,裁判正在工作,但焦点仍然没有。
[编辑 2] 这是问题的一个简单示例:https ://snack.expo.dev/@jerrybels/calm-ramen
解决方案
refs
本身是一个 React ref,但您似乎没有正确地按索引设置子 refs。您仍然应该参考refs.current
更新 ref 值。
ref={el => refs.current[index] = el}
您可能会发现为每个正在渲染的子组件显式创建 refs 并将它们作为ref 传递而不是使用回调语法会更好。
const refs = useRef([]);
refs.current = data.map((_, i) => refs.current[i] ?? createRef());
useEffect (() => {
refs.current[0].current.focus();
}, []);
...
<FlatList
data={data}
keyExtractor={(item) => item}
renderItem={({ item, index }) => (
<TouchableOpacity ref={refs.current[index]}>
<View><Text>{item}</Text></View>
</TouchableOpacity>
)}
/>
推荐阅读
- visual-studio-2015 - 在 Visual Studio 上调试
- java - Libgdx 在绘制另一个屏幕时加载一个屏幕
- rest - 为什么 SharePoint 针对 401 HTTP 代码返回太多请求?
- java - 用于 Java 的 PublicKey.load_pkcs1
- c# - 如何在 SQL 批量复制操作中指定两个数据表之间的外键?
- python - Dask 客户端分散在内存中的文件字典大小需要很长时间
- android - 输入字段API周围的android searchview灰色边框> = 26
- python - 启用线程的 Flask 开发服务器为 flask-sqlalchemy 应用程序提供服务变得非常不稳定
- android - 如何在 android 中为 SQLite 启用 Write-Ahead Log(WAL) 日志模式?
- java - 调试时遇到存储过程。但它不起作用(数据未插入数据库)