javascript - 在 vuejs 中的组件之间传递数据
问题描述
我有我的费用跟踪器应用程序。我在添加费用时遇到问题。我有两个组件负责:addCategory.vue 和 selectCategory.vue。
这是我的 selectCategory.vue 组件:
<template>
<div>
<select class="custom-select" @selected="this.$emit('select-cat',category)">
<option v-for="category in categories">{{ category.title }}</option>
</select>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
categories: [],
errors: []
}
},
created() {
axios.get(`http://localhost:3000/categories`)
.then(response => {
this.categories = response.data;
console.log(response.data);
})
.catch(e => {
this.errors.push(e)
})
}
}
</script>
这是我的 addExpense.vue 组件:
<template>
<div class="card">
<div class="card-header">
<h4>Dodaj nowy wydatek</h4>
</div>
<form v-on:submit.prevent="addExpense">
<div class="card-body">
<div class="form-group">
<label for="expense-name">Nazwa wydatku</label>
<input type="text" class="form-control" id="expense-name" v-model="Expense.title">
</div>
<div class="form-group">
<label for="expense-amount">Wartość</label>
<input type="number" class="form-control" id="expense-amount" v-model="Expense.amount">
</div>
<div class="form-group">
<label for="expense-date">Data wydatku</label>
<input type="date" class="form-control" id="expense-date" v-model="Expense.date">
</div>
<div class="form-group">
<label for="expense-category">Kategoria</label>
<select-category @select-cat="chooseCategory" v-model="Category.id"></select-category>
</div>
<br>
<div class="form-group">
<button class="btn btn-primary" @click="showAlert">Dodaj nowy wydatek</button>
</div>
</div>
</form>
</div>
</div>
</template>
<script>
import axios from 'axios';
import selectCategory from './selectCategory.vue';
export default {
components: {
'select-category': selectCategory
},
data(){
return {
Expense: {
title:'',
amount: '',
date:'',
categoryId:''
},
}
},
methods : {
chooseCategory(){
this.Expense.categoryId = this.Category.id
},
showAlert(){
this.$alert.success({
message: 'Wydatek dodany poprawnie'
})
},
addExpense(){
let newExpense = {
title : this.Expense.title,
amount : this.Expense.amount,
date : this.Expense.date,
categoryId: this.Expense.categoryId
}
console.log(newExpense);
axios.post(`http://localhost:3000/expenses`, newExpense)
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error);
})
}
}
}
</script>
我需要帮助,因为当我尝试添加费用时,带有“categoryId”的字段仍然为空。我使用事件来传递类别的名称,但我不知道如何将 category.id 添加到费用中。
解决方案
您的代码中的问题:
您需要添加一个数据属性来保存用户选择的选项,因此添加一个数据属性= selectedCategory
你没有绑定select的options的值,也没有绑定select的值,所以add
v-model="selectedCategory"
for<select>
和add:value="category"
for<option>
看来您绑定了错误的事件(event= selected更可能是您自定义的事件名称)
<select>
,更改为@change="selectChange(selectedCategory)"
最后,在addExpense.vue
,听事件= select-cat
。
就像下面的演示:
Vue.config.productionTip = false
Vue.component('select-category', {
template: `<div>
<select class="custom-select" v-model="selectedCategory" @change="selectChange(selectedCategory)">
<option v-for="category in categories" :value="category">{{ category.title }}</option>
</select>
</div>`,
data() {
return {
categories: [],
errors: [],
selectedCategory: null
}
},
mounted() {
this.categories = [
{'id':1, 'title': 'abc'},
{'id':2, 'title': 'xyz'}
]
},
methods: {
selectChange: function(newCatetory) {
this.$emit('select-cat',newCatetory)
}
}
})
new Vue({
el: '#app',
data() {
return {
categorySelected: null
}
},
watch: {
categorySelected: function (newVal, oldVal) {
console.log('changed to ' + newVal.id + ' from ' + (oldVal ? oldVal.id : oldVal))
}
},
methods:{
chooseCategory: function(data) {
this.categorySelected = data
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
<div class="form-group">
<label for="expense-category">Kategoria</label>
<select-category @select-cat="chooseCategory($event)"></select-category>
</div>
</div>
推荐阅读
- sql - SQL ERD 如何关联这两组
- java - 无法在具有 lambda 字段的类的构造函数中使用“return”
- c - 跟踪 n 个最大值的最有效方法是什么?
- visual-studio-code - 如何使用 CMDR 作为 vs code 默认集成终端
- android - 离子电容器 AAPT:错误:资源 android:attr/dialogCornerRadius 未找到
- vb.net - 如何将客户端证书附加到 SOAP 请求?
- html5-video - 如何使用开源播放器在 VAST 4.2 中播放 hls?
- python - psycopg2.errors.StringDataRightTruncation:类型字符变化的值太长(255)
- go - 如何通过 ScanIndexForward 对 aws-sdk-go-v2 中的查询结果进行排序?
- java - Spring AspectJ AOP 方法未执行