1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| import './style.less'
| import { getStrFullLength, cutStrByFullLength } from '../_util/util'
| import Input from 'ant-design-vue/es/input'
| const TextArea = Input.TextArea
|
| export default {
| name: 'LimitTextArea',
| model: {
| prop: 'value',
| event: 'change'
| },
| props: Object.assign({}, TextArea.props, {
| prefixCls: {
| type: String,
| default: 'ant-textarea-limit'
| },
| // eslint-disable-next-line
| value: {
| type: String
| },
| limit: {
| type: Number,
| default: 200
| }
| }),
| data () {
| return {
| currentLimit: 0
| }
| },
| watch: {
| value (val) {
| this.calcLimitNum(val)
| }
| },
| created () {
| this.calcLimitNum(this.value)
| },
| methods: {
| handleChange (e) {
| const value = e.target.value
| const len = getStrFullLength(value)
| if (len <= this.limit) {
| this.currentLimit = len
| this.$emit('change', value)
| return
| } else {
| const str = cutStrByFullLength(value, this.limit)
| this.currentLimit = getStrFullLength(str)
| this.$emit('change', str)
| }
| console.error('limit out! currentLimit:', this.currentLimit)
| },
| calcLimitNum (val) {
| const len = getStrFullLength(val)
| this.currentLimit = len
| }
| },
| render () {
| const { prefixCls, ...props } = this.$props
| return (
| <div class={this.prefixCls}>
| <TextArea {...{ props }} value={this.value} onChange={this.handleChange}>
| </TextArea>
| <span class="limit">{this.currentLimit}/{this.limit}</span>
| </div>
| )
| }
| }
|
|