事件处理

    通常,我们在包含派发事件的元素的组件中处理事件。比如在下面的示例中,我们有一个事件处理函数,我们想要在同一个组件中运行函数或方法:

    1. render() {
    2. return (
    3. <button onClick={ this._handleButtonClick }>
    4. click me
    5. </button>
    6. );
    7. }
    8. _handleButtonClick() {
    9. console.log('Button is clicked');
    10. };

    这样使用完全可以,因为 _handleButtonClick 是一个函数,而我们也确实将这个函数传给了 属性。问题是这段代码中并没有保持同一个上下文。所以,如果我们在 _handleButtonClick 函数中使用 this 来获取 Switcher 组件的引用时将会报错。

    1. <button onClick={ this._handleButtonClick.bind(this) }>
    2. click me
    3. </button>

    但是,这样做的话 bind 函数会一次又一次地被调用,这是因为 button 可能会渲染多次。一种更好的方式是在组件的构造函数中来创建绑定:

    构造函数还是部分执行处理函数的好地方。例如,我们有一个表单,但是不想为每个 input 提供一个单独的处理函数。

    1. class Form extends React.Component {
    2. constructor(props) {
    3. super(props);
    4. this._onNameChanged = this._onFieldChange.bind(this, 'name');
    5. this._onFieldChange.bind(this, 'password');
    6. }
    7. return (
    8. <form>
    9. <input onChange={ this._onNameChanged } />
    10. <input onChange={ this._onPasswordChanged } />
    11. </form>
    12. );
    13. }
    14. _onFieldChange(field, event) {
    15. console.log(`${ field } changed to ${ event.target.value }`);
    16. };