可能很多小伙伴们。看见这个标题后;
觉得作者是一个标题党。
textarea设置maxlength后,
限制用户输入的字符呗!
还能怎么样呢?
恭喜你,说对了一半。
之前我也一直是这样想的。
知道今天我写小完程序后自己测试。
发现textarea设置maxlength后,
并不是我们想的那样简单:
它是一个'有故事的组件'
我们来看一下这面这一段代码功能:
限制textarea的值最多输入6字符,
点击按钮获取用户的输入的值。
<template>
<view class="content" >
<view class="cont">留言内容</view>
<textarea class="my-custom" placeholder-class="updata-pl"
placeholder="请输入口号内容(最多输入6个字)"
v-model="formPraise.praiseCont"
maxlength="6"
/>
<view class="bottom-btn">
<button type="primary" class="button-btn" @tap="gotos">获取值</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
formPraise:{
praiseCont:''
}
}
},
methods: {
gotos(){
console.log('超出后==>',this.formPraise.praiseCont)
},
}
}
</script>

根据上面这一张动态图,
我们发现了在textarea显示的值,
与我们获取的值不一样。不一样,真不一样。
重要的事情说三遍。
我最初以为是开发工具缓存值或者出问题了。
重启了一次,发现textarea设置maxlength="6"
我们输入的值与获取的值真的不一样!
textarea设置maxlength后哪是一个‘有故事的属性’
分明就是一个‘有事故的属性’。
为什么会出现这样的情况? 因为:textarea设置maxlength="6"后,
当我们输入的值超过6时,我们删除又进行输入。
这样多重复几次。
就导致了我们视图上的值与我们获取的值不一致了。
这个时候,有机智的小伙伴可能会说:
我们使用ref通过节点获取内容。
这样视图和输出来的内容不就一致了。
不就可以解决了嘛?
感觉说的有道理,我们尝试一下:

2.通过ref获取值

我们知道,在uni-app开发小程序;
uniapp的ref属性不能用在uniapp的内置组件上面,
只能用在自定义组件上面
所以我们创建一个组件com-com.vue
子组件
<template>
<view class="solo-name">
<view class="soko">表彰说明</view>
<textarea class="my-custom"
placeholder="请输入口号内容(最多输入6个字)"
maxlength="6"
ref="vref"
placeholder-class="updata-pl"
v-model="formPraise.praiseCont"
/>
</view>
</template>
页面使用
<template>
<view class="content" >
<com-com ref="comref"></com-com>
<view class="bottom-btn">
<button type="primary" class="button-btn" @tap="gotos">
获取值
</button>
</view>
</view>
</template>
<script>
import comcom from "./com-com.vue"
export default {
components:{
'com-com':comcom
},
methods: {
gotos(){
console.log('获取值==>',this.$refs.comref.praiseCont)
},
}
}
</script>

当看完上面这张动态图的时候;
我们发现通过ref获取去的值仍然是失败的。
为啥视图上显示的值与我们获取的值不一致呢? 我们在视图上添加一个view组件。
用它显示我们输入的值的内容
它的值与textarea绑定的值是一样的。
我们康康下面这一个案例也许你就明白了

3.设置maxlength到底发生了什么事?

<template>
<view class="content" >
<view class="cont">留言内容</view>
<textarea class="my-custom" placeholder-class="updata-pl"
placeholder="请输入口号内容(最多输入6个字)"
v-model="formPraise.praiseCont"
maxlength="6"
/>
<view class="">
{{ formPraise.praiseCont}}
</view> <view class="bottom-btn">
<button type="primary" class="button-btn" @tap="gotos">获取值</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
formPraise:{
praiseCont:''
}
}
},
methods: {
gotos(){
console.log('超出后==>',this.formPraise.praiseCont)
},
}
}
</script>

4.抱歉我也不知道maxlength到底发生了什么事

说真的,我不号用语言去描述设置maxlength;
它到底发生了什么事情。
但是我知道当textarea设置maxlength后,
当值只要出现超出并且后一个覆盖了前面的值。
就会出现视图上显示的值与获取值不一致。
这是我得到的结论.
如果各位小伙伴又不一样的看法
欢迎说出来,你的观点对我很重要。

5.textarea不设置maxlength会这样嘛?

<template>
<view class="content" >
<view class="cont">留言内容</view>
<textarea class="my-custom" placeholder-class="updata-pl"
placeholder="请输入内容"
v-model="formPraise.praiseCont"
/>
<view class="bottom-btn">
<button type="primary" class="button-btn" @tap="gotos">
获取值
</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
formPraise:{
praiseCont:''
}
}
},
methods: {
gotos(){
console.log('超出后==>',this.formPraise.praiseCont)
},
}
}
</script>

6.textarea的maxlength默认值是140

我们发现没有设置textarea不设置maxlength时。
值仍然会丢失。
其实你虽然没有设置maxlength这个属性。
但是maxlength有一个默认值140。
也就是说你虽然没有设置值。
但是组件给了你一个默认值。 如果textarea设置maxlength值后;
不想让值丢失;可以将maxlength=-1;
这样值就不会进行丢失了。
但是达不到限制字数的效果。

有些小伙伴说:
我们可以先将maxlength=-1;
然后用户输入内容的时候;
我们判断用户输入值大于6的时候。
就进行截取。
感觉这个办法可行。赶紧尝试一下。

7.通过截取限制用户输入的值

<template>
<view class="content" >
<view class="cont">留言内容</view>
<textarea class="my-custom" placeholder-class="updata-pl"
placeholder="请输入内容"
v-model="mess"
@input="changehander"
/>
<view class="bottom-btn">
<button type="primary" class="button-btn" @tap="gotos">
获取值
</button>
</view>
</view>
</template> <script>
export default {
data() {
return {
mess:'',
}
},
methods: {
gotos(){
console.log('超出后==>',this.mess)
},
changehander(){
if(this.mess.length>6){
this.mess=this.mess.substr(0,6);
console.log('被执行了')
}
},
},
}
</script>

8.如何解决这个问题呢?

我们发现仍然是不行。
虽然值没有丢失。
但是没有进行对输出的值进行限制。 后来我使用watch对数据进行监听。
如果发现字数超出6个长度的时候进行截取。
但是仍然不行; 不仅unia-pp会出现,原生小程序也会出现。
我猜测taro也会出现;
因为这本身就是小程序的一个bug 大家有没有好的方案;
既能够对字符进行限制有能够获取正确的值;
发挥你们机智的小脑袋。想一想!
拜托各位大佬们了

小程序textarea设置maxlength后不是你想的那样简单的更多相关文章

  1. 微信小程序框架——wepy使后感

    更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...

  2. 微信小程序 textarea的placeholder层级过高 在弹层之上 bug解决方法

    微信小程序textarea的placeholder的层级一直都是一个神坑, 我们是没有办法将我们的弹层加大层级去盖过placeholder的, 所以要解决这个问题只能从另外的角度找思路 我的思路是 : ...

  3. 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理

    前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...

  4. 微信小程序 confirm(删除提示)提示框,询问框,小程序操作成功提示后跳转

    微信小程序删除处理 没有 confrim 那怎么实现这个效果呢 可以使用小程序里的模态框 代码: wx.showModal({ title: '提示', content: '确定要删除吗?', suc ...

  5. 微信小程序wxss设置样式

    微信小程序wxss设置样式 对于以前搞客户端开发的来说,有着客户端的逻辑,就是不知道怎么设置样式,把对应的控件显示出来 一.wxml 界面结构wxmL比较容易理解,主要是由八大类基础组件构成: 一.视 ...

  6. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.  

  7. 支付宝小程序serverless---插入数据后获取数据的主键_id(mongodb)

    支付宝小程序serverless---插入数据后获取数据的主键_id(mongodb) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除, ...

  8. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  9. 小程序textarea完美填坑

    相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等... 反正综上所 ...

随机推荐

  1. esp项目,

    http://www.cirmall.com/circuit/6012/%E6%99%BA%E8%83%BD%E5%8C%96%E7%A7%8D%E8%8A%B1%E7%AE%80%E6%98%93% ...

  2. 达梦数据库产品支持技术学习分享_Week1

    本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.达梦数据库的体系架构 二.达梦数据库的安装 三.达梦数据库的数据类型 四.达梦数据库的DDL.DML. ...

  3. HEVC之路0:HM16.18的运行+码流分析

    1.HM下载 HM不能直接网页下载,因为它是采用svn来管理代码的,因此需要利用svn下载,这里采用TortoiseSVN(软件下载地址为https://tortoisesvn.net/)进行下载. ...

  4. 深入浅出Promise

    Abstract Promise的意思是承诺(在红宝书中翻译为期约),新华字典:(动)对某项事务答应照办. Promise最早出现在Commn JS,随后形成了Promise/A规范. Promise ...

  5. CVPR2020论文解读:OCR场景文本识别

    CVPR2020论文解读:OCR场景文本识别 ABCNet:  Real-time Scene Text Spotting with Adaptive Bezier-Curve Network∗ 论文 ...

  6. DLPack构建跨框架的深度学习编译器

    DLPack构建跨框架的深度学习编译器 Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型.易用性通常是以碎 ...

  7. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  8. AIoT开放平台及应用

    AIoT开放平台及应用 阿里AIoT开放平台,是阿里云IoT面向开发者的能力接入渠道,开发者可以在这里完成能力的申请.开通.部署.配置和集成开发等一些列工作.这些能力并不的独立交付,而是通过关联到行业 ...

  9. MindSpore基本原理

    MindSpore基本原理 MindSpore介绍 自动微分 自动并行 安装 pip方式安装 源码编译方式安装 Docker镜像 快速入门 文档 MindSpore介绍 MindSpore是一种适用于 ...

  10. TensorRT 7.2.1 开发概要(下)

    TensorRT 7.2.1 开发概要(下) 1.2. Where Does TensorRT Fit? 一般来说,开发和部署深度学习模型的工作流要经过三个阶段. Phase 1 is trainin ...