我有一个带有五个计算属性函数的Vue实例,它们对不同的值执行相同的操作。我重复了一遍,我想知道一个更干净的方法,不用重复自己这么多。
在HTML模板中,我有五个输入字段,每个输入字段限制为25个字符,我想显示我显示一个字符计数器:
<div class='field is-grouped'>
<p class='control is-expanded'>
<input
class="input"
placeholder="Trophy engraving line 1 (25 character limit)"
v-model='engraving.line1'
v-validate="'required'"
:class="{'input': true, 'is-danger': errors.has('engraving.line1') }"
name='engraving.line1'>
</p>
<p class='control'>
<span>{{ line1count }}</span>
</p>
</div>
除了他们说engraving.line2
,engraving.line3
,engraving.line4
和engraving.line5
之外,我有五个看起来完全相同的字段。
然后我的组件javascript我定义了雕刻对象,并为每个字段使用相同的计算方法。
export default {
data(){
return {
engraving: {
line1: '',
line2: '',
line3: '',
line4: '',
line5: '',
}
};
},
computed: {
line1count() {
var chars = this.engraving.line1.length,
limit = 25;
return (limit - chars) + "/" + limit + " characters remaining";
},
line2count(){
var chars = this.engraving.line2.length,
limit = 25;
return (limit - chars) + "/" + limit + " characters remaining";
},
line3count(){
var chars = this.engraving.line3.length,
limit = 25;
return (limit - chars) + "/" + limit + " characters remaining";
},
line4count(){
var chars = this.engraving.line4.length,
limit = 25;
return (limit - chars) + "/" + limit + " characters remaining";
},
line5count(){
var chars = this.engraving.line5.length,
limit = 25;
return (limit - chars) + "/" + limit + " characters remaining";
}
},
如何重新使用此函数来接受数据参数而不重复自己?
答案 0 :(得分:4)
通常对于这种事情,我会做一个小组件。下面的示例删除了验证(只是为了使示例更容易),但就像常规输入元素一样。
使用组件的优点是,您要执行的验证的范围是单个元素,并且可以轻松地重复使用。
console.clear()
Vue.component("engraving-line",{
props:["value", "placeholder", "limit"],
template:`
<div class='field is-grouped'>
<p class='control is-expanded'>
<input
class="input"
:placeholder="placeholder"
v-model='internalValue'>
</p>
<p class='control'>
<span>{{ lineCount }}</span>
</p>
</div>
`,
computed:{
internalValue:{
get() {return this.value},
set(v) {this.$emit("input", v)}
},
lineCount(){
return `${this.limit - this.value.length}/${this.limit} characters remaining`
}
}
})
new Vue({
el: "#app",
data:{
line1: "",
line2: "",
line3: "",
line4: "",
lineLimit: 25
}
})
&#13;
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
<engraving-line :limit="lineLimit"
v-model="line1"
placeholder="Trophy engraving line 1 (25 character limit)">
</engraving-line>
<engraving-line :limit="lineLimit"
v-model="line2"
placeholder="Trophy engraving line 2 (25 character limit)">
</engraving-line>
<engraving-line :limit="lineLimit"
v-model="line3"
placeholder="Trophy engraving line 3 (25 character limit)">
</engraving-line>
<engraving-line :limit="lineLimit"
v-model="line4"
placeholder="Trophy engraving line 4 (25 character limit)">
</engraving-line>
</div>
&#13;
答案 1 :(得分:2)
您可以使用方法:
methods: {
linecount(line, limit) {
var chars = this.engraving.line[line].length,
return (limit - chars) + "/" + limit + " characters remaining";
},
}
然后在你的html中引用它:
<p class='control'>
<span>{{ linecount(1,25) }}</span>
</p>