美文网首页
04react基础-组件2

04react基础-组件2

作者: 东邪_黄药师 | 来源:发表于2021-05-14 18:09 被阅读0次

表单处理

受控组件

  • HTML中的表单元素是可输入的,也就是有自己的可变状态
  • 而React中可变状态通常保存在state中,并且只能通过setState() 方法来修改
  • React讲state与表单元素值value绑定在一起,有state的值来控制表单元素的值
  • 受控组件:值受到react控制的表单元素


    image.png

使用步骤

  • 在state中添加一个状态,作为表单元素的value值
  • 给表单元素绑定change事件,将表单元素的值设置为state的值
class App extends React.Component {
    constructor(){
        super()
        this.inputChange = this.inputChange.bind(this)
    }
    state = {
        txt : ''
    }
    inputChange(e){
       this.setState({
           txt: e.target.value
       })
    }
    render(){
        console.log(this.state);
        
        return (
            <div>
                {/* 把state的值设置给输入框的value,绑定change事件,这样用户在输入内容的时候调用相应函数,在函数里面把当前设置的值赋值给state,从而达到数据的统一 */}
                <input type="text" value={this.state.txt} onChange={this.inputChange}/>
            </div>
        )
    }
}
ReactDOM.render(<App />,document.getElementById('root'))

多表单元素优化

  • 问题:每个表单元素都有一个单独的事件处理函数,这样太繁琐
  • 优化:使用一个事件处理程序同时处理多个表单元素
步骤
  • 给表单元素添加name属性(用来区分是哪一个表单),名称与state相同(用来更新数据的)
  • 根据表单内容来获取对应值
  • 在change事件处理程序中通过 [name] 来修改对应的state
优化前:
import React from 'react'
import ReactDOM from 'react-dom'

/* 
  受控组件示例
*/

class App extends React.Component {
  state = {
    txt: '',
    content: '',
    city: 'bj',
    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
    })
  }

  // 处理复选框的变化
  handleChecked = 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}></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.handleChecked} />
      </div>
    )
  }
}

// 渲染组件
ReactDOM.render(<App />,  document.getElementById('root'))

优化后:

import React from 'react'
import ReactDOM from 'react-dom'

/* 
  受控组件示例
*/

class App extends React.Component {
  state = {
    txt: '',
    content: '',
    city: 'bj',
    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 name="content" value={this.state.content} onChange={this.handleForm}></textarea>
        <br/>

        {/* 下拉框 */}
        <select name="city" value={this.state.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} />
      </div>
    )
  }
}

// 渲染组件
ReactDOM.render(<App />,  document.getElementById('root'))

非受控组件

  • 说明:借助于ref,使用元素DOM方式获取表单元素值
  • ref的作用:获取DOM或者组件
    使用步骤:
  • 调用 React.createRef() 方法创建ref对象
  • 将创建好的 ref 对象添加到文本框中
  • 通过ref对象获取到文本框的值
class App extends React.Component {
  constructor() {
    super()

    // 1.创建ref
    this.txtRef = React.createRef()
  }

  // 2.获取文本框的值
  getTxt = () => {
    console.log('文本框值为:', this.txtRef.current.value);
  }

  render() {
    return (
      <div>
        <input type="text" ref={this.txtRef} />
        <button onClick={this.getTxt}>获取文本框的值</button>
      </div>
    )
  }
}

// 渲染组件
ReactDOM.render(<App />,  document.getElementById('root'))

综合案例评论组件

https://gitee.com/zhangzanzz007/react-comment.git

相关文章

  • 04react基础-组件2

    表单处理 受控组件 HTML中的表单元素是可输入的,也就是有自己的可变状态 而React中可变状态通常保存在sta...

  • 组件化改造-从零开始

    1 ,抽分基础资源 2 ,基础库的设计 3 ,组件接口 4 ,组件拆分 5 ,路由设计 对比了几家组件化方案,还是...

  • stylus_ui基础组件开发

    基于stylus,仿照weui,目前先根据app设计风格编写基础ui组件;后续1:会根据基础组件扩展;后续2:根据...

  • 组件相关

    一.组件基础 1.全局组件 2.局部组件 二.组件进阶 1.组件中加入点击事件(点击按钮页面弹出数字“123456...

  • 小程序拖拽效果实现

    1. 基础ui组件使用css 帧动画的基础ui 2.创建 wxml 代码如下 ps(此组件可获取用户formid ...

  • vue v-model 在子组件中修改父组件的数据,前提被修改的

    1、当数据是基础类型时,例如String,报警告 父组件 子组件 警告: 2、当数据是非基础类型时,例如Objec...

  • iOS 组件化方案

    1、对业务模块的拆分,以及功能模块的拆分,达到解耦,不相互依赖。 1.业务组件依赖基础组件。2.基础组件不可依赖业...

  • Zabbix

    1、zabbix 基础介绍: 2、zabbix程序的组件: 链接官方文件包下载: zabbix逻辑组件: 设置数据...

  • Sketch组件

    关于Symbol的使用 组件库构建思路:解构-拆分-重构 1.基础组件的制作 2.组件嵌套制作 3.系统组件与通用...

  • Vue组件(二)组件传值

    一、父组件向子组件传值 我们可以用props向子组件传值; 1. 基础用法 组件代码 父组件使用 2.props验...

网友评论

      本文标题:04react基础-组件2

      本文链接:https://www.haomeiwen.com/subject/hwgvdltx.html