Vue中可根据内容自适应改变高度的textarea文本框

如图所示,当textarea里的内容超过一行后,会出现滚动条并隐藏前一行的内容,特别是在移动端使用到textarea多行文本输入的话,这样显示其实是很不友好的。所以要做一个可根据内容改变高度的textarea的组件。

踩坑尝试

利用rows属性来改变高度:

W3C HTML <textarea> 标签

踩坑时的思路:

  • textarea加上rows属性,并双向绑定在datarows上。(<textarea ref="textarea" :rows="rows" v-model="value" class="textarea" ></textarea>);
  • 获取初始页面时候textarea的高度,这就是一行的高度oneHeight
  • 通过vuewatch数据监听,当textarea的内容发生变化时触发,获取textareascrollHeight,再除以oneHeight求整数然后加一就是rows的数量。

踩坑感想:
这样做是可以实现当内容变多,行数跟着变多的情况的,但是,当内容变少,scrollHeight是不会减少的!所以rows也不会变,一旦被撑大,就再也缩不回去。。。。显然,这不是我想要的效果。

正确姿势

猛然回想起ElementUI上就有可根据内容调整高度的组件ElementUI input
然后就去扒源码看看是怎么实现的,结果都已经封装好了,太棒了,直接下载来引用就行了!

饿了么组件的源码github地址:
https://github.com/ElemeFE/element/blob/dev/packages/input/src/calcTextareaHeight.js

下面是引用了ElementUIinput组件的calcTextareaHeight方法的MyTextarea.vue

<template>
    <div class="my-textarea">
      <textarea ref="textarea" :style="{'height': height}" v-model="value" class="textarea" ></textarea>
    </div>
</template>

<script>
  import calcTextareaHeight from '@/assets/calcTextareaHeight';

  export default {
    name: 'my-textarea',
    data() {
      return {
        // textarea内容
        value: '',
        // 动态高度
        height: '30px'
      }
    },
    watch: {
      value() {
        this.getHeight();
      }
    },
    methods: {
      getHeight() {
        this.height = calcTextareaHeight(this.$refs.textarea, 1, null).height;
      }
    }
  }
</script>

<style scoped>
  .my-textarea .textarea {
    display: inline-block;
    width: 400px;
    /*height: 30px;*/
    line-height: 30px;
    font-size: 30px;
    resize: none;
  }
</style>
无论是单个输入或删减,还是一段输入或删减,都能立刻自适应改变高度

完整代码

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这两天一直在下雨,不由勾起我对雨最初的感知.印象最深的还是那虞美人的那首词,少年听雨歌楼上,红烛昏罗帐。壮年听雨客...
    欺尘阅读 1,769评论 2 2
  •   本文是国外一位 40 岁“老”程序员对职业生涯的思考,他认为从长远来看,应该多投资一些不容易过期、衰竭期较长的...
    人工智能Study阅读 2,828评论 0 2
  • “我要去北京!”老人垂着头,固执地坚持着。 “不是不让您去,”老人的女儿在一边苦口婆心地劝,“现在天越来越冷了,您...
    梦藤阅读 2,880评论 0 0
  • 人群中茫茫大海 淹没在不起眼的角落 拼命叫喊无人搭救 沉默中死亡 想过翻山越岭 站立在群山之巅 却找不到一片绿叶 ...
    闲人无稽阅读 2,744评论 0 3
  • 在外面吃饭越多,吃相就越重要。 有一个关系很好的客户,每次和她吃饭,她总是很照顾别人,经常用公筷给旁边的人夹菜,一...
    明日之星志鸿阅读 4,174评论 0 2

友情链接更多精彩内容