原本想要抄一个,发现找不到。。。。。。。。。。。。。。。。
然后自己手写一个
主要思路
获取textarea的宽度和字体大小,计算出来一行最多能放多少个字符。(跟字体有关,不同字体的宽度不一行)
然后获取textarea内容的字符串,遍历字符串的单个字节,如果是中文获取全角字符则为2的长度,英文为一个字符。根据当前字节以及后续字节,判断是否需要加入换行符。
word-break: ‘break-all’ 这个一定一加,不然会出现输入中文,后面全是英文,会自动换行情况
主要代码
<template>
<div >
<!-- wordBreak必须要加,不然会出现中文后面接的英文提前换行-->
<el-input
type="textarea"
placeholder="请输入内容"
v-model="textarea"
show-word-limit
:autosize="{ minRows: 1}"
:style="{fontFamily: '黑体',width:200+'px',fontSize:14+'px', whiteSpace: 'pre-wrap',wordBreak: 'break-all'}">
></el-input>
<el-button @click="click()" >截取</el-button>
</div>
</template>
<script>
export default {
name: "test",
data() {
return {
textarea: ''
}
},
methods: {
click(){
let sourceValue = this.textarea
let maxLength = 24 //可以通过with/font-size大概计算
this.t(sourceValue,maxLength)
},
t(val,maxLength = 24){
let newStr = ''
let valLength = val.length;
let innerVal,nextVal;
let countLen = 0
let nextLen = 1
for(let i = 0; i < valLength; i++) {
innerVal = val.charAt(i);
nextVal = i===valLength ? '' : val.charAt(i+1)
if(innerVal.indexOf("\n")> -1 || innerVal.indexOf("\r\n") > -1 ){
newStr += '\n'
countLen = 0
continue
}
if (innerVal.match(/[^\x00-\xff]/ig) != null){//中文,或者全角符号
countLen += 2
}else {
countLen += 1
}
if (nextVal.match(/[^\x00-\xff]/ig) != null){//中文,或者全角符号
nextLen =2
}else {
nextLen = 1
}
if (countLen > maxLength || countLen === maxLength){
newStr += innerVal
newStr += '\n'
countLen = 0
}else if (countLen + nextLen === maxLength){
newStr += innerVal
}else if (countLen + nextLen > maxLength){
newStr += innerVal
newStr += '\n'
countLen = 0
}else {
newStr += innerVal
}
}
console.log(newStr.split('\n'))
}
},
}
</script>