回答
您可以使用一个将组件保留其状态和切换列表项的值的父组件。然后,您可以为每个列表项目创建组件,这些组件将使活动属性保持您可以点击切换的状态。
class ListItem extends React.Component {
constructor(props) {
super(props);
this.state = {active: false}
}
render() {
return (
<a
onClick={() => {
this.setState(prevState => {
let newState = !prevState.active;
this.props.handleClick(newState, this.props.value);
return {active: newState}
})
}}
className={!this.state.active ? '' : 'selected'}
href="#">
{this.props.value}</a>
)
}
}
class Select extends React.Component {
constructor(props) {
super(props);
this.state = {
showList: false,
value: []
}
this.handleItemClick = this.handleItemClick.bind(this)
}
componentDidMount() {
document.addEventListener('mousedown', (e) => {
if(!this.node.contains(e.target)) {
this.setState({showList: false})
}
})
}
componentWillUnmount() {
document.removeEventListener('mousedown');
}
renderValue() {
let {value} = this.state;
if(!value.length) return "Select..."
else return value.join(', ')
}
toggleList() {
this.setState(prevState => ({showList: !prevState.showList}))
}
handleItemClick(active, val) {
let {value} = this.state;
if(active) value = [...value, val]
else value = value.filter(e => e != val);
this.setState({value})
}
render() {
return (
<div
ref={node => this.node = node}
className="select">
<button onClick={this.toggleList.bind(this)}>
<span className="select_value">
{this.renderValue()}
</span>
</button>
<div
className={"select_list " + (!this.state.showList && 'hide')}>
<ListItem handleClick={this.handleItemClick} value="Lorem" />
<ListItem handleClick={this.handleItemClick} value="Ipsum" />
<ListItem handleClick={this.handleItemClick} value="Dolor" />
</div>
</div>
)
}
}
ReactDOM.render(
<Select />,
document.getElementById('container')
);
button {
background: white;
width: 100%;
padding: 10px 15px;
border: 1px solid rgba(0, 0, 0, .1);
border-radius: 5px;
cursor: pointer;
text-align: left;
}
.select_list {
width: 100%;
background: white;
border: 1px solid rgba(0, 0, 0, .1);
border-radius: 5px;
}
.select_list a {
padding: 10px 15px;
display: flex;
color: black;
text-decoration: none;
position: relative;
align-items: center;
}
.select_list a:before {
width: 15px;
height: 15px;
content: '';
border: 1px solid rgba(0, 0, 0, .1);
border-radius: 5px;
margin-right: 10px;
display: block;
}
.select_list a.selected:before {
background: #0493D1;
content: '✓';
color: white;
font-size: 11px;
text-align: center;
line-height: 15px;
}
.hide {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>
感谢您的重播,但下拉UI像任何下拉并不反映);每当我从一个组件切换到另一个组件时,这条线给我错误。 “无法在'EventTarget'上执行'removeEventListener':需要2个参数,但只有1个参数。” –
document.removeEventListener(“鼠标按下”显示此 –
我传递了一个空函数作为第二个参数,问题已解决,但现在无论何时我切换组件,它都会给我提供componentDidMount()函数的错误“TypeError:Can not read property'contains'of null”。请帮助我@NenadVarcar –
- 1. 语义UI下拉列表中选择
- 2. 多选下拉列表:自定义复选框
- 3. 如何在多选下拉菜单中应用复选框
- 4. 语义UI多选下拉不起作用
- 5. 在多选择下拉反应本土
- 6. 打开在下拉多复选框
- 7. 添加复选框,下拉
- 8. 语义UI下拉提交表单上的选择选项
- 9. 语义ui在下拉列表中选择默认选项
- 10. 语义-UI-反应,选择,多,不能设置默认值
- 11. 反应语义UI搜索支持多选?
- 12. 复选框在下拉
- 13. 复选框顶部下拉
- 14. 复选框下拉列表
- 15. 语义UI下拉选择多个选项后不会清除文本
- 16. 根据下拉选中复选框
- 17. 下拉多选复选标记切换
- 18. 语义UI下拉大小
- 19. 语义UI下拉测试
- 20. 在弹性4复选框多选择下拉列表
- 21. 禁用Jquery复选框单击多选下拉菜单
- 22. 如何使用复选框的多个选择下拉列表
- 23. 多选复选框下拉onchange()不起作用
- 24. 从下面的复选框下拉
- 25. 下拉框中的复选框没有选中类
- 26. MultiSelect下拉选框使用jQuery复选框选择
- 27. 从下拉列表中获取多个值复选框复选框
- 28. 角UI,选择多个下拉过滤
- 29. 从下拉菜单创建复选框
- 30. 语义UI下拉搜索 - 使用输入键进行选择
我试过语义用户界面,但我还没有发现在回答 –