这是我关于StackOverflow的第一个问题,请耐心等待。
我几天前就开始学习ReactJS了,还有一些事情我不太清楚。
如何用ReactJS替换jQuery事件处理程序?
我正在使用这个小小的选择菜单,但我使用jQuery创建它,现在我想将它用作ReactJS组件,我试图管理
$('.select').click(function(e) {
e.preventDefault();
e.stopPropagation();
$(this).toggleClass('expanded');
$('#'+$(e.target).attr('for')).prop('checked',true);
});
$(document).click(function() {
$('.select').removeClass('expanded');
});
请在此处查看完整代码:https://codepen.io/Wael-Alsabbouh/pen/GvWvzv
这是我在ReactJS中所做的,但仍然无法正常工作!
import React from 'react';
export default class select extends React.Component {
/**
* Show and hide select options
*/
constructor(props) {
super(props);
this.state = { addClass: false, value: '', isToggleOn: true };
this.handleClick = this.handleClick.bind(this);
this.handleChange = this.handleChange.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn,
addClass: !this.state.addClass,
}));
}
handleChange(e) {
this.setState({
value: e.target.value,
});
e.preventDefault();
}
/**
* React render
*/
render() {
const classNames = ['select'];
if (this.state.addClass) {
classNames.push('expanded');
}
return (
<div className={classNames.join(' ')} >
<input type="radio" name="sortType" value={this.handleChange} checked="checked" id="selected-item" onClick={this.handleClick} /><label htmlFor="selected-item">Item 00</label >
<input type="radio" name="sortType" value={this.handleChange.value} onChange={this.handleChange} /><label htmlFor="Item01">Item 01</label>
<input type="radio" name="sortType" value={this.handleChange.value} onChange={this.handleChange} /><label htmlFor="Item02">Item 02</label>
<input type="radio" name="sortType" value={this.handleChange.value} onChange={this.handleChange} /><label htmlFor="Item03">Item 03</label>
<input type="radio" name="sortType" value={this.handleChange.value} onChange={this.handleChange} /><label htmlFor="Item04">Item 04</label>
<input type="radio" name="sortType" value={this.handleChange.value} onChange={this.handleChange} /><label htmlFor="Item05">Item 05</label>
</div>
);
}
}
提前谢谢。
答案 0 :(得分:0)
在较少的文件中删除此
&:nth-child(2) {
margin-top: 2em;
border-top: .06em solid #d9d9d9;
}
}
最好将单选按钮包装在自己的高阶组件中,并让它保持自己的状态。我创建了一个新的Radio类(我不是一个创造性的名字)作为例子。
/*
* A simple React component
*/
class Select extends React.Component {
constructor(props) {
super(props);
this.state = { addClass: false, value: '', isToggleOn: true };
this.handleClick = this.handleClick.bind(this);
this.handleChange = this.handleChange.bind(this);
}
handleClick() {
console.log("hello")
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn,
addClass: !this.state.addClass,
}));
}
handleChange(e) {
this.setState({
value: e.target.value,
});
e.preventDefault();
}
render() {
const classNames = ['select'];
if (this.state.addClass) {
classNames.push('expanded');
}
return <div className={classNames.join(' ')} onChange={this.handleChange}>
<input type="radio" name="sortType" value={this.handleChange.value} checked="checked" id="selected-item" onClick={this.handleClick} /><label htmlFor="selected-item">Item 00</label>
<Radio name={"Item01"}/>
<Radio name={"Item02"}/>
<Radio name={"Item03"}/>
<Radio name={"Item04"}/>
<Radio name={"Item05"}/>
</div>
}
}
class Radio extends React.Component {
constructor(props) {
super(props);
this.state = { isOn:props.isOn?true:false };
this.toggleState=this.toggleState.bind(this)
}
toggleState(){
console.log("Look at me I'm changing my own state for "+this.props.name+"!!!!")
this.setState({isOn:!this.state.isOn})
}
render() {
return <span><input type="radio" name="sortType" value={this.state.isOn} /><label onClick={this.toggleState} htmlFor={this.props.name}>{this.props.name}</label></span>
}
}
/*
* Render the above component into the div#app
*/
React.render(<Select />, document.getElementById('app'));