事件处理

Omi 元素的事件处理和 React 一样和 DOM 元素的很相似,但是有一点语法上的不同:

  • Omi 事件的命名采用小驼峰式(camelCase),而不是纯小写。
  • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template name="component-name">
<div>
<button onClick={this.onClick}>Hello Omi!</button>
<button onClick={(evt)=> {alert('Hello Omi!')}}>Hello Omi!</button>
<button onClick={onClick}>Hello Omi!</button>
</div>
</template>
<script>
const onClick = (evt) => {
alert('Hello Omi!')
}
export default class {
onClick(evt) {
alert('Hello Omi!')
}
}
</script>

事件中的this

你必须谨慎对待 JSX 回调函数中的 this,在 JavaScript 中,class 的方法默认不会绑定 this。如果你忘记绑定 this.handleClick 并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined。

这并不是 React 特有的行为;这其实与 JavaScript 函数工作原理有关。通常情况下,如果你没有在方法后面添加 (),例如 onClick={this.handleClick},你应该为这个方法绑定 this。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template name="component-name">
<div>
<button onClick={this.onClick.bind(this)}>{this.data.title}</button>
</div>
</template>
<script>
export default class {
install() {
this.data = { title: 'Hello Omi!' }
}
onClick() {
this.data.title = 'Hi Eno!'
this.update()
}
}
</script>

向事件处理程序传递参数

在循环中,通常我们会为事件处理函数传递额外的参数。例如,若 id 是你要删除那一行的 ID,以下两种方式都可以向事件处理函数传递参数:

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

上述两种方式是等价的,分别通过箭头函数和 Function.prototype.bind 来实现。

在这两种情况下,React 的事件对象 e 会被作为第二个参数传递。如果通过箭头函数的方式,事件对象必须显式的进行传递,而通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递。