小程序textarea设置maxlength后不是你想的那样简单
可能很多小伙伴们。看见这个标题后;
觉得作者是一个标题党。
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后不是你想的那样简单的更多相关文章
- 微信小程序框架——wepy使后感
更新:2018年1月10日15:32:22 在ios8及部分机型下会有样式混乱的问题,经查找,原因是缺少浏览器前缀,需要加prefix. 解决方案见链接:wepy-less-autoprefix 另外 ...
- 微信小程序 textarea的placeholder层级过高 在弹层之上 bug解决方法
微信小程序textarea的placeholder的层级一直都是一个神坑, 我们是没有办法将我们的弹层加大层级去盖过placeholder的, 所以要解决这个问题只能从另外的角度找思路 我的思路是 : ...
- 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理
前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...
- 微信小程序 confirm(删除提示)提示框,询问框,小程序操作成功提示后跳转
微信小程序删除处理 没有 confrim 那怎么实现这个效果呢 可以使用小程序里的模态框 代码: wx.showModal({ title: '提示', content: '确定要删除吗?', suc ...
- 微信小程序wxss设置样式
微信小程序wxss设置样式 对于以前搞客户端开发的来说,有着客户端的逻辑,就是不知道怎么设置样式,把对应的控件显示出来 一.wxml 界面结构wxmL比较容易理解,主要是由八大类基础组件构成: 一.视 ...
- 去掉小程序textarea上的完成按钮栏
小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加 :show-confirm-bar="false" 即可.
- 支付宝小程序serverless---插入数据后获取数据的主键_id(mongodb)
支付宝小程序serverless---插入数据后获取数据的主键_id(mongodb) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除, ...
- 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法
微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...
- 小程序textarea完美填坑
相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等... 反正综上所 ...
随机推荐
- SLAM图优化g2o
SLAM图优化g2o 图优化g2o框架 图优化的英文是 graph optimization 或者 graph-based optimization, "图"其实是数据结构中的gr ...
- PyTorch全连接ReLU网络
PyTorch全连接ReLU网络 1.PyTorch的核心是两个主要特征: 一个n维张量,类似于numpy,但可以在GPU上运行 搭建和训练神经网络时的自动微分/求导机制 本文将使用全连接的ReLU网 ...
- TensorFlow六种激活函数
TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...
- CUDA 9中张量核(Tensor Cores)编程
CUDA 9中张量核(Tensor Cores)编程 Programming Tensor Cores in CUDA 9 一.概述 新的Volta GPU架构的一个重要特点是它的Tensor核,使T ...
- 适用于CUDA GPU的Numba例子
适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Perf ...
- 什么是阻塞、非阻塞、同步和异步以及IO模型
首先先看如下几个问题,或者说我们经常会遇到的问题. 阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起.假设你要做一顿便饭:烧土豆: ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- mybatis学习——多对一和一对多查询
首先先来说明一下数据库,数据库有两张表student表和teacher表: student表如下: teacher表如下: 两张表的关系:多个学生关联一位老师(多对一) *其中tid是外键 需要sql ...
- 一、安装Tomcat服务器
[root@ web1 ~]# yum -y install java-1.8.0-openjdk #安装jdk [root@web1 ~]# yum -y install java-1.8.0- ...
- 【vim】常用总结
简介 什么是vim? Linux下两大编辑神器之一 vim Linux/Unix下使用最多的编辑器 vi的改进版 可能是最难上手的编辑器之一 为什么要学习vim? 都21世纪了,为什么还需要学习vim ...