javascript - 如何在类组件中使用带有 useState 的回调,如 setState?
问题描述
我有一个用户可以编辑的文本字段行表,还可以添加新行。当用户单击“添加”按钮添加新行时,我想将焦点设置在最后一行的第一个文本字段上,即刚刚创建的行。这是一些示例代码:
interface Row {
id: string;
desc: string;
firstTextFieldRef: React.MutableRefObject<undefined>;
};
const defaultRow: Row = {
id: '',
desc: '',
firstTextFieldRef: useRef(),
};
const [rows, setRows] = useState<Row[]>([Object.assign(defaultRow, {})]);
当用户单击 addRow 按钮时,我调用此函数:
const addHandler = () => {
setRows([...rows, Object.assign(defaultRow, {})]);
// use setTimeout because setRows^^ is async and rows aren't updated immediately
// other solutions exist, but this works ok for now
setTimeout(() => {
const ref = rows[rows.length - 1].firstTextFieldRef;
if (ref.current) ref.current.focus();
}, 100);
};
我想避免在这里使用 setTimeout。我知道我可以像这样使用 useEffect :
useEffect(() => {
const ref = rows[rows.length - 1].firstTextFieldRef;
if (ref.current) ref.current.focus();
}, [rows]);
但是,添加新行并不是行数组更改的唯一时间。每当用户连续输入输入时,行数组都会更新。
有什么想法吗?
解决方案
但是,添加新行并不是行数组更改的唯一时间。
如果您不关心行更改,而只更改数组长度(即新行),请使用它来触发效果:
useEffect(() => {
const ref = rows[rows.length - 1].firstTextFieldRef;
if (ref.current) ref.current.focus();
}, [rows.length]);
推荐阅读
- c - 只读文件指针中是否需要 fclose()?
- javascript - 来自弹出窗口的 Google Chrome 扩展消息服务工作者
- swift - 快速转换故事板会导致导航按钮松动系统图像
- sql - 将 LAG 限制为特定的行条件
- python - 是否可以为不同的命令集设置两个不同的前缀?[不和谐.py]
- c++ - 成员函数 C++ 的继承类中的未定义符号
- spring-data-jpa - 您如何使用 JPA 数据库表动态管理 IntegrationFlow Spring bean?
- python - AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:
- c++ - 函数中类实例的生命周期
- javascript - 在 React + Apollo/GraphQL 中使用 useLazyQuery 时出现无限循环?