javascript - VueJS 没有响应数组长度的变化?
问题描述
使用单文件模板,我希望有一个按钮,如果数组为空,则显示“单击此处”,如果已填充则显示值。ajax 工作正常,对象正在更新,但按钮不会重新呈现。我在这里做错了什么?
<template>
<span>
<button
v-if="value.app_token.length"
class="btn btn-outline-primary btn-sm"
disabled
>Mobile App Token: {{ value.app_token[0].token }}</button>
<button v-else class="btn btn-primary btn-sm" @click="getToken">Click to get Mobile App Token</button>
</span>
</template>
<script>
module.exports = {
props: ["value"],
methods: {
getToken() {
axios
.get("/patients/getToken/" + this.value.id)
.then(response =>
this.value.app_token.splice(
0,
this.value.app_token.length,
response.data
)
)
.catch(error => console.log(error));
}
}
};
</script>
解决方案
该getToken
方法使道具发生变异value
,这是不允许的(您可能在控制台中遇到错误)。
解决方案
为令牌创建一个计算值,并创建一个变量来保存获取的数据:
data() {
return {
fetched: null
}
},
computed: {
token() {
let token = JSON.parse(JSON.stringify(this.value.app_token));
if (this.fetched) {
// Now this mutates a copy, not the original
token.splice(0, token.length, this.fetched);
}
return token;
}
}
如果没有获取任何内容,则令牌值将与道具中的相同。否则,它将重新计算到修改后的令牌。更改您的getToken
方法,使其目的是将数据结果存储在fetched
:
methods: {
getToken() {
axios
.get("/patients/getToken/" + this.value.id)
.then(response => this.fetched = response.data)
.catch(error => console.log(error));
}
}
现在使用你的计算v-if
:
v-if="token.length"
并显示如下:
{{ token[0].token }}
这是给你的演示
此外,如果 token prop 只是 token 字符串本身而不是复杂对象的一部分,然后也将 axiosid
作为单独的 prop 传递,那么这将不会令人困惑。
推荐阅读
- php - 在更改下拉列表时提交表单以重新排序同一页面上的项目
- python - 如何从 def 永久更改全局变量
- powershell - 在任意长度的子字符串上拆分字符串 (Powershell)
- dialogflow-es - 是否可以使用对话流访问本地网络设备 API?
- python - keras - 评估生成器使用相同的训练数据产生不同的准确率
- python-3.x - 无法更改opencv中的输入视频分辨率
- alloy - 推理子类型的属性
- html - 使用正则表达式从 HTML 字符串中提取所需的属性值
- php - 如何修复菜单位置不保存在 Laravel Voyager 中?
- google-bigquery - 使用 BigQuery Jupyter 魔术命令时将变量从 python 环境添加到查询