javascript - 由于某种原因,在将 onClick 事件映射到
问题描述
我正在尝试使用下拉列表创建一个搜索字段。出于某种原因,在映射一个数组并制作几个“li”的列表之后,onClick 处理程序将 3 个值发送到建议选择(值)函数,甚至没有点击任何他们!
我附上了描述我尝试输入以“s”开头的城市名称的屏幕截图。查看控制台中的输出。
有问题的代码段已被注释。
import React from 'react';
import shortid from 'shortid';
import modules from './CityForm.module.css';
export default class ToDoForm extends React.Component {
state = {
text: '',
items: ["Moscow", "Saratov", "Singapore", "New York"],
suggestions: []
};
handleChange = (event) => {
this.setState({
text: event.target.value
});
const value = event.target.value;
let suggestions = [];
if (value.length > 0) {
const regex = new RegExp(`^${value}`, 'i');
suggestions = this.state.items.sort().filter(v => regex.test(v));
}
this.setState({
suggestions: suggestions
});
}
renderSuggestions() {
const { suggestions } = this.state;
if (suggestions.length === 0) {
return null;
} else {
return (
<ul className={modules.dropdown_list}>
{suggestions.map((item) => <li onClick={this.suggestionSelected(item)}> {item} </li>)}
</ul>
)
}
}
handleSubmit = (event) => {
event.preventDefault();
this.props.onSubmit({
id: shortid.generate(),
text: this.state.text
});
this.setState({
text: ''
});
}
suggestionSelected(value) {
console.log(value);
// this.setState({
// text: value,
// suggestions: []
// });
}
render() {
const { items } = this.state;
return (
<form
className={modules.search_row}
onSubmit={this.handleSubmit}>
<div>
<input
autoComplete="off"
className={modules.input}
name={modules.text}
value={this.state.text}
onChange={this.handleChange}
placeholder="E.g. Moscow..."
onKeyUp={this.filterOptions}
/>
{this.renderSuggestions()}
</div>
<button
className={modules.addcity_btn}
onClick={this.handleSubmit}>
Add city
</button>
</form>
)
}
}
解决方案
尝试将您的图像函数调用更改为
{ suggestions.map((item) => <li onClick={() => this.suggestionSelected(item)}> {item} </li> ) }
通过将其传递为onClick={this.suggestionSelected(item)}
,它实际上是this.suggestionSelected(item)
在渲染时调用该函数
如果您希望将某些内容作为回调赋值本身的参数传回,请将其作为函数引用传递
onClick={() => this.suggestionSelected(item)}
推荐阅读
- python - MySQL 客户端,Django
- javascript - 你可以在 React 渲染道具的模板字符串中使用 jsx 吗?
- node.js - 从用户创建的 OpenLayer 3 地图中保存图层
- javascript - 仅使用一个正则表达式匹配段落中的 3 个单词
- wordpress - 所有产品的 Woocommerce 产品默认描述
- javascript - CodeMirror - 合并视图弯曲拱出现在页面中间,差异不突出
- python - 在 CNN 网络中保存预测图像
- javascript - 如何防止cookies被设置或存储,直到同意?
- vue.js - Vue.js 滚动到同一路线的页面顶部
- java - 防止专注于创建活动