React-表单处理

React-表单处理

【1】受控组件(常用)

Html中的表单元素是课输入的,也就是有自己的课变状态
而,react中可变状态通常保存在state中,并且只能通过setState()方法修改

React将state与表单元素值value绑定在一起,由state来控制表单元素的值

(1)在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源)
	state = {txt:''}
	<input type="text" value={this.state.txt}/>
(2)给表单元素绑定change事件,将表单元素的值设置为state的值(控制表单元素值的变化)
state = {txt:''}
<input type="text" value={this.state.txt}
	onChange={e => this.setState({txt:e.target.value})}
/>

【2】常用表单处理

import React from 'react';

class Form extends React.Component{
   state = {
       txt:'',
       content:'',
       city:'gz',
       isChecked:false
   }
   /*处理文本框*/
   handleChange = e => {
       this.setState({
           txt:e.target.value
       })
   }
   /*处理富文本*/
   handleContent = e => {
       this.setState({
           content:e.target.value
       })
   }
   /*处理下拉框*/
   handleCity = e =>{
       this.setState({
           city:e.target.value
       })
   }
   /*处理复选框*/
   hangleChecked = e =>{
       this.setState({
           isChecked:e.target.checked
       })
   }
   render(){
       return(
           <div>
               {/*文本框*/}
               <input type="text" value={this.state.txt} onChange={this.handleChange} />
              <br/>
               {/*富文本框*/}
               <textarea value={this.state.content} onChange={this.handleContent}>123</textarea>
               <br/>
               {/*下拉框*/}
               <select value={this.state.city} onChange={this.handleCity}>
                   <option value="sh">上海</option>
                   <option value="bj">北京</option>
                   <option value="gz">广州</option>
               </select>
               <br/>
               {/*复选框*/}
               <input type="checkbox" checked={this.state.isChecked } onChange={this.hangleChecked}/>
               <br/>
           </div>
       )
   }
}

export default Form

【3】多表单元素优化

使用一个事件处理程序同时处理多个表单元素
(1)给表单元素添加name属性,名称与state相同
(2)根据表单元素类型获取对应值
(3)在change事件处理程序中通过[name]来修改对应的state
import React from 'react';

class Form extends React.Component{
   state = {
       txt:'',
       content:'',
       city:'gz',
       isChecked:false
   }
   /*统一处理*/
   handleForm = e => {
       //获取当前DOM对象
       const target=e.target
       //根据类型获取值
       const value = target.type === 'checkbox'
           ?target.checked
           :target.value
       //获取name
       const name=target.name
       this.setState({
           [name]:value
       })
   }
   render(){
       return(
           <div>
               {/*文本框*/}
               <input type="text" name="txt" value={this.state.txt} onChange={this.handleForm} />
              <br/>
               {/*富文本框*/}
               <textarea value={this.state.content} name="content" onChange={this.handleForm}>123</textarea>
               <br/>
               {/*下拉框*/}
               <select value={this.state.city} name="city" onChange={this.handleForm}>
                   <option value="sh">上海</option>
                   <option value="bj">北京</option>
                   <option value="gz">广州</option>
               </select>
               <br/>
               {/*复选框*/}
               <input type="checkbox" name="isChecked" checked={this.state.isChecked } onChange={this.handleForm}/>
               <br/>
           </div>
       )
   }
}

export default Form

【4】非受控组件

借助于ref,使用原生DOM方式来获取表单元素值
ref的作用:获取DOM或组件

步骤:
(1)调用React.createRef()方法来创建一个ref对象
constructor(){
	super()
	this.txtRef = React.createRef()
}
(2)将创建好的ref对象添加到文本框中
	<input type="text" ref={this.txtRef} />
(3)通过ref对象获取到文本框的值
	Console.log(this.txtRef.current.value)
import React from 'react';

class Ref extends React.Component{
   constructor(){
       super()
       this.txtRef = React.createRef()
   }
   getTxt = ()=>{
       console.log('文本框值为:',this.txtRef.current.value )
   }
   render(){
       return(
           <div>
               <input type="text" ref={this.txtRef} />
               <button onClick={this.getTxt}>获取文本框的值</button>
           </div>
       )
   }
}

export default Ref
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 react-router 登录注册代码示例: ```jsx import React, { useState } from 'react'; import { BrowserRouter as Router, Switch, Route, Link, Redirect } from 'react-router-dom'; const App = () => { const [isLoggedIn, setIsLoggedIn] = useState(false); const handleLogin = () => { setIsLoggedIn(true); }; const handleLogout = () => { setIsLoggedIn(false); }; const PrivateRoute = ({ component: Component, ...rest }) => ( <Route {...rest} render={props => ( isLoggedIn ? <Component {...props} /> : <Redirect to='/login' /> )} /> ); const LoginPage = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const handleSubmit = (e) => { e.preventDefault(); // handle login logic here handleLogin(); }; return ( <div> <h2>Login Page</h2> <form onSubmit={handleSubmit}> <div> <label>Username:</label> <input type='text' value={username} onChange={(e) => setUsername(e.target.value)} /> </div> <div> <label>Password:</label> <input type='password' value={password} onChange={(e) => setPassword(e.target.value)} /> </div> <button type='submit'>Login</button> </form> </div> ); }; const RegistrationPage = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const handleSubmit = (e) => { e.preventDefault(); // handle registration logic here handleLogin(); }; return ( <div> <h2>Registration Page</h2> <form onSubmit={handleSubmit}> <div> <label>Username:</label> <input type='text' value={username} onChange={(e) => setUsername(e.target.value)} /> </div> <div> <label>Password:</label> <input type='password' value={password} onChange={(e) => setPassword(e.target.value)} /> </div> <div> <label>Confirm Password:</label> <input type='password' value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} /> </div> <button type='submit'>Register</button> </form> </div> ); }; const HomePage = () => { return ( <div> <h2>Home Page</h2> <button onClick={handleLogout}>Logout</button> </div> ); }; return ( <Router> <div> <nav> <ul> {isLoggedIn ? ( <li> <Link to='/'>Home</Link> </li> ) : null} <li> <Link to='/login'>Login</Link> </li> <li> <Link to='/register'>Register</Link> </li> </ul> </nav> <Switch> <Route path='/login'> <LoginPage /> </Route> <Route path='/register'> <RegistrationPage /> </Route> <PrivateRoute path='/' component={HomePage} /> </Switch> </div> </Router> ); }; export default App; ``` 上面的代码定义了三个页面:登录页面、注册页面和主页。登录和注册页面都包含一个表单,用于输入用户名和密码(或确认密码)。当用户提交表单时,可以在 `handleSubmit` 函数处理登录或注册逻辑,并根据结果设置 `isLoggedIn` 状态。主页只有在用户已登录时才能访问,否则将重定向到登录页面。 私有路由组件 `PrivateRoute` 可以将一个组件包装起来,以便只有在用户已登录时才渲染该组件。如果用户未登录,则将重定向到登录页面。在 `Switch` ,我们可以使用 `PrivateRoute` 来保护主页组件,确保只有已登录用户才能访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CaoPengCheng&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值