如何在这个选择菜单示例中使用Reactjs事件处理程序而不是jQuery事件处理程序?

时间:2017-08-15 10:34:38

标签: javascript jquery reactjs

这是我关于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>
    );
  }
}

提前谢谢。

1 个答案:

答案 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'));