【问题标题】:Vuejs: Character CounterVuejs:字符计数器
【发布时间】:2017-04-17 22:23:52
【问题描述】:

我正在尝试使用 Vuejs 创建一个“类似推特”的字符计数器;但是,我遇到了两个不同的问题。

  1. 错误:无法获取未定义或空引用的属性“长度”
  2. 即使我让它工作,是否有任何方法可以使用多个事件调用相同的函数,而无需将每个事件添加为对标签的单独调用。例如:v-on:keyup,blur,focus="limiter(this,140)"

HTML:

<div class="form-group" id="vue">
  <label for="eligibility-address-detail">Address Notes:</label>
  <textarea class="form-control" id="eligibility-address-detail" rows="3" 
   name="eligibility[address][detail]" v-model="eligibility.address.details" 
   v-on:keyup="limiter(this, 140)" required></textarea>
  <span class="limiter"></span>
</div>

JavaScript:

var main = new Vue({
  el: "#vue",
  data: {
    eligibility: {
      address: {
        details: ""
      }
    }       
  },
  methods: {        
      limit: function(elem, limit){
          var chars = elem.value.length;
          if (chars > limit) {
              elem.value = elem.value.substr(0, limit);
              chars = limit;
          }
          $(elem).siblings('.limiter').html((limit - chars) + " / " + limit + "characters remaining");
      }
  }
});

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

一般来说,对于大多数现代前端框架(Angular、React、Vue 等),您都希望避免手动操作和检查 DOM。推荐的方法是让一切都由数据驱动(又名:使用模型)并让框架在需要时更新 DOM - 这是整个“reactivity system”背后的关键概念

但这里有一些建议可以解决您的问题:

不要在 DOM 事件上调用您的 limit() 方法。相反...查看绑定到输入 v-modeleligibility.address.details 属性。

您可以创建一个computed property,根据该属性计算剩余字符。

computed: {
    charactersLeft() {
        var char = this.eligibility.address.details.length,
            limit = 140;

        return (limit - char) + " / " + limit + "characters remaining";
      }
}

然后在您的标记中,您可以像使用常规数据属性一样使用计算属性:

<span class="limiter">{{charactersLeft}}</span>

【讨论】:

  • 我曾考虑使用计算属性;但是,我必须为每个我想在此示例上放置计数器的单个输入创建一个计算机属性。
  • 如果您有多个具有不同“最大字符”值的字段.. 那么是的,您将需要多个计算属性。
  • @Neve12ende12 您是否希望显示剩余字符数并截断他们正在输入的内容?还是只显示字符数?
  • 我希望显示计数,如果超过计数,则截断他们输入的内容。我会给你一个 +1,因为它在技术上确实回答了这个问题,但我想我会使用 Bert Evans 上面评论的内容。
  • 您可以使用表达式更简单地完成此操作:&lt;span class="limiter"&gt;{{ 140 - eligibility.address.details.length }} characters remaining&lt;/span&gt;
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多