React自定义输入框ui库组件

结构目录

结构目录

下载链接

React组件代码

import React, { Component } from 'react';
// 原则子组件 负责业务逻辑即可
// 父组件只负责从子组件接收数据
// 其实就是每个子组件的value都是每一个子组件单独的value值,然后再通过事件将值传回给父组件,就可由此方法改变父组件中定义的state中的值了
class Input extends Component {
  constructor (props) { // constructor方法
    super(props); // super方法,继承React父级的属性及方法
    this.state = { // this.state 自定义自己的属性方法,就是相当于vue中定义的初始值
      value: '' // 子组件的输入框的值
    }
    // 定义一个ref,ref就相等于js中的id,其实就是获取到当前的这个,需要配合在组件中设置的 ref = { } 来定义使用
    this.input = React.createRef() // ref 作用和id类似
  }

  onChange () { // onChange事件,当触发这个事件的时候获取到此时事件中的值,并修改自定义属相初始值
    let value = event.target.value
    this.setState({ // 修改自定义属性初始值
      value
    })

    // 调用父组件的onChange 函数,改变父组件状态,因为这个是复用组件,所以父组件之中调用的每个子组件之间必须保证其值的独立性,所以在子组件中自定义自己的vulue值,但是当这个值发生改变之后需要将这个值传递给父组件,并改变父组件中的值得状态,否则得话虽然在视图层显示出来了子组件渲染得值的改变,但是却不会同步到父组件中,而在父组件中必有一个获取这个框中信息的按钮,那么不同步父组件就会获取不到这个值,使用这种方法将自组件中更改过的值传递给父组件,父组件再改变父组件自定义的属性初始值,ok完成
    this.props.onChange(value)
  }

  render () {
    return (
      <div>
        {/* 参数0: 由父组件传过来的,输入框的标题 */}
        <label>{ this.props.label }</label>
        <input
          // 参数1: 由父组件传过来,输入框类型,默认text类型
          type={this.props.type || 'text'} 
          // 参数2: 输入框中的值,这个是子组件中自定义的.触发子组件自己的onChange事件更改了自己的值之后,再由父组件传过来的事件函数中的参数传递给父组件,最后父组件更改相应的状态即可
          value = { this.state.value }
          // 参数3: onChange事件,子组件自定义的事件,触发更改事件调用事件函数
          onChange = { this.onChange.bind(this) }
          // 参数4: 由父组件传过来的,占位符
          placeholder=""
          // ref用于指定当前
          ref={ this.input }/>
          {
            // 参数5: 是否显示清除输入框中内容的按钮,由父组件传过来的clearable值以及输入框中值的长度来决定是否显示
            // 子组件的清除按钮点击事件,点击按钮将值清空并获取焦点,并同步更新到父组件中
            this.props.clearable && this.state.value.length > 0 ? <button onClick={ () => {  // 定义一个子组件自己的点击按钮情况输入框内容的事件并在清空后获取焦点,使用共ref获取到当前,然后在触发这个事件的时候.focus获焦即可,清空的话直接就是将值 '' 即可,注意这里同上原理在清空输入空后也必要将这个空的值同步到父组件中,所以在此处调用父组件传过来的函数并传参过去父组件再改变状态即可
              console.log(this.input.current)
              this.input.current.focus()
              this.setState({
                value: ''
              })
              this.props.onChange('')
            }}
            style={ {color: 'red'} }
            >×</button> : ''
          }
          {/* 参数6: 由父组件传过来的验证后的提示信息 */}
          { this.props.error }
      </div>
    )
  }
}

class App extends Component {
  constructor (props) { // constrructor方法
    super(props) // super方法,继承来自React的属性和方法
    this.state = { // 自定自己的属性和方法即初始值
      username: '',
      password: '',
      usererr: '' // 用户名报错信息,判断是否符合定义的正则表达式,并向子组件传值
    }
  }
  getUsernameInputData (val) { // username改变事件,这些个定义的事件函数,都是用于给父组件转嘀给子组件的,并在此获取到来自子组件的参数值
    this.setState({ // 获取到子组件的值,同步更新父组件的状态值
      username: val
    })
    // 此处也可以验证数据的有效性,即验证输入内容是否符合标准
    if (/^[\u4e00-\u9fa5]{2,5}$/.test(val)) { // 正则表达式
      this.setState({ // 更改提示信息状态
        usererr: '正确'
      })
    } else if (val.length === 0) { // 如果输入框中的内容为空了的话就直接将这个提示信息为空,不让其显示
      this.setState({ // 更改提示信息状态
        usererr: ''
      })
    } else { // 如不符合以上条件则为错误输入
      this.setState({ // 更改提示信息状态
        usererr: '请输入2至5个汉字名称'
      })
    }
  }
  getPasswordInputData (val) { // 密码改变事件
    this.setState({
      password: val
    })
    if (/^.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&*?.]).*$/.test(val)) {
      this.setState({ // 更改提示信息状态
        pwderr: '正确'
      })
    } else if (val.length === 0) {
      this.setState({ // 更改提示信息状态
        pwderr: ''
      })
    } else {
      this.setState({ // 更改提示信息状态
        pwderr: '最少6位,包括至少1个字母,1个数字,1个特殊字符'
      })
    }
  }
  render () {
    return (
      <div>
        {/* 调用子组件并传参 */}
        <Input
          label="用户名" // 输入框前显示的标题
          type="text" // 输入框的类型
          value = { this.state.username } // 父组件的值,其实并没有在子组件中用到这个值,为了美观?规范?之类的反正是调用子组件的时候将值传过去就对了,没坏处
          onChange = { this.getUsernameInputData.bind(this) } // 将onChange接收到的事件传递给子组件,子组件接收到这个事件函数之后再将更改过后的参数传递回来,父组件再完成更改状态即可
          clearable
          error = { this.state.usererr }
        />
        <Input
          label="密码"
          type="password"
          value = { this.state.password }
          onChange = { this.getPasswordInputData.bind(this) }
          clearable
          error = { this.state.pwderr }
        />
        <button onClick={ () => {
          console.log({
            username: this.state.username,
            password: this.state.password
          })
        }}>获取数据</button>
      </div>
    )
  }
}

export default App;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要为 ag-grid-react 自定义单元格编辑器创建带搜索和输入的输入框,你可以按照以下步骤进行操作: 1. 创建一个新的 React 组件,该组件将作为自定义单元格编辑器。 2. 在该组件的 render() 方法中,使用一个文本输入框和一个搜索输入框来创建你的输入框。 3. 在 componentDidMount() 方法中,使用 ag-grid-react 的 ICellEditorParams 接口中的方法获取单元格的当前值。 4. 在 ag-grid-react 的 ICellEditorParams 接口中实现 getValue() 方法,该方法将返回输入框的当前值。 5. 在 ag-grid-react 的 ICellEditorParams 接口中实现 isPopup() 方法,该方法将返回 true,以便输入框显示为弹出式窗口。 6. 在 ag-grid-react 中使用你的新自定义单元格编辑器。 以下是一个示例代码,演示如何创建一个带搜索和输入的输入框作为 ag-grid-react 自定义单元格编辑器: ```javascript import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { AgEditorCellDef } from 'ag-grid-react'; class SearchInputEditor extends Component { constructor(props) { super(props); this.state = { value: props.value, }; } componentDidMount() { this.refs.input.focus(); } getValue() { return this.state.value; } isPopup() { return true; } handleChange = (event) => { this.setState({ value: event.target.value }); } handleKeyDown = (event) => { if (event.keyCode === 13) { this.props.stopEditing(); } } render() { return ( <div> <input ref="input" type="text" value={this.state.value} onChange={this.handleChange} onKeyDown={this.handleKeyDown} /> <input type="text" placeholder="Search..." /> </div> ); } } SearchInputEditor.propTypes = { value: PropTypes.string, stopEditing: PropTypes.func.isRequired, }; export default class GridExample extends Component { constructor(props) { super(props); this.state = { columnDefs: [ { headerName: 'Name', field: 'name', editable: true, cellEditorFramework: SearchInputEditor, }, { headerName: 'Age', field: 'age', editable: true, }, { headerName: 'Gender', field: 'gender', editable: true, }, ], rowData: [ { name: 'John Smith', age: 35, gender: 'Male' }, { name: 'Jane Doe', age: 28, gender: 'Female' }, { name: 'Bob Johnson', age: 42, gender: 'Male' }, ], }; } render() { return ( <div className="ag-theme-balham" style={{ height: '500px', width: '600px' }} > <AgGridReact columnDefs={this.state.columnDefs} rowData={this.state.rowData} enableSorting={true} /> </div> ); } } ``` ### 回答2: ag-grid-react允许我们自定义单元格编辑器,以满足特定的需求。要创建一个带搜索和输入框自定义单元格编辑器,我们可以按照以下步骤进行: 1. 首先,我们需要创建一个React组件作为单元格编辑器。我们可以使用antd或其他UI中的输入框组件,该组件已经带有搜索功能。在该组件内部,我们可以添加输入框和搜索按钮。 2. 在自定义编辑器组件中,我们需要实现ag-Grid的IAgEditorReact接口,以便它可以与ag-Grid进行交互。我们必须实现接口中的相关方法,如getValue()、isPopup()、isCancelBeforeStart()等。 3. 实现getValue()方法时,我们可以在函数内部获取输入框的值并返回它。这样,编辑器就可以将输入框的值传回给ag-Grid。 4. 其他方法如isPopup()和isCancelBeforeStart()可以根据需求进行实现,以控制编辑器的弹出和取消行为。 5. 在创建自定义单元格时,我们需要指定单元格的编辑器。我们可以设置editType为"custom",并将我们之前创建的自定义编辑器组件作为cellEditor设置。这将使ag-Grid在需要编辑单元格时使用我们的自定义编辑器。 这样,我们就可以利用自定义单元格编辑器为ag-grid-react创建一个带有搜索功能的输入框了。每次需要编辑单元格时,ag-Grid将显示我们定义的自定义编辑器组件,并且我们可以在自定义编辑器组件中自由定义输入框的样式和功能。 ### 回答3: ag-grid-react是一个用于创建数据网格的React组件。它允许我们自定义单元格编辑器,以便满足特定的需求。对于要求带搜索功能的输入框,我们可以创建一个自定义的单元格编辑器组件。 首先,我们可以创建一个名为SearchInputReact组件,该组件包含一个带搜索功能的输入框。在这个组件中,我们可以使用合适的逻辑和UI来实现搜索功能,例如在输入框中实时过滤并显示匹配的结果。 接下来,我们可以创建一个名为CustomCellEditor的React组件,并在其中使用SearchInput组件作为单元格编辑器。在CustomCellEditor组件中,我们需要实现ag-grid-react提供的ICellEditor接口,并重写相关方法。 在getGui方法中,我们返回SearchInput组件作为单元格编辑器的UI。在getValue方法中,我们可以获取SearchInput组件输入框的值并返回。在isPopup方法中,我们可以定义是否显示这个单元格编辑器的弹出框。 最后,我们可以将CustomCellEditor组件应用到我们的数据网格中的特定列。在ag-grid-react配置中的columnDefs中,我们可以为需要使用自定义单元格编辑器的列设置cellEditor属性为CustomCellEditor组件。 通过以上步骤,我们可以创建一个带有搜索功能的输入框作为ag-grid-react自定义单元格编辑器。这样,在网格中的相关列中,当用户需要编辑单元格时,就会显示这个带搜索的输入框

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值