antd 3.10.0的TextArea不支持显示总字数和当前字数

antd 3.10.0的TextArea不支持显示总字数和当前字数,项目是遗留代码,贸然升级成antd 4.x的风险略大,不可控,遂决定扩展TextArea的功能添加上对当前字数和总字数的支持。

原理并不复杂,antd 3.x的TextArea还是以class形式定义的,直接继承这个class就行,然后加上显示当前字数和总字数的div以及对应的css。

js:

import React from 'react';
import { Input } from 'antd';
import styles from './index.less';

const { TextArea } = Input;

class CountedTextarea extends TextArea {
  valueLength() {
    if (this.state.value && this.state.value.length) {
      return this.state.value.length;
    }
    return 0;
  }
  render() {
    return (
      <div className={styles.countedtextareaWrapper}>
        {super.render()}
        <div className={styles.border} />
        <span className={styles.countWrapper}>
          <span>{this.valueLength()}</span>/<span>{this.props.maxLength}</span>
        </span>
      </div>
    );
  }
}

export default CountedTextarea;

less:

.countedtextareaWrapper {
  position: relative;
  z-index: 1;
  .border {
    transition: all 0.2s;
    top: 0;
    left: 0;
    position: absolute;
    width: 100%;
    height: calc(100% + 32px);
    border: 1px solid #d9d9d9;
    border-radius: 4px;
    z-index: -1;
  }
  textarea {
    border: none;
    margin: 1px;
    width: calc(100% - 2px);
    resize: none;
    &:focus {
      box-shadow: none;
      + .border {
        border-color: #40a9ff;
        box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
      }
    }
  }
  .countWrapper {
    position: absolute;
    bottom: -22px;
    right: 10px;
    font-family: PingFangSC-Regular;
    font-size: 14px;
    color: #c1c1c1;
    letter-spacing: 0;
    font-weight: 400;
    span {
      font-family: PingFangSC-Regular;
      font-size: 14px;
      color: #c1c1c1;
      letter-spacing: 0;
      font-weight: 400;
    }
  }
}

:global(.countedItem) {
  .countWrapper {
    bottom: -34px;
  }
  :global(.has-error) {
    position: relative;
    .countedtextareaWrapper {
      :global(.ant-input) {
        + .border {
          border-color: #ff4d4f;
        }
        &:focus,
        &:hover {
          border: none;
          box-shadow: none;
          + .border {
            box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2);
          }
        }
      }
    }
  }
}

:global {
  .countedItem {
    position: relative;
    margin-bottom: 60px;
    &.ant-form-item-with-help {
      margin-bottom: 41px;
    }
    .ant-form-explain {
      top: 36px;
      position: relative;
    }
  }
}

这样的话,支持在FormItem里使用此 CountedTextarea 组件,需要在 FormItem 上加上 className="countedItem" 即可。

posted @ 2021-11-03 09:40  透明飞起来了  阅读(892)  评论(0编辑  收藏  举报