Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实现 Input 去除首尾空格 #9

Open
chenwangji opened this issue Jun 19, 2019 · 0 comments
Open

实现 Input 去除首尾空格 #9

chenwangji opened this issue Jun 19, 2019 · 0 comments
Labels
Milestone

Comments

@chenwangji
Copy link
Owner

chenwangji commented Jun 19, 2019

做项目遇到一个需求,要求所有的 input 框提交前自动去除首尾空格,全部都是空格就全部去除。

最简单的办法是在提交前对数据作处理,但是这样会带来很多的重复性工作,所以需要把这层逻辑抽取出来。

Vue 的做法

在之前用 Vue 开发的时候,官方提供了一个很方便方法,使用的 trim 装饰符:

<input v-model.trim="bindValue" />

React 上使用

然而目前用的是 React 开发,而 React 并没有原生提供类似功能,使用的 Antd 也没有提供,需要我们自己封装。

一般组件

如果都是 Input 组件,我们直接封装一层,加上去除首尾空格的逻辑即可。

去除的最佳时机应该是输入框失去光标的时候,所以应该监听 blur 事件。

具体代码如下:

// TrimInput Component

import React from 'react';
import { Input } from 'antd';

export default class TrimInput extends React.Component {
  handleBlur = (e) => {
    // 去除头尾空格
    e.target.value = e.target.value.trim();
    const { onChange } = this.props;
    // 主动调 onChange,将数据同步给 Form
    onChange(e);
  }

  render () {
    return (<Input onBlur={this.handleBlur} {...this.props} />)
  }
}

高阶组件

有时候并不一定都是 Input,也有可能是 Textarea, 这就要求我们把代码写得灵活一点,我们可以采用 React 特有的高阶组件扩展我们的逻辑。

具体代码:

// withTrim

import React, { Component } from 'react';

const withTrim = (WrappedComponent) =>
  class WrapperComponent extends Component {
    // 去除头尾空格
    handleBlur = (e) => {
      e.target.value = e.target.value.trim();
      const { onChange } = this.props;
      onChange(e);
    }

    render() {
      return <WrappedComponent onBlur={this.handleBlur} {...this.props} />;
    }
}

export default withTrim;

使用:

const TextArea = withTrim(AntdInput.TextArea);
@chenwangji chenwangji added this to the 笔记本 milestone Jun 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant