题目名称:功能增强,在点击编辑的时候 Input 自动 focus
编程类型: Javascript
技能点: React
题目描述:
认真听本节课程的讲解,在完成 FileList 的基本功能以后,完成对应的增强功能:那就是当点击编辑图标的时候,切换为 Input,现在添加逻辑,让这个 Input 自动 focus,这样就不需要再次点击了
提示:
1 使用 useRef 获得特定的 DOM 节点
2 使用 useEffect 在特定时间点触发 focus
题目名称:功能增强,在点击编辑的时候 Input 自动 focus
编程类型: Javascript
技能点: React
题目描述:
认真听本节课程的讲解,在完成 FileList 的基本功能以后,完成对应的增强功能:那就是当点击编辑图标的时候,切换为 Input,现在添加逻辑,让这个 Input 自动 focus,这样就不需要再次点击了
提示:
1 使用 useRef 获得特定的 DOM 节点
2 使用 useEffect 在特定时间点触发 focus
import React, { useState, useEffect, useRef } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faEdit, faTrash, faTimes } from '@fortawesome/free-solid-svg-icons';
import { faMarkdown } from '@fortawesome/free-brands-svg-icons';
import PropTypes from 'prop-types';
const FileList = ({ files, onFileClick, onSaveEdit, onFileDelete }) => {
const [editStatus, setEditStatus] = useState(false);
const [value, setValue] = useState('');
let node = useRef(null);
useEffect(() => {
const handleInputEvent = (event) => {
const { keyCode } = event;
if (keyCode === 13 && editStatus) {
const editItem = files.find(file => file.id === editStatus);
onSaveEdit(editItem.id, value);
closeSearch(event);
}
if (keyCode === 27 && editStatus) {
closeSearch(event);
}
};
document.addEventListener('keyup', handleInputEvent);
return () => {
document.removeEventListener('keyup', handleInputEvent);
};
});
useEffect(() => {
node.current && editStatus && node.current.focus();
}, [editStatus]);
const closeSearch = (event) => {
event.preventDefault();
setEditStatus(false);
setValue('');
};
return (
<ul className='list-group list-group-flush file-list'>
{
files.map(file => (
<li className='list-group-item bg-light row d-flex align-item-center file-item' key={file.id}>
{
file.id !== editStatus && (
<>
<span className='col-2'><FontAwesomeIcon icon={faMarkdown} size='lg' /></span>
<span className='col-8 c-link' onClick={() => onFileClick(file.id)}>{file.title}</span>
<button
type='button'
className='icon-button col-1'
onClick={() => {
setEditStatus(file.id);
setValue(file.title);
}}
>
<FontAwesomeIcon icon={faEdit} title="编辑" size='lg' />
</button>
<button
type='button'
className='icon-button col-1'
onClick={() => onFileDelete(file.id)}
>
<FontAwesomeIcon icon={faTrash} title="删除" size='lg' />
</button>
</>
)
}
{
file.id === editStatus && (
<>
<div className='col-10'>
<input
className='form-control'
value={value}
onChange={(e) => setValue(e.target.value)}
ref={node}
/>
</div>
<button
type='button'
className='icon-button col-2'
onClick={closeSearch}
>
<FontAwesomeIcon icon={faTimes} title="关闭" size='lg' />
</button>
</>
)
}
</li>
))
}
</ul>
);
};
FileList.propTypes = {
files: PropTypes.array,
onFileClick: PropTypes.func,
onFileDelete: PropTypes.func,
onSaveEdit: PropTypes.func,
};
export default FileList;
登录后即可查看更多作业,立即登录
数据加载中...