[英]Vue.js 2.x Passing function to component
我需要多次渲染具有相同信息的相同組件,並且當某人選擇某些內容時,應該在主Vue實例中加載一個函數。
直到現在,我還無法通過動態函數作為@change="onchange"
類的屬性:
[Vue警告]:事件“更改”的無效處理程序:未定義
在發現
--->在resources \\ assets \\ js \\ components \\ GeographyField.vue中
組件:
<template>
<fieldset class="form-group col-md">
<label :for="name" class="control-label" v-html="label"></label>
<select class="form-control" :name="name" :id="name" :model="_default" :disabled="disabled" @change="onchange">
<option :value="0" v-html="placeholder"></option>
<option v-for="object in collection" :value="object.id">{{ object.name }}</option>
</select>
</fieldset>
</template>
<script>
module.exports = {
props: {
label: {
type: String,
default: 'Options'
},
_default: {
type: Number,
default: 0
},
disabled: {
type: Boolean,
default: false
},
placeholder: {
type: String,
default: 'Choose an option'
},
name: {
type: String,
required: true,
},
collection: {
type: Array,
required: true
},
onchange: {
}
},
data: function() {
return {
}
},
methods: {
}
}
</script>
渲染:
<div class="row">
<!-- Country -->
<geography-field
label="País"
:_default="selectedCountry"
placeholder="Choose a country"
name="country"
:collection="countries"
:onchange="selectCountry()"
></geography-field>
<!-- Department -->
<geography-field
label="Departamento"
:_default="selectedDepartment"
:disabled="selectedCountry < 1"
placeholder="Choose a department"
name="department"
:collection="departments"
:onchange="selectDepartment()"
></geography-field>
<!-- Location -->
<geography-field
label="Localidades"
:_default="selectedLocation"
:disabled="selectedDepartment < 1"
placeholder="Choose a location"
name="location"
:collection="localities"
:onchange="selectLocation()"
></geography-field>
<!-- Zone -->
<geography-field
label="Zonas"
:_default="selectedZone"
:disabled="selectedLocation < 1"
placeholder="Choose a zone"
name="zone"
:collection="zones"
></geography-field>
</div>
編輯:包括selectCountry()
:
selectCountry: function() {
if(this.selectedCountry < 1) { return; }
axios.get('/get_country/' + this.selectedCountry)
.then(function (response) {
var data = response.data;
if(data.departments.length > 0) {
var departments = [];
$.each(data.departments, function (index, value) {
departments.push(value);
});
app.departments = departments;
}
});
},
如何正確地將函數傳遞給組件? 任何建議表示贊賞
編輯2:我可能要清除的一點是,組件呈現得很好。 以防萬一我將添加組件注冊:
Vue.component('geography-field', require('./components/GeographyField'));
...
const app = new Vue({
要將函數作為道具傳遞給組件,您需要去除函數名稱的尾括號。 否則,Vue將評估該功能。 例如:
<geography-field
label="País"
:_default="selectedCountry"
placeholder="Choose a country"
name="country"
:collection="countries"
:onchange="selectCountry" // strip off the parentheses
></geography-field>
但是,我也建議您使用$emit
而不是傳遞函數。 您可以這樣做:
組件定義:
<template>
<fieldset class="form-group col-md">
<label :for="name" class="control-label" v-html="label"></label>
<select class="form-control" :name="name" :id="name" :model="_default" :disabled="disabled" @change="onchange">
<option :value="0" v-html="placeholder"></option>
<option v-for="object in collection" :value="object.id">{{ object.name }}</option>
</select>
</fieldset>
</template>
<script>
module.exports = {
props: {
label: { type: String, default: 'Options' },
_default: { type: Number, default: 0 },
disabled: { type: Boolean, default: false },
placeholder: { type: String, default: 'Choose an option' },
name: { type: String, required: true },
collection: { type: Array, required: true }
},
methods: {
onchange() {
this.$emit("onchange");
}
}
}
</script>
父作用域中的組件標簽:
<geography-field
label="País"
:_default="selectedCountry"
placeholder="Choose a country"
name="country"
:collection="countries"
@onchange="selectCountry" // use @
></geography-field>
例如:onchange="selectCountry"
傳遞函數時請勿放置()
。 它將觸發函數執行,並且無論函數返回什么都將傳遞給onchange
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.