gpt4 book ai didi

javascript - react onClick 事件在有条件地呈现时不触发

转载 作者:行者123 更新时间:2023-11-29 10:30:40 25 4
gpt4 key购买 nike

我正在 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 只会在 isActivetrue 时执行。当搜索字段处于事件状态时,该组件将以所有样式完美呈现。但是,当呈现此组件时,div 上带有 search-dropdown-wrapper 类的 onClick 事件不起作用。

我不确定我哪里做错了。请让我知道是否有任何正确的方法可以做到这一点。谢谢。

最佳答案

我终于成功了。

箭头函数没有错_renderDropdown用过的。问题出在 onBlur附加到类 search-dropdown-container 的父 div 的事件的 _renderDropdown .我已经删除了 onBlur事件从那里添加到 search-dropdown-wrapper分区然后它开始正常工作。

我的想法是,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com