我正在尝试使用Vuejs创建一个"类似Twitter"的角色计数器; 但是,我遇到了两个不同的问题.
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>
Run Code Online (Sandbox Code Playgroud)
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");
}
}
});
Run Code Online (Sandbox Code Playgroud)
通常,对于大多数现代前端框架(Angular,React,Vue等),您希望避免手动操作和检查DOM.建议的方法是使所有数据驱动(也就是:使用模型)并让框架在需要时更新DOM - 这是整个" 反应系统 " 背后的关键概念
但是这里有一些建议可以解决您的问题:
不要limit()在DOM事件上调用您的方法.相反......查看eligibility.address.details绑定到输入的属性v-model.
computed: {
charactersLeft() {
var char = this.eligibility.address.details.length,
limit = 140;
return (limit - char) + " / " + limit + "characters remaining";
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的标记中,您将使用计算属性,如常规数据属性:
<span class="limiter">{{charactersLeft}}</span>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6007 次 |
| 最近记录: |