您好我是VueJS的新手并且已经开始处理非常简单的API请求。我有一个看起来像这样的对象:
posts: [
text: "String",
choices: {"1":"Yes","2":"No"}
]
来自棱角分明,这看起来非常简单。我只想使用过滤器将选择转换为对象并循环它。但是,我遇到了一个问题。当我尝试使用过滤器' log'或者' json'在v-for中,他们不能工作。
<template>
<div>
<li v-for="(post,index) in posts | log">
<ul>
{{ post.text | log }}
{{ post.choices | json }}
<li v-for="(value,key) in post.choices | json">
{{value}} {{key}}
</li>
</ul>
</li>
</div>
</template>
<script>
import {HTTP} from './main';
export default {
filters: {
json: function (value) {
return JSON.parse(value)
},
log: function (value) {
console.log(value)
}
},
props: [
'apiKey'
],
data: () => ({
posts: [],
post: [],
errors: []
}),
created() {
HTTP.get('questions', { headers: { 'Api-Key': this.apiKey} })
.then(response => {
this.posts = response.data
})
.catch(e => {
this.errors.push(e)
})
}
}
</script>
然后没有数据显示,但它们在胡子模板中工作正常。有关如何实现这一目标的任何想法?
TL;博士
工作的:
{{ post.choices | json }}
不起作用:
<li v-for="(value,key) in post.choices | json">
有什么工作吗?我无法使用计算属性,因为这是一个&#34;子对象&#34;除非我弄错了,否则数组和计算属性不会那样工作?
答案 0 :(得分:3)
您无法向v-for
指令添加过滤器。
在设置posts
数据属性之前解析数据:
HTTP.get('questions', { headers: { 'Api-Key': this.apiKey} })
.then(response => {
let posts = response.data;
post.forEach(p => p.choices = JSON.parse(p.choices));
this.posts = posts;
})
答案 1 :(得分:1)
我不明白为什么你需要使用JSON.parse
,因为choices
键引用了一个有效的JS对象。除非你犯了一个错误,并且choices
键引用了一个字符串。
无论如何,如果要将post.choice
解析为有效的JS对象,只需将其传递给自定义函数,该函数将解析后的JSON返回到v-for
,例如:
<li v-for="(value,key) in postChoicesJson(post.choice)">
{{value}} {{key}}
</li>
然后为此声明一个方法:
postChoicesJson: function(obj) {
return JSON.parse(obj);
}
注意:您的DOM无效,因为<li>
元素必须是<ul>
或<ol>
元素的直接子元素