處理事件

本文是本人自己辛苦翻譯的,請轉(zhuǎn)載的朋友注明,翻譯于Z.MJun的簡書 ,感謝!<翻譯不容易啊>


翻譯于2017年6月26日,原文


處理事件的React元素,與DOM元素處理事件相似。

  • React 事件使用駝峰式命名,不要使用全小寫。
  • 使用JSX來傳一個事件執(zhí)行函數(shù),不要使用字符串。
    HTML的樣式如下:
<button onclick="activateLasers()">
  Activate Lasers
</button>

在React使用以下方法

<button onClick={activateLasers}>
  Activate Lasers
</button>

另一個不同點,在react中不能使用返回false。必須調(diào)用preventDefault。Html如下:

<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>

React如下:

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

這里的e是一個虛擬的事件。React定義的這些虛擬的事件滿足W3C spec。所以不需要擔(dān)心瀏覽器兼容問題。想了解更多查看SyntheticEvent
。

當(dāng)使用React的時候,不需要如DOM元素調(diào)用addEventListener方法添加監(jiān)聽者。只需要,在初始化渲染的時候提供一個監(jiān)聽者。

當(dāng)使用ES6類來定義一個組件,常見的模式是將事件處理程序作為類中的一個方法。如,Toggle組件渲染一個按鍵,會讓用戶切換ON或者OFF狀態(tài):

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

Try it on CodePen.
在JSX的回調(diào),this的含義需要反復(fù)理解。在JS里面,類方法中沒有默認(rèn)綁定。如果你忘記了綁定this.handleClick,和點擊onClickthis將會警告未定義。

這個并不是React特有的行為。這是JS的函數(shù)的一部分。一般來說,如果你是一個沒有()方法后,如onclick = {this.handleclick },你應(yīng)該綁定方法。

可以使用以下兩個方法來綁定時間。如果使用初始化綁定(property initializer syntax),可以使用初始化的屬性來綁定回調(diào)方法。

class LoggingButton extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  handleClick = () => {
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

這個語法是默認(rèn)能用在Create React App下的。
如果你不想使用這個方法,還可以使用回調(diào)中動態(tài)加載方法。

class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}

這個語法問題,不同的回調(diào)被創(chuàng)建每個時間點來表達(dá)LoggingButton。多數(shù)情況下,都可以的。但是,如果這個回調(diào)是要穿個低級的組件,這些組件就需要創(chuàng)建額外的重新渲染。比較推薦在constructor綁定或者使用初始化定義,來避免這個實現(xiàn)問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容