【发布时间】:2022-01-05 20:03:11
【问题描述】:
我的 vue3 应用程序出错。我正在尝试在methods{} 块中创建一个函数,该函数会命中 dynamodb,并创建一个数据列表图,我想将其传递给带有道具的子组件。我在 created(){} 块中调用与 dynamoDB 通信的函数。
我不太擅长传递数据。相反,我在尝试填充 data(){} 块中的 productsData 对象时遇到以下错误。
我将products prop 的类型设置为我定义的接口。
然后我将 productsData data 对象转换为 products prop 类型。
由于某种原因,我无法将 push() 映射到 this.productsData 对象,因为它是 undefined。
这是错误
[Vue warn]: Missing required prop: "products"
at <Home onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< undefined > >
at <RouterView>
at <App> runtime-core.esm-bundler.js:6589
TypeError: _this.productsData is undefined
html:
<template>
<div class="home">
<HelloWorld :key="key" :products="products" />
</div>
</template>
打字稿代码:
<script lang="ts">
import { defineComponent, PropType } from "vue";
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers";
import DBResponse from "@/interfaces/DBResponse";
import HelloWorld from "@/components/HelloWorld.vue";
export default defineComponent({
name: "Home",
components: {
HelloWorld,
},
props: {
products: {
type: Object as PropType<DBResponse[]>,
required: true,
},
},
data() {
return {
key: 0,
productsData: this.products,
};
},
methods: {
forceRerender() {
this.key += 1;
},
async getProductData() {
const region = process.env.VUE_APP_AWS_REGION as string;
const clientDynamoDB = new DynamoDBClient({
region,
credentials: fromCognitoIdentityPool({
identityPoolId: process.env.VUE_APP_IDENTITY_POOL_ID as string,
accountId: process.env.VUE_APP_AWS_ACCOUNT_ID,
clientConfig: { region },
}),
});
const query_input = {
TableName: process.env.VUE_APP_TABLE_NAME,
IndexName: "GSI1",
KeyConditionExpression: "SK = :sort_key and DK1 = :data_key",
ExpressionAttributeValues: {
":sort_key": { S: "PRODUCT#BLEND" },
":data_key": { S: "listed" },
},
Select: "ALL_ATTRIBUTES",
};
const command = new QueryCommand(query_input);
try {
const results = await clientDynamoDB.send(command);
const items = results.Items;
const cloudfrontHost = process.env.VUE_APP_CLOUDFRONT_HOST as string;
if (items) {
for (const key in items) {
const item = items[key];
this.productsData.push({
id: item.PK.S?.split("PRODUCT#")[1],
name: item.Name.S,
src: cloudfrontHost.concat(
"/products/assets/",
item.PK.S?.split("PRODUCT#")[1] as string,
".png"
),
description: item.Description.S,
price: item.Price.S,
});
}
}
} catch (err) {
console.error(err);
}
console.log(this.productsData);
this.forceRerender();
},
},
created() {
this.getProductData();
},
});
</script>
【问题讨论】:
-
由于
products是一个路由器视图组件的道具,我希望它可以在您的路由配置的prop函数中设置,或者通过查询参数设置,但它是一个对象数组,所以 URL 不是一个理想的媒介。您决定将products设为道具的原因是什么? -
我不想在我不相信的 URL 中设置它。也许我的结构是错误的。也许我需要这个视图来加载组件,并让组件进行 dynamodb 查找。从那里,组件可以向视图发出一些东西,并在完全解析响应后强制组件重新加载,以便我的产品呈现?
标签: typescript vue.js vuejs3