如何迭代 Promise 值并填写表单?
How to Iterate Promise values and fill in the form?
我有一个异步函数 return 获取请求:
async fetchDataByCodOS(codOS){
const res = await fetch(
'http://localhost:5000/cods/'+codOS,
{
method:"GET"
}
).then(res => res.json())
return res
}
我能够打印一个 Promise 对象,现在我必须迭代它。通过在 v-text-field
中使用 @input:change()
change(){
this.fetchDataByCodOS(this.codOS).then( result => console.log(result) ); // Returning Object inside Array
}
我只想抓取对象 Json:
change(){
this.fetchDataByCodOS(this.codOS).then( result => result.forEach(
el => console.log(el)
));
}
是的,现在我可以访问对象中的元素,但我无法填写我的表单,使用 v-model 的示例:
<v-text-field label="ID" v-model="ID" disabled> </v-text-field>
我认为正确的填充方法是在我可以在 forEach 中使用的数据中创建一个 ob = {},但我没有。
export default {
data(){
return {
ob: {
//values here
}
}
}
}
你们可以建议我更好的 practice/way 来完成这项工作吗?
正在更新
VUE 表格:
<v-text-field
label="Id. OS"
v-model="codOS"
@input="change()"
>
</v-text-field>
</v-col>
<v-col cols="12" md="9">
<v-text-field label="ID" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-text-field label="NAME" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="8">
<v-text-field label="CITY" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="9">
<v-text-field label="FONE" disabled> </v-text-field>
</v-col>
<script>
export default {
data (){
return{
codOS: '',
}
},
methods:{
autocomplete(){
if(this.codOS.length == '5'){
const data = this.fetchDataByCodOS(this.codOS);
//data.then(r => console.log(r)); // Here I just grab the data object, but I'm trying to remove the array, so.
data.then(r => r.forEach(el =>
console.log(el)
//I think her I want to take el.nameObject and assign to v-model
))
}
},
// Change my function according MAX
async fetchDataByCodOS(codOS){
const res = await fetch(
'http://localhost:5000/cods/'+codOS,
{
method:"GET"
}
)
const json = await res.json()
return json
}
}
}
</script>
控制台显示的是什么:
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(1)
0: {ID: "1", NAME: "EDDY", CITY: "NEW YORK", FONE: "6456465465456"}
length: 1
__proto__: Array(0)
Add.vue?5f53:71
{ID: "1", NAME: "EDDY", CITY: "NEW YORK", FONE: "6456465465456"}
ID: "1"
NAME: "EDDY"
CITY: "NEW YORK"
FONE: "6456465465456"
__proto__: Object
也许不要将 async/await 与 then 语法混合使用
如果 async/await 语法可用,则不需要使用 then
函数,因为 await/async 在转译时,转译为 then
功能。所以这里没有必要把它们混在一起。
- fetch() 是异步的,因此必须等待
- json() 也是异步的(明白了!),必须等待
async fetchDataByCodOS(codOS){
const result = await fetch(
'http://localhost:5000/cods/'+codOS, { method:"GET"}
)
const json = await result.json()
return json
}
如何绑定数据
您可以在挂载方法中进行异步调用,并将其设置在组件的 data
部分,然后将其传递到模板中。
我使用了 open trivia API 这是一组迭代,你可以看到我是如何使用 v-for
进行迭代的,然后你可以使用 handlebar 类型语法
<template>
<div>
<div v-for="(item) in results">
<div style="border: 1px solid black; padding: 48px">
<p>q: {{item.question}}</p>
<p>a: {{item.correct_answer}}</p>
<p> <input v-model="item.category"> </p> // binding inputs
</div>
</div>
</div>
</template>
<script>
export default {
name: "App",
components: {},
props: ["initialResults"],
data() {
return {
results: [{ question: "", category: "" }]
};
},
async mounted() {
var result = await fetch("https://opentdb.com/api.php?amount=10", {
method: "GET"
});
var json = await result.json();
this.results = json.results;
console.log(json);
}
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
绑定表单输入
根据 https://vuejs.org/v2/guide/forms.html,您可以像这样将模型直接绑定到输入
<input v-model="item.category">
我在这里的沙盒上得到了类似的工作https://codesandbox.io/s/max-vue-fetch-iterate-wc5qm?file=/src/App.vue
我发现以下链接有助于构建我的answer/learning操作方法
https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/
https://vuejs.org/v2/guide/list.html
https://vuejs.org/v2/guide/forms.html
我有一个异步函数 return 获取请求:
async fetchDataByCodOS(codOS){
const res = await fetch(
'http://localhost:5000/cods/'+codOS,
{
method:"GET"
}
).then(res => res.json())
return res
}
我能够打印一个 Promise 对象,现在我必须迭代它。通过在 v-text-field
@input:change()
change(){
this.fetchDataByCodOS(this.codOS).then( result => console.log(result) ); // Returning Object inside Array
}
我只想抓取对象 Json:
change(){
this.fetchDataByCodOS(this.codOS).then( result => result.forEach(
el => console.log(el)
));
}
是的,现在我可以访问对象中的元素,但我无法填写我的表单,使用 v-model 的示例:
<v-text-field label="ID" v-model="ID" disabled> </v-text-field>
我认为正确的填充方法是在我可以在 forEach 中使用的数据中创建一个 ob = {},但我没有。
export default {
data(){
return {
ob: {
//values here
}
}
}
}
你们可以建议我更好的 practice/way 来完成这项工作吗?
正在更新
VUE 表格:
<v-text-field
label="Id. OS"
v-model="codOS"
@input="change()"
>
</v-text-field>
</v-col>
<v-col cols="12" md="9">
<v-text-field label="ID" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-text-field label="NAME" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="8">
<v-text-field label="CITY" disabled> </v-text-field>
</v-col>
<v-col cols="12" md="9">
<v-text-field label="FONE" disabled> </v-text-field>
</v-col>
<script>
export default {
data (){
return{
codOS: '',
}
},
methods:{
autocomplete(){
if(this.codOS.length == '5'){
const data = this.fetchDataByCodOS(this.codOS);
//data.then(r => console.log(r)); // Here I just grab the data object, but I'm trying to remove the array, so.
data.then(r => r.forEach(el =>
console.log(el)
//I think her I want to take el.nameObject and assign to v-model
))
}
},
// Change my function according MAX
async fetchDataByCodOS(codOS){
const res = await fetch(
'http://localhost:5000/cods/'+codOS,
{
method:"GET"
}
)
const json = await res.json()
return json
}
}
}
</script>
控制台显示的是什么:
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(1)
0: {ID: "1", NAME: "EDDY", CITY: "NEW YORK", FONE: "6456465465456"}
length: 1
__proto__: Array(0)
Add.vue?5f53:71
{ID: "1", NAME: "EDDY", CITY: "NEW YORK", FONE: "6456465465456"}
ID: "1"
NAME: "EDDY"
CITY: "NEW YORK"
FONE: "6456465465456"
__proto__: Object
也许不要将 async/await 与 then 语法混合使用
如果 async/await 语法可用,则不需要使用 then
函数,因为 await/async 在转译时,转译为 then
功能。所以这里没有必要把它们混在一起。
- fetch() 是异步的,因此必须等待
- json() 也是异步的(明白了!),必须等待
async fetchDataByCodOS(codOS){
const result = await fetch(
'http://localhost:5000/cods/'+codOS, { method:"GET"}
)
const json = await result.json()
return json
}
如何绑定数据
您可以在挂载方法中进行异步调用,并将其设置在组件的 data
部分,然后将其传递到模板中。
我使用了 open trivia API 这是一组迭代,你可以看到我是如何使用 v-for
进行迭代的,然后你可以使用 handlebar 类型语法
<template>
<div>
<div v-for="(item) in results">
<div style="border: 1px solid black; padding: 48px">
<p>q: {{item.question}}</p>
<p>a: {{item.correct_answer}}</p>
<p> <input v-model="item.category"> </p> // binding inputs
</div>
</div>
</div>
</template>
<script>
export default {
name: "App",
components: {},
props: ["initialResults"],
data() {
return {
results: [{ question: "", category: "" }]
};
},
async mounted() {
var result = await fetch("https://opentdb.com/api.php?amount=10", {
method: "GET"
});
var json = await result.json();
this.results = json.results;
console.log(json);
}
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
绑定表单输入
根据 https://vuejs.org/v2/guide/forms.html,您可以像这样将模型直接绑定到输入
<input v-model="item.category">
我在这里的沙盒上得到了类似的工作https://codesandbox.io/s/max-vue-fetch-iterate-wc5qm?file=/src/App.vue
我发现以下链接有助于构建我的answer/learning操作方法
https://www.sitepoint.com/fetching-data-third-party-api-vue-axios/ https://vuejs.org/v2/guide/list.html https://vuejs.org/v2/guide/forms.html