React创建登录按钮时event.preventDefault解析错误如何解决
报错产生原因
你遇到的解析错误由多层代码问题共同导致,核心触发点和关联问题如下:
- 语法层面直接报错的原因:
event.preventDefault;是游离在类所有方法、属性定义外的孤立语句,ES6类的类体只能包含属性、方法、构造函数的定义,不允许直接写执行语句,JS解析到这行时无法识别合法的类结构,直接抛出Unexpected token错误。 - 关联语法错误:
event.preventDefault是DOM事件对象上的方法,必须加()调用才会生效,你漏写了执行括号,就算放对位置也无法实现阻止表单默认跳转的效果。 - 事件绑定完全无效:form标签上写的
on Login = {this.handleLogin}存在三个问题:一是React表单提交事件的标准属性名是onSubmit,你写的on Login中间加了空格、事件名完全错误;二是你自己定义的登录处理方法叫handleLoginChange,绑定的this.handleLogin根本不存在;三是JSX属性里不能随便加空格分隔属性名和值。 - 模板字符串写法错误:alert里拼接变量用的是单引号
'',ES6模板字符串必须用反引号`包裹,否则不会解析${}里的变量,只会原样输出字符串文本。 - 按钮属性错误:
<button>写的type="login"是无效属性值,表单内按钮的合法type值只有submit/reset/button,无效值不会触发预期的表单提交逻辑。
修复方案
按以下步骤修改即可解决报错、实现登录功能:
- 删除类体里游离的
event.preventDefault;语句,把逻辑移入登录提交方法内部,补全调用括号写成event.preventDefault(),放在方法逻辑的最开头阻止表单默认刷新行为。 - 统一登录提交方法的命名,建议改成
handleLoginSubmit避免和输入框change事件的方法混淆,方法要接收event形参,同时把alert的单引号换成反引号,让用户名变量可以正常解析。 - 修正form标签的事件绑定,把错误的
on Login = {this.handleLogin}改成onSubmit={this.handleLoginSubmit},去掉多余空格,绑定到正确的方法上。 - 把登录按钮的
type属性从login改成submit,这样点击按钮时才会触发form的提交事件,执行你写的登录逻辑。
修复后的完整可运行代码如下:
import React, { Component } from 'react'; import classes from './Form.module.css'; class Form extends Component { constructor(props) { super(props); this.state = { username: '' }; } handleUsernameChange = (event) => { this.setState({ username: event.target.value }); }; handleLoginSubmit = (event) => { event.preventDefault(); alert(`登录用户名:${this.state.username}`); }; render() { return ( <form className={classes.Form} onSubmit={this.handleLoginSubmit}> <label>Username</label> <input type="text" value={this.state.username} onChange={this.handleUsernameChange} /> <button type="submit">Login</button> </form> ); } } export default Form;
内容的提问来源于stack exchange,提问作者Lizzy
相关产品推荐
相关产品推荐

