【发布时间】:2021-07-25 23:10:41
【问题描述】:
我有一个空表单,我想在已安装的生命周期挂钩中为活动用户设置“负责职员”输入。它看起来像这样:
<b-form-select
v-model="form.responsible_clerk"
:options="clerks"
required
></b-form-select>
data() {
return {
form: {
responsible_clerk: ""
}
}
},
computed: {
user() {
return this.$store.getters.getUser;
}
},
mounted() {
this.form.responsible_clerk = this.user.name + " " + this.user.lastname;
}
这对于 this.form.responsible_clerk 和 this.user 都显示为 undefined。
当我用 0ms 超时将挂载的钩子的内容包装在 setTimeout 中时,它会按预期工作。
mounted() {
setTimeout(() => {
this.form.responsible_clerk = this.user.name + " " + this.user.lastname;
},0)
}
我还需要在其他几种情况下执行此操作,其中我覆盖了挂载钩子中的变量。 (例如,当使用 vue bootstrap 的 b-collapse 并在挂载时将所有折叠元素设置为 true 并在以管理员身份创建用户时自动设置用户的公司时,也在挂载时)
有人可以向我解释为什么会发生这种情况,以及如何防止反复使用 setTimeout。这对我来说没有意义,Vue 不应该这样工作。
编辑: getUser 是一个 vuex getter:
getUser(state) {
return state.user;
}
编辑 2: 刚刚踏入它,又在做其他事情:
computed: {
max() {
return document.getElementById("collapse-header")
.querySelectorAll('div')
.length;
}
}
这不起作用,用 setTimeout 包装它会...
【问题讨论】:
-
getUsergetter 会发生什么?你在那里发出异步请求吗? -
getUser 是一个 vuex getter:
getUser(state) { return state.user; } -
如果它为空,我会收到控制台警告,并且变量会在收到其值时动态更改,我不介意。但它根本不起作用。
this.form.responsible_clerk = this.user?.name + " " + this.user?.lastname;也没有为我做任何事情。如果变量为 null 只是稍后动态更改,则不会有问题,但它可能不会动态调整变量的值。它只适用于 setTimeout。 -
你确定它实际上是
undefined,而不是""? -
如果
state.use最初为 NULL,然后收到一个值 - 您的responsible_clerk不会注意到这一点,除非您创建一个观察者并在每次state.user更改时更新responsible_clerk。
标签: javascript vue.js vuex bootstrap-vue