1. import React, {useState, useEffect, useRef} from 'react';
    2. const FileSearch = ({title, onFileSearch}) => { // 从props 取变量,父组件传值
    3. const [ inputActive, setInputActive] = useState(false)
    4. const [value, setValue] = useState('')
    5. let node = useRef(null) // 获取dom节点
    6. useEffect(() => {
    7. const handleInputEvent = (event) => {
    8. const {keyCode} = event
    9. if (keyCode === 13 && inputActive) {
    10. onFileSearch(value)
    11. } else if(keyCode === 27 && inputActive) {
    12. closeInput(event)
    13. }
    14. }
    15. document.addEventListener('keyup', handleInputEvent)
    16. return () => {
    17. document.removeEventListener('keyup', handleInputEvent)
    18. }
    19. })
    20. // useEffect可以使用多个
    21. useEffect(() => {
    22. if (inputActive) {
    23. node.current.focus() // 聚焦
    24. }
    25. }, [inputActive])
    26. const closeInput = (e) => {
    27. e.preventDefault()
    28. setInputActive(false)
    29. setValue('')
    30. }
    31. return (
    32. <div className="alert alert-prim">
    33. // 多个判断
    34. {
    35. !inputActive &&
    36. <div className="d-flex justify-content-between align-items-center">
    37. <span>{title}</span>
    38. <button
    39. type='button'
    40. className="btn btn-primary"
    41. onClick={ () => {setInputActive(true)} }
    42. >搜索</button>
    43. </div>
    44. }
    45. {
    46. inputActive &&
    47. <div className="row">
    48. <input type="text"
    49. value={value}
    50. className="form-control col-8"
    51. ref={node}
    52. onChange={ e => setValue(e.target.value)}
    53. />
    54. <button
    55. type='button'
    56. className="btn btn-primary col-4"
    57. onClick={closeInput}
    58. >
    59. 关闭
    60. </button>
    61. </div>
    62. }
    63. </div>
    64. )
    65. }
    66. export default FileSearch
    1. <FileSearch
    2. title="文档管理"
    3. onFileSearch={(a)=>{console.log(123, a)}}
    4. />