表单相关(React 受控、非受控组件)

281 阅读2分钟

一、html中:

表格和表单

WEB基础之: form标签

<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>表格和表单</title>
</head>
<body>
	<h4>规整的表格</h4>
	<!--table标签是表格标签,border属性设置表格的边框厚度,
		width属性设置表格的宽度,align设置表格的对齐方式,cellspacing设置单元格的间距
		tr是行标签,td是单元格标签,th是字体居中加粗的单元格标签,b是字体加粗标签-->
	<table align="center" border="2" width="500"  cellspacing="0">
		<tr>
			<td>1.1</td>
			<td>1.2</td>
			<td>1.3</td>
		</tr>
		<tr>
			<th>2.1</th>
			<th>2.2</th>
			<th>2.3</th>
		</tr>
		<tr>
			<td><b>3.1</b></td>
			<td><b>3.2</b></td>
			<td><b>3.3</b></td>
		</tr>
	</table>

	<h4>不规整的表格</h4>
	<!--colspan属性可以横向拓展,rowspan属性可以竖向拓展-->
	<table align="center" border="2" width="500"  cellspacing="0">
		<tr>
			<td colspan="3">1.1</td>
		</tr>
		<tr>
			<th rowspan="2">2.1</th>
			<th>2.2</th>
			<th>2.3</th>
		</tr>
		<tr>
			<td><b>3.2</b></td>
			<td><b>3.3</b></td>
		</tr>
	</table>

	<h4>表单</h4>
	<!--input是输入标签,
			可以通过type选择其输入的类型:
				text是文本框,password是密码框,radio是单选框,
				checkbox是复选框,reset是重置按钮,submit是提交按钮,
				button是按钮,file是文件上传,hidden是隐藏域
		value属性可以设置默认显示的内容。对于选择框 checked属性可以默认选中
                name属性的值:是表单提交时 携带的各个参数的参数名(可以区分不同的参数,防止冲突)
		select标签是下拉列表标签,option标签是选项,selected属性可以设置默认选中
		textarea标签是多行文本框,rows是高度,cols是宽度-->
	<form>
		账户:<input type="text" value="请输入你的账号"/><br />
		密码:<input type="password" ><br />
		性别:<input type="radio" name="sex" checked="checked" /><input type="radio" name="sex" /><br />
		技能:<input type="checkbox">Java
			<input type="checkbox">c++
			<input type="checkbox">web<br />
		国籍:<select>
				<option>请选择国籍</option>
				<option>中国</option>
				<option>日本</option>
			</select><br />
		补充内容:<br /><textarea rows="5" cols="20"></textarea><br />
		<input type="file" /><br />
		<input type="reset" />
		<input type="submit" />
	</form>

	<h4>表单表格</h4>
	<form>
		<table width="200" align="center"   cellspacing="0">
			<tr>
				<td> 账户:</td>
				<td> <input type="text" value="请输入你的账号"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" ></td>
			</tr>
			<tr>
				<td> 性别:</td>
				<td>
					<input type="radio" name="sex" checked="checked" /><input type="radio" name="sex" /></td>
			</tr>
			<tr>
				<td> 技能:</td>
				<td>
					<input type="checkbox">Java
					<input type="checkbox">c++
					<input type="checkbox">web
				</td>
			</tr>
			<tr>
				<td>  国籍:</td>
				<td>
					<select>
						<option>请选择国籍</option>
						<option>中国</option>
						<option>日本</option>
					</select>
				</td>
			</tr>
			<tr>
				<td>补充内容:</td>
				<td><textarea rows="5" cols="20"></textarea></td>
			</tr>
			<tr>
				<td colspan="2"> <input type="file" /></td>
			</tr>
			<tr>
				<td><input type="reset" /></td>
				<td><input type="submit" /></td>
			</tr>
		</table>

	</form>

	<h4>表单提交</h4>
	<!--form标签中的action属性可以设置表单提交到的服务器的地址
		method属性是提交方式有GET(默认)和 POST
		表单提交需要给表单中的项目添加 name值,并且给选择框添加 value值-->
	<form action="https://www.baidu.com/">
		<table width="200" align="center"   cellspacing="0">
			<tr>
				<td> 账户:</td>
				<td> <input name="zh" type="text" value="请输入你的账号"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input name="mm" type="password" ></td>
			</tr>
			<tr>
				<td> 性别:</td>
				<td>
					<input type="radio" name="sex" value="nan" checked="checked" /><input type="radio" name="sex" value="nv"/></td>
			</tr>
			<tr>
				<td> 技能:</td>
				<td>
					<input name="skill" value="java" type="checkbox">Java
					<input name="skill" value="c++" type="checkbox">c++
					<input name="skill" value="web" type="checkbox">web
				</td>
			</tr>
			<tr>
				<td>  国籍:</td>
				<td>
					<select name="country">
						<option >请选择国籍</option>
						<option value="cn">中国</option>
						<option value="jp">日本</option>
					</select>
				</td>
			</tr>
			<tr>
				<td>补充内容:</td>
				<td><textarea name="content" rows="5" cols="20"></textarea></td>
			</tr>
			<tr>
				<td colspan="2"> <input type="file" /></td>
			</tr>
			<tr>
				<td><input type="reset" /></td>
				<td><input type="submit" /></td>
			</tr>
		</table>
	</form>
</body>
</html>
如果不指定请求方式,表单默认的是get请求,参数是query参数

点击提交后: 2.png

form的事件:form表单中的onsubmit

  • onsubmit:只能表单上使用,提交表单前由表单触发该事件

  • onclick:是按钮等控件使用,用来触发点击事件

在提交表单前,一般都会进行数据验证: 在submit按钮上的onclick事件中验证 或者 在form标签的onsubmit事件中验证

二、react中

非受控组件:现用现取

页面里有表单,其中输入类DOM的值(比如input checkbox radio...等等)都是现用现取(取用户输入的然后使用)

class Login extends React.Component{
    handleSubmit = (event)=>{
        console.log(event.target)
        /*
        <form>
            ...
        </form>
        */
        
        event.preventDefault() //阻止表单提交(默认动作)
        const {username, password} = this
        alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
    }
    render(){
        return(
            <form onSubmit={this.handleSubmit}>
                用户名:<input ref={c => this.username = c} type="text" name="username"/>
                密码:<input ref={c => this.password = c} type="password" name="password"/>

                {/*submit按钮包括:1、type为submit的input 2、type为submit的button 3、未设置type的button 默认为submit类型 
                        都能触发onSubmit事件(实际触发该事件的是表单,所以e.target是<form>...</form>)
                */}
                {/*<input type="submit" name="submit" value="登录"/>*/}

                <button>登录</button>
            </form>
        )
    }
}

关于点击button按钮为何会自动提交数据的问题

受控组件(建议使用):随着输入,维护状态

页面中所有输入类的DOM,随着输入,把数据都维护到state中。等需要使用时,直接从state里取出来

使用onchange事件来写:

onchange事件: 输入类的DOM都可以绑定该事件,该DOM改变了就可以触发该事件(所以无需再使用ref拿到该DOM元素)。在原生里是onchange,在react中是onChange。

class Login extends React.Component{
    //初始化状态
    state = {
            username:'', //用户名
            password:'' //密码
    }
    //保存用户名到状态中
    saveUsername = (event)=>{
            this.setState({username:event.target.value})
    }
    //保存密码到状态中
    savePassword = (event)=>{
            this.setState({password:event.target.value})
    }
    //表单提交的回调
    handleSubmit = (event)=>{
            event.preventDefault() //阻止表单提交
            const {username,password} = this.state
            alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    }
    render(){
            return(
                    <form onSubmit={this.handleSubmit}>
                            用户名:<input onChange={this.saveUsername} type="text" name="username"/>
                            密码:<input onChange={this.savePassword} type="password" name="password"/>
                            <button>登录</button>
                    </form>
            )
    }
}

将上述代码进行优化: (代码优化)高阶函数与函数柯里化