事件处理(Day7)

React element 事件 VS DOM element 事件

React element 处理事件跟使用 DOM element 处理事件差异:

  • 事件的名称在 React 中都是 camelCase,而在 HTML DOM 中则是小写。
  • 事件的值在 JSX 中是一个 function,而在 HTML DOM 中则是一个 string。
<element onclick="myScript[String]"> \\React DOM
<element onClick="myScript[Function]"> \\HTML DOM

Class Component VS function component

Class Component 或 function component 稍微有不同的写法,但差不多是

  1. 定义 state
  2. 定义事件处理 method 或 function
  3. 将 this 关键字绑定 method ,或如果是使用 Hook useState 去处理更新资料

以下完整例子

Class Component 事件处理

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};
    // 为了让 `this` 能在 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'));

function component 事件处理

const { useState } = React;

function Toggle() {
  const [state, setState] = useState(true);
  
  function handleClick(e) {
    e.preventDefault();
    setState(!state)
  }

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

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

将参数传给 Event Handler,注意使用 bind

class Toggle extends React.Component {
  //略
  
  handleClick(id) {
    console.log(id) //#a5aa
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }
   
  render() {
    return (
      <button onClick={this.handleClick.bind(this, '#a5aa')}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}      </button>
    );
  }}

//略

其他的绑定方法,arrow function

除了使用 bind 也可以写成 arrow function ,而下一篇会继续介绍为什麽要使用 bind 。

button onClick={() => this.deleteRow('id')}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, 'id')}>Delete Row</button>

以上今天

参考资料:
https://zh-hant.reactjs.org/docs/handling-events.html
理解 JS 里面的 bind


<<:  Day 19-制作购物车系统之将资料汇入脚本

>>:  【Day7】:GPIO输入输出(下)

Day 24 Google 演算法的影响

根据 Google 的官方消息指出在 2021 年的六月有对 SEO 的演算法稍作调整。会特别将网页...

[27] 30 天从 Swift 学会 Objective-C:Swift friendly 的 Unavailable 与 convenience init

物件导向的设计中,关於建构物件的方式我们成为建构器(constructor),这关系到物件使用的方式...

CMoney菁英软件工程师战斗营游戏专题开端_Week 5

一个月的光阴已过去 经过一个月的考试筛选 我们遗憾离开一位同学 但在此时 也展开游戏专题的序幕 我选...

毒液2线上

毒液2线上 《毒液2》(英语:Venom: Let There Be Carnage,香港译《毒魔:...

Vue3 ( 进阶 API ) -3

1.Refs 似 Document.getElementById() (1)直操作DOM <i...