React项目中SuggestionsList组件内li的onClick点击事件不生效如何解决?
问题解决方案
核心原因是你将SuggestionsList子组件直接定义在了父组件的函数体内,父组件每次触发状态更新(比如输入框内容变化修改inputValue、filteredSuggestions等状态)时,都会重新创建SuggestionsList组件实例,原有的事件绑定会被销毁重置,这是点击事件无法触发的主要原因。按照以下步骤修改即可解决:
步骤1:将SuggestionsList组件移到父组件外部定义
不要在父组件内部嵌套定义子组件,将SuggestionsList放到父组件代码的外层,把需要用到的点击方法通过props传递给子组件,不要直接使用父组件的闭包函数:
// 移到父组件外部定义 const SuggestionsList = (props) => { const { suggestions, inputValue, onSelectSuggestion, displaySuggestions, selectedSuggestion, onItemClick // 新增props接收点击方法 } = props; if (inputValue && displaySuggestions) { if (suggestions.length > 0) { return ( <ul className="suggestions-list" style={styles.ulstyle}> {suggestions.map((suggestion, index) => { const isSelected = selectedSuggestion === index; const classname = `suggestion ${isSelected ? "selected" : ""}`; // 移除多余的<></>片段 return ( <li style={styles.listyle} onClick={() => onItemClick(suggestion.id)} key={index} className={classname} > {suggestion.firstname} </li> ); })} </ul> ); } else { return <div>No suggestions available...</div>; } } return <></>; }; // 父组件内调用SuggestionsList时传入点击方法 <SuggestionsList inputValue={inputValue} selectedSuggestion={selectedSuggestion} onSelectSuggestion={onSelectSuggestion} displaySuggestions={displaySuggestions} suggestions={filteredSuggestions} onItemClick={finddoctor} // 传递父组件的finddoctor方法 />
步骤2:阻止form表单默认提交行为
你的输入框嵌套在form标签内,点击li事件冒泡可能触发form默认提交行为,导致页面刷新,看起来就像点击事件没生效。给form标签添加阻止默认提交的逻辑:
<form className="search-form" onSubmit={(e) => e.preventDefault()}> {/* 原有内容不变 */} </form>
步骤3:修正路由路径的多余空格
你当前的history.push逻辑中,路径末尾多了一个多余的空格,会导致路由匹配失败,删掉空格即可:
function finddoctor(e) { console.log(e); history.push(`/detiled/${e}`); // 删掉路径末尾多余的空格 }
内容的提问来源于stack exchange,提问作者vivek kn
相关产品推荐
相关产品推荐

