做搜索框的历史记录时遇到的问题
在构建搜索框的历史记录时,您可能遇到了以下问题:
解决方案:
问题一:
问题二:
更好的方法:
摒弃对失焦事件的依赖,而是使用以下方法:
示例代码(react):
import React, { useRef, useState, useEffect } from 'react'; const options = [ { id: 1, name: '1' }, { id: 2, name: '2' }, ]; const App = () => { const containerRef = useRef(null); const [visible, setVisible] = useState(false); useEffect(() => { const onClickOutside = (event) => { if ( containerRef.current && !containerRef.current.contains(event.target) ) { setVisible(false); } }; document.addEventListener('mousedown', onClickOutside); return () => { document.removeEventListener('mousedown', onClickOutside); }; }, [containerRef]); const onFocus = () => { console.log('onFocus'); setVisible(true); }; const onClick = () => { // 手动关闭历史记录,不受失焦事件的影响 setVisible(false); }; return ( <div ref={containerRef}> <input type="text" onFocus={onFocus} /> <button onClick={() => setVisible(false)}>clean</button> <ul style={{ display: visible ? 'block' : 'none' }}> {options.map((item) => ( <li className="item" onClick={onClick} key={item.id}> {item.name} </li> ))} </ul> </div> ); }; export default App;
通过采用这些解决方案,您可以在构建搜索框历史记录时避免上述问题,并实现更流畅的用户体验。