【问题标题】:Vue: default value for prop functionVue:prop 函数的默认值
【发布时间】:2019-05-08 15:22:55
【问题描述】:

有没有什么方法可以为具有函数类型的道具设置默认函数?

props: {
    clickFunction: {
        type: 'Function'
        default: ????
    }
}

【问题讨论】:

  • 为什么没有?你试过了吗?
  • 我尝试了各种方法,但没有任何效果,也没有相关文档。
  • 我的例子有效。什么具体没有按预期工作?
  • 所有其他道具都支持默认属性,因此可以完全安全地假设函数也支持。我这样做是为了将一个空函数设置为默认值,这样如果它没有被传入,空函数就会没有任何效果,并且不需要对函数执行条件测试(我曾经写过一个 jsperf 证明默认/空函数方法更快)。长话短说,如果您尝试的任何方法都不起作用,那么问题出在其他地方。

标签: javascript vue.js vuejs2


【解决方案1】:

是的:

Vue.component('foo', {
  template: '<div>{{ num }}</div>',
  props: {
    func: {
      type: Function,
      default: () => 1,
    },
  },
  data() {
    return { 
      num: this.func()
    }
  }
})

new Vue({
  el: '#app',
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <foo></foo>
</div>

【讨论】:

【解决方案2】:

我想说,始终提供与您指定的类型相匹配的默认值:让事情更容易推理。在这里,您正在寻找的是一个 noop 函数(也就是一个什么都不做的函数):

props: {
  clickFunction: {
    type: Function
    default: () => {}
  }
}

然后您可以在代码中使用this.clickFunction() 而无需先进行防御性检查:它始终是一个函数。确保不要混淆 Object 属性的默认值,这将是一个空对象:

props: {
  someObject: {
    type: Object
    default: () => ({})
  }
}

在 Vue 中,ObjectArray 道具必须由函数返回它们的默认值,以确保它们对于组件的每个实例都是不同的(Function 道具似乎不需要,但是 docs确实不是很清楚)。

【讨论】:

    【解决方案3】:

    这种方式应该适用于 Vue 2.0

    props: {
        clickFunction: {
            type: 'Function'
            default(){
              return () => true
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      带参数的例子:

      responseFunc: {
        type: Function, 
        default: (response) => {
          return response.data;
        }
      }
      

      【讨论】:

        【解决方案5】:

        我认为这不是正确的方法。 VUE 不是这样工作的。为什么要传递对函数的引用作为道具?组件可以发出自己的事件,父级可以捕获。

        这里有可用的道具类型: https://vuejs.org/v2/guide/components-props.html

        您可以在此处阅读有关自定义事件的信息: https://vuejs.org/v2/guide/components-custom-events.html#Event-Names

        编辑 是的,我的回答不正确,也没有回答问题。 直接回答:是的,有一些方法可以为具有函数类型的道具设置默认函数(查看其他答案)。

        模式和用例是题外话,所以我到此结束(但是,有人在回答我的回答时提到了一件有趣的事情)。

        【讨论】:

        • 将函数作为 props 传递给子组件是 SPA 框架中从子组件向父组件传递值的常见模式。在 React.JS reactjs.org/docs/lifting-state-up.html 中称为“提升状态回调”。 VueJS 也使用这种模式。
        • emit 也是一个很好的答案,如果适用的话。我对大量的反对票感到惊讶!
        • @BadDobby 否 - Vue 不使用函数作为提升状态的道具 - 它使用 $emit,就像 Marcin 所说的那样。
        猜你喜欢
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 2011-04-09
        • 2016-01-01
        • 2019-09-12
        • 2015-08-29
        相关资源
        最近更新 更多