如果是Laravel Spark,则会有一个带有以下内联模板的vue组件
<spark-update-payment-method-stripe :user="user" :team="team" :billable-type="billableType" inline-template>
/* ... */
<div class="pull-right">
<span v-if="billable.card_last_four">
<i :class="['fa', 'fa-btn', cardIcon]"></i>
************@{{ billable.card_last_four }}
</span>
</div>
/* ... */
</spark-update-payment-method-stripe>
此模板包含变量billable.card_last_four
。
如果我追踪组件的定义文件,我会看到这个
#File: resources/assets/js/spark-components/settings/payment-method/update-payment-method-stripe.js
var base = require('settings/payment-method/update-payment-method-stripe');
Vue.component('spark-update-payment-method-stripe', {
mixins: [base]
});
如果我追踪基本组件,我会看到定义了一个vue组件
#File: spark/resources/assets/js/settings/payment-method/update-payment-method-stripe.js
module.exports = {
props: ['user', 'team', 'billableType'],
/* ... */
但是,这些组件似乎都没有在任何地方定义billable
。我看到很多对this.billable
的引用。
#File: spark/resources/assets/js/settings/payment-method/update-payment-method-stripe.js
/* ... */
this.form.address = this.billable.billing_address;
this.form.address_line_2 = this.billable.billing_address_line_2;
this.form.city = this.billable.billing_city;
this.form.state = this.billable.billing_state;
this.form.zip = this.billable.billing_zip;
this.form.country = this.billable.billing_country || 'US';
/* ... */
placeholder() {
if (this.billable.card_last_four) {
return `************${this.billable.card_last_four}`;
}
return '';
}
/* ... */
这个billable
属性来自哪里?我假设Vue正在做某种形式的元编程和/或魔术来填充这个,但我对Vue不太熟悉,不知道发生了什么。
答案 0 :(得分:3)
在上面的Bert Evans和thanksd以及Chrome VueJS debugger
的帮助下,找到了我想要的答案 billable
属性确实是一个计算属性。但是,它并未在update-payment-method-stripe.js
定义文件中本地计算。相反,Spark有一个vue-bootstrap.js
,其中包含以下内容
Vue.mixin(require('./mixin'));
事实证明,VueJS有一个global mixin功能(似乎?)为系统中的每个组件添加一个方法。 mixin
模块看起来像这样
#File: spark/resources/assets/js/mixin.js
module.exports = {
computed: {
/**
* Get the billable entity.
*/
billable() {
/* ... */
},
/* ... */
}
};
这意味着spark中的每个组件都具有此计算机billable
属性。