可能很多小伙伴们。看见这个标题后;
觉得作者是一个标题党。
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. Redis SWAPDB 命令背后做了什么

    Redis SWAPDB 命令背后做了什么 目录 Redis SWAPDB 命令背后做了什么 0x00 摘要 0x01 SWAPDB 基础 1.1 命令说明 1.2 演示 0x02 预先校验 0x03 ...

  2. SystemVerilog数组(一)

  3. Spring-Cloud之Feign原理剖析

    Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于rib ...

  4. Python+Selenium自动化-定位页面元素的八种方法

    Python+Selenium自动化-定位页面元素的八种方法   本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...

  5. GO学习-(8) Go语言基础之数组

    Go语言基础之数组 Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基本语法: // 定义一个长度为3元素类型为 ...

  6. Go基础结构与类型02---使用iota定义常量组

    package main import "fmt" /*const ( USA = 0 China = 1 Russia = 2 Britain = 3 France = 4 )* ...

  7. 深度学习编译与优化Deep Learning Compiler and Optimizer

    深度学习编译与优化Deep Learning Compiler and Optimizer

  8. Auto ML自动调参

    Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...

  9. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

  10. switch分支语句

    语句句式 Calendar c = Calendar.getInstance(); //获得一周的某天 int i = c.get(Calendar.DAY_OF_WEEK); switch (i) ...