【问题标题】:Event handlers and components in vue.jsvue.js 中的事件处理程序和组件
【发布时间】:2016-12-08 14:02:20
【问题描述】:

当我在组件中已经有一个更改/输入处理程序时,如何指定一种更改/输入处理程序供 vue.js 中的组件使用?我有一个非常简化的文本输入,类似于:

Vue.component('text-input', {
template: '\
<span>\
  $\
  <input\
    ref="input"\
    v-bind:value="value"\
    v-on:input="updateValue($event.target.value)"\
  >\
   </span>\
  ' ,
props: ['value'],
methods: {
    updateValue: function (value) {
        this.$emit('input', value);
    },
    uppercase:function(value){
       return value.toUpperCase();
    }
}
});

我会这样使用它:

<text-input v-model="name"></text-input>

它工作正常,并且使用事件系统(使用 $emit)正确更新。但是现在我想将输入的值转换为大写,所以大概想在我的“文本输入”组件中传入一个输入处理程序,它是方法的名称,例如“大写”。所以我会有这个:

<text-input v-model="name" @input="uppercase"></text-input>

但在我的组件中,@input 已被 updateValue 使用。我怎样才能将两者结合起来? (或者,也许,有没有一种不同的更好的方式来思考整个问题?)

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    我有点难以理解,但如果您想在同一个事件上运行两个函数,您可以在一个函数中执行两件事。

    @input="update"
    

    然后是这样的:

    update: function (event) {
      this.updateValue(event.target.value)
      this.somethingElse()
    }
    

    但是,如果您拥有的代码确实是您想要做的,您可以这样做:

    this.$emit('input', this.uppercase(value))
    

    在 cmets 中讨论了更多内容之后。如果您愿意,可以将自定义回调作为属性传递并调用它而不是默认值。以下是一种解决方法的简单介绍:https://jsfiddle.net/crswll/3xwmgpom/

    【讨论】:

    • 好的,请耐心等待,我相信答案正如您所建议的那样显而易见,但我仍然不知道该怎么做。我有一个通用的文本输入组件,我在没有为其指定任何输入处理程序的情况下使用它——这是嵌套输入的工作:v-on:input="updateValue($event.target.value)。我希望能够偶尔在文本输入上使用一个属性,该属性有效地告诉嵌套输入使用不同的方法作为处理程序(如前所述,它将包含 updateValue 以及它自己的功能)。
    • 您是否真的想要类似vuejs.org/v2/guide/forms.html#Modifiers 的东西,但又可以说类似.. v-model.uppercase="foo"
    • 嗯,这将回答我提到的具体要求。不过,更一般地说,我所追求的是某种方式,我可以拥有一个组件的可选属性,该属性是包含的输入控件用作事件处理程序的方法的名称。正如我所提到的,它已经有一个默认值('updateValue')。我希望能够指定一个不同的来代替。
    • 我调整了我的答案,但这是我认为你所追求的一种方法:jsfiddle.net/crswll/3xwmgpom
    • 是的,差不多了!我缺少的是inputCallback: Function,将道具定义为一个函数。这很好地让我到达那里。唯一的事情是,这是调用根实例(或父组件)的方法。我想要做的是调用组件本身的方法——不是默认的方法,而是属性中命名的方法。
    猜你喜欢
    • 2022-12-31
    • 2016-02-17
    • 2017-10-23
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多