React中文文档之Handling Events

    xiaoxiao2021-08-20  85

    Handling Events - 事件处理 React元素的事件处理同DOM元素的事件处理非常相似。 有一些语法不同: 1.React事件使用 'camelCase-驼峰式' 命名,而不是 'lowercase-小写字母' 2.使用JSX,传递一个函数作为事件处理,而不是字符串 例如: HTML代码: <button οnclick="activateLaser()"> Activate Lasers </button> 略微不同于React: <button onClick="{activateLaser}"> Activate Lasers </button> 另一个不同是,在React中,不能返回 'false' 来阻止默认行为。必须调用 'preventDefault'。例如,阻止链接打开新页面的默认行为: HTML代码: <a href="#" οnclick="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' 是一个合成事件(synthetic event)。React根据 W3C规范 定义这些合成事件,因此不需要担心跨浏览器的兼容问题。可查看 'SyntheticEvent' 章节学习更多 当使用React,通常不需要调用 'addEventListener',给已经创建的DOM元素添加事件监听。仅当最初渲染元素时,提供一个监听器来代替。 当使用ES6类,定义了一个组件,一个常见的模式是:一个事件处理可定义为该类的一个方法。例如:Toggle组件来渲染一个按钮,允许用户切换 'ON' 和 'OFF' 状态: 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') ); 你不得不小心JSX回调函数中的 'this' 的意思。在JS中,类方法默认没有被绑定。如果你忘记绑定 'this.handleClick',并且传递给 'onClick',当函数被真实调用时,'this' 将会是 'undefined'。 这不是React特有的行为;它是 'JS中函数如何工作' 的一部分(是js的语法)。通常,如果你涉及一个方法,没有 '()' 跟在方法名后面,例如:onClick={this.handleClick},你应该绑定这个方法。 如果调用 'bind' 使你苦恼,有2种方法可以绕过这个。如果你正在使用实验性的 'property initializer syntax-属性初始化语法',你可以使用属性初始化来正确的绑定回调: class LoggingButton extengs 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> ); } } 使用 'Create React App' 方式创建项目(安装方式的一种),这个解析是默认启用的。 如果你没有使用属性初始化语法,你可以在回调函数中,使用一个 '箭头函数'(arrow function),例如: class LoggingButton extengs 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> ); } } 这种语法的问题是:每次 'LoggingButton' 渲染,都会创建一个不同的回调函数。在大多数情况下,是没问题的。然而,如果这个回调函数作为一个prop传递给低级组件(内部组件),这些组件,可能执行一次额外的重新渲染。我们一般推荐在构造器中绑定,避免这类型的性能问题。
    转载请注明原文地址: https://ju.6miu.com/read-676735.html

    最新回复(0)