React 表单处理 + 评论小案例

1.受控组件 : 值受到 React 控制的表单元素

  1. HTML 中表单元素时可输入的,也就是有自己的可变状态

  2. React 中可变状态通常保存在 state 中,并且只能通过 setState() 方法来修改

  3. React 希望将 state 与 表单元素 value 绑定到一起,由 state 的值来控制表单元素的值的

// 受控组件: 表单元素
export default class Form extends React.Component{
  state= {
    text: '0',
    content: '111',
    city: 'bj',
    isChecked:false
  }
  handleForm = (e) => {
    const target = e.target
    const name = target.name
    const value = target.type=== 'checkbox'?target.checked:target.value
    this.setState({
      [name]:value
    })
  }
  render() {
    <div>
      <input name='text' value={this.state.text} onChange={this.handleForm}></input>
      <textarea name='content' value={this.state.content} onChange={this.handleForm}></textarea>
      <select name='city' value={this.state.city} onChange={this.handleForm}>
        <option value='bj'>北京</option>
        <option value='sh'>上海</option>
        <option value='sz'>深圳</option>
      </select>
      <input type='checkbox' name='isChecked' checked={this.state.isChecked} onChange={this.handleForm}></input>
      
    </div>
  }
}

2.非受控组件 

  

  1. 借助于 ref,使用原生 DOM 方式来获取表单元素值

  2. ref 的作用:获取 DOM 和组件

  3. 非受控组件使用步骤

    • 调用 React.createRef()方法创建一个 ref 对象

    • 将创建好的 ref 对象添加到文本框中

    • 通过 ref 对象获取到文本框的值

// 非受控组件 : 表单元素
export default class Form extends React.Component{
  constructor() {
    super()
    this.state = {
      txt:'ooooo'
    }
    this.txtRef = React.createRef()
  }
  handleTxt = () => {
    console.log(this.txtRef.current.value);
  }
  render() {
    <div>
      <input name='text' ref={this.txtRef} onChange={this.handleTxt}></input>
    </div>
  }
}

评论小案例:

import React from 'react'
import ReactDOM from 'react-dom/client'
export default class Comment extends React.Component {
  state = {
    comment: [
      { id: 1, name: 'jack', content: '沙发!!!' },
      { id: 2, name: 'rose', content: '板凳~' },
      { id: 3, name: 'tom', content: '楼主好人' },
    ],
    userName: '',
    userComment: '',
  }
  handleCommentList() {
    const { comment } = this.state
    if (comment.length == 0) {
      return <div>暂无评论,快去评论吧~</div>
    }
    return (
      <ul>
        {comment.map((item) => (
          <li key={item.id}>
            <h3>评论人:{item.name}</h3>
            <p>评论内容:{item.content}</p>
          </li>
        ))}
      </ul>
    )
  }
  handleComment = (e) => {
    const { name, value } = e.target
    this.setState({
      [name]: value,
    })
  }
  addComment() {
    const { userName, userComment, comment } = this.state
    if (userName.trim() == '' || userComment.trim() == '') {
      alert('评论人及评论内容不能为空')
      return
    }
    const newComment = [
      {
        id: Math.random(),
        name: userName,
        content: userComment,
      },
      ...comment,
    ]
    this.setState({
      comment: newComment,
      userName: '',
      userComment: '',
    })
  }
  render() {
    return (
      <div>
        <div>
          <input
            placeholder="请输入评论人"
            name="userName"
            value={this.state.userName}
            onChange={this.handleComment}
          ></input>
          <br />
          <textarea
            placeholder="请输入评论内容"
            name="userComment"
            value={this.state.userComment}
            onChange={this.handleComment}
          ></textarea>
          <button onClick={this.addComment}>评论</button>
        </div>

        {this.handleCommentList()}
      </div>
    )
  }
}
ReactDOM.render(Comment, document.getElementById('root'))

好的,我可以为您提供一些代码示例和解释。 首先,我们需要安装 `antd` 和 `react-router-dom` 依赖。 ```bash npm install antd react-router-dom ``` 然后,我们可以创建一个 `Login` 组件,作为登录界面。在这个组件中,我们可以使用 `antd` 的 `Form` , `Input` 和 `Button` 组件来创建一个登录表单。 ```jsx import React from 'react'; import { Form, Input, Button } from 'antd'; const Login = () => { const onFinish = (values) => { console.log('Success:', values); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; return ( <Form name="basic" initialValues={{ remember: true, }} onFinish={onFinish} onFinishFailed={onFinishFailed} > <Form.Item label="Username" name="username" rules={[ { required: true, message: 'Please input your username!', }, ]} > <Input /> </Form.Item> <Form.Item label="Password" name="password" rules={[ { required: true, message: 'Please input your password!', }, ]} > <Input.Password /> </Form.Item> <Form.Item> <Button type="primary" htmlType="submit"> Submit </Button> </Form.Item> </Form> ); }; export default Login; ``` 接下来,我们可以创建一个简单的应用程序,在其中使用 `react-router-dom` 来切换登录页面和其他页面。 ```jsx import React from 'react'; import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom'; import Login from './Login'; const App = () => { return ( <Router> <div> <nav> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/login">Login</Link> </li> </ul> </nav> <Switch> <Route path="/login"> <Login /> </Route> <Route path="/"> <h1>Welcome to the homepage!</h1> </Route> </Switch> </div> </Router> ); }; export default App; ``` 最后,我们可以将应用程序渲染到页面上。 ```jsx import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); ``` 这是一个简单的 React + Ant Design 登录界面和应用程序的示例。希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值