【问题标题】:How to reuse function with parameters in Vue computed properties?如何在 Vue 计算属性中重用带有参数的函数?
【发布时间】:2018-03-23 11:31:15
【问题描述】:

我有一个 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.line2engraving.line3engraving.line4engraving.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";
        }
    },

我怎样才能重用这个函数来接受一个数据参数,而不是重复自己那么多?

【问题讨论】:

  • 这种东西可以制作出很棒的小组件。

标签: javascript vue.js vuejs2 vue-component


【解决方案1】:

通常我会为这种事情制作一个小组件。下面的示例删除了验证(只是为了使示例更简单),但工作方式与常规输入元素一样。

使用组件的优势在于,您想要进行的验证仅限于单个元素,并且它们很容易重复使用。

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
  }
})
<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>

【讨论】:

  • 这个模式有什么名字吗?,我真的很喜欢这个解决方案
  • @RicardoOrellana 除了识别可重用的 UI 元素之外,我不确定是否有可以指出的特定模式。在这种情况下,基本上我们想要一个输入元素,但需要一些额外的 UI 来显示一些额外的信息。就像将代码分解为可重用的函数一样,使用 Vue(或其他组件基础框架,如 React),您将认识到将 UI 分解为可重用组件的机会。
【解决方案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>

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 2019-04-24
    • 1970-01-01
    • 2018-07-31
    • 2021-07-19
    • 1970-01-01
    • 2020-12-18
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多