【发布时间】:2019-08-30 10:18:06
【问题描述】:
注意:这不是重复的问题,因为这里的答案都无法解决我的问题。
子组件:
<template>
<div>
<v-card>
<v-card-text>
<p> Activity for Financial Year {{ this.currentFinancialYear.string_date }}
</p>
</v-card-text>
<div class="px-3 pt-5">
<v-select
label="Financial Year"
v-model="currentFinancialYear"
:items="years"
item-text="string_date"
:return-object="true"
></v-select>
</div>
</v-card>
</div>
</template>
<script>
export default {
name: 'HeatMap',
props: {
years: {
type: Array
},
financialYear: {
type: Object
},
cardWidth: {
type: String,
default: '860px'
}
},
data() {
return {
currentFinancialYear: {}
}
},
watch: {
currentFinancialYear (newVal, oldVal) {
if (newVal) {
this.getData()
return newVal
}
return oldVal
},
financialYear (newVal, oldVal){
this.currentFinancialYear = newVal
},
years (newVal) {
return newVal
}
},
methods: {
getData() {
// Some axios code
}
}
</script>
父组件:
<template>
<div>
<v-layout class="headline pt-5" align-center> <p>Pulse</p> </v-layout>
<HeatMap
:years='years'
:financialYear='finacialYear'
:cardWidth="'860px'"
/>
</div>
</template>
<script>
import HeatMap from '@/components/charts/HeatMap'
import { getYears } from '@/services/MetricsService'
export default {
name: 'MetricsDisplay',
components: {
HeatMap
},
data () {
return {
years: [],
finacialYear: {}
}
},
created () {
getYears().then(response => {
for (var i = 0 ; i < response.data.data.items.length - 1 ; i++) {
this.years[i] = {
start: new Date(response.data.data.items[i], 3, 1).toISOString(),
end: new Date(response.data.data.items[i] + 1, 2, 31).toISOString(),
string_date: response.data.data.items[i] + ' - ' + (response.data.data.items[i] + 1)
}
}
this.financialYear = this.years[this.years.length - 1]
})
}
}
</script>
因此,如您所见,parent 将数组years 和对象financialYear 作为道具发送给孩子。我已经在子组件中的那些道具上放置了一个监视,以便在数据到来时更新数据。但由于某种原因,currentFinancialYear 以 undefined 的形式出现。
此外,您可以在 child 中看到,v-select 使用 years 数组来填充其内容。第一次加载组件时,v-select 中没有元素,这表明years 也是空的。由于currentFinancialYear负责v-select的item的选择,所以也没有选择item。
只是为了显示数据的样子:
-
years:
[
{
end: "2018-03-31T18:30:00.000Z"
start: "2017-03-31T18:30:00.000Z"
string_date: "2017 - 2018"
},
{
end: "2019-03-31T18:30:00.000Z"
start: "2020-03-31T18:30:00.000Z"
string_date: "2017 - 2018"
}
]
-
currentFinancialYear:
[
{
end: "2018-03-31T18:30:00.000Z"
start: "2017-03-31T18:30:00.000Z"
string_date: "2017 - 2018"
}
]
我知道父子生命周期是这样的:
- 父级的created()
- created() of child
- mounted() 的孩子
- mounted() 的父级。
我已阅读 Vue.js 指南,他们告诉我们将 prop 变量置于监视之下,这就是我这样做的原因。
如果我在created() 中写一个console.log(this.years),那么年份正在被打印出来。即便如此,我也无法初始化currentFInancialYear 以获取我的v-select 中的年份。
我也尝试在mounted() 和created() 中初始化currentFinancialYear,但没有成功。
我需要的解决方案是:
在第一次加载组件时,child、years、financialYear、currentFinancialYear 的数据值应该具有从父级传递的值,这样我的v-select 有元素。
有人可以解释一下如何准确计时父子道具数据传递吗?
【问题讨论】:
-
您是否尝试在子元素上添加加载标志作为
v-if以确保在渲染子组件之前解析 api? -
您是否在
v-select组件中设置了item-value属性? -
@varunagarwal 这有什么帮助?不知何故,我的
created()中有years的值,但我无法访问它或将其分配给任何其他变量。我需要知道如何使这个同步,比如说。 -
@DelenaMalan 我相信
item-value用于设置项目数组中的值。由于我的项目数组没有显示,我拥有item-value将无济于事。无论如何,我使用v-model来监控列表中所选项目的值。 -
你能在 Codepen 或 JSFiddle 之类的东西中添加一个MVCE 吗?
标签: javascript vue.js vuetify.js