我正在 React 中构建一个 searchDropdown 组件。我只想在搜索字段处于事件状态时呈现下拉列表。所以我设置了一个条件来渲染下拉菜单。
但是当下拉列表有条件地呈现时,下拉列表中的 onClick
事件不会触发。
我的组件在下面。
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import {List, ListItem} from 'material-ui/List';
import {Card} from 'material-ui/Card';
import Divider from 'material-ui/Divider';
import TextField from 'material-ui/TextField';
import resources from '../../resources/resources';
import cx from 'classnames';
import './SearchDropdown.scss';
class SearchDropdown extends Component {
constructor(props) {
super(props);
this.cardContainerStyle = {
'maxHeight': '300px',
'overflow': 'scroll',
'border': '1px solid rgb(158, 158,158)'
};
this.searchFieldUnderlineStyle = {
'borderBottom': '1px solid #ccc'
}
this.state = {
dropdownStyle: {}
};
}
componentWillReceiveProps(nextProps) {
if (nextProps.isActive && this.props.isActive !== nextProps.isActive) {
this.shouldSetBounds = true;
} else {
this.shouldSetBounds = false;
}
}
componentDidUpdate() {
if(this.shouldSetBounds) {
this._setDropdownBounds();
this.shouldSetBounds = false;
}
}
componentDidMount() {
window.addEventListener('scroll', this._handleScroll);
}
componentWillUnmount() {
window.removeEventListener('scroll', this._handleScroll);
}
_handleScroll = () => {
if (this.props.isActive) {
this._setDropdownBounds();
}
}
_setDropdownBounds() {
const dropdownContainerOffset = this.dropdownContainer.getBoundingClientRect();
const containerTop = dropdownContainerOffset.top;
const containerLeft = dropdownContainerOffset.left;
const viewportHeight = window.innerHeight;
const viewportWidth = window.innerWidth;
const dropdownStyle = {
top: dropdownContainerOffset.top + dropdownContainerOffset.height,
left: dropdownContainerOffset.left
};
if (containerTop > viewportHeight/2) {
dropdownStyle.top = 'auto';
dropdownStyle.bottom = viewportHeight - containerTop;
}
this.setState({ dropdownStyle });
}
_renderDropdown() {
const {onSelect, datalist = []} = this.props;
return (
<div className="search-dropdown-wrapper" style={this.state.dropdownStyle} onClick={(event) => {alert("Outer wrapper")}}>
<Card containerStyle={this.cardContainerStyle}>
<div>
{"Sample Dropdown"}
</div>
</Card>
</div>
);
}
_renderSearchField() {
const {value, handleSearch} = this.props;
return (
<TextField
value={value}
onChange={handleSearch}
fullWidth={true}
hintText={resources.BRAND_SEARCH}
underlineStyle={this.searchFieldUnderlineStyle}
/>
);
}
render() {
const {isActive, onBlur} = this.props;
return (
<div className="search-dropdown-container field-wrapper"
ref={dropdownContainer => this.dropdownContainer = dropdownContainer}
onBlur={onBlur}
>
{this._renderSearchField()}
{isActive && this._renderDropdown()}
</div>
);
}
}
SearchDropdown.propTypes = {
isActive: React.PropTypes.bool.isRequired,
value: React.PropTypes.string,
datalist: React.PropTypes.array,
handleSearch: React.PropTypes.func.isRequired,
onSelect: React.PropTypes.func
}
export default SearchDropdown;
在上面的代码中,
_renderDropdown
只会在 isActive
为 true
时执行。当搜索字段处于事件状态时,组件会以所有样式完美呈现。但是当这个组件被渲染时,类 onClick
的 div
上的 search-dropdown-wrapper
事件不起作用。我不确定我在哪里做错了。请让我知道是否有任何正确的方法可以做到这一点。谢谢。
最佳答案
我终于让它工作了。
使用的箭头函数 _renderDropdown
没有任何问题。问题在于 onBlur
事件附加到具有 search-dropdown-container
类 _renderDropdown
的父 div 上。我已经从那里删除了那个 onBlur
事件并添加到 search-dropdown-wrapper
div。然后它开始正常工作。
我的想法是,search-dropdown-wrapper
位置是 fixed
,因此从技术上讲,它不会作为 search-dropdown-container
的一部分。所以 click
上发生的 search-dropdown-wrapper
事件首先触发 onBlur
的 search-dropdown-container
事件。因此,click
事件不会在 search-dropdown-wrapper
上触发
关于javascript - 当有条件地呈现时,React onClick 事件不会触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46884887/