【学习任务】完成 Input 自动 focus 功能
1.1k
等15人参与

题目名称:功能增强,在点击编辑的时候 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;


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
代码块
复制 预览
复制成功!
代码块
复制 预览
复制成功!
0
评论
提交于  2024-05-31 17:02:23

登录后即可查看更多作业,立即

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号