【发布时间】:2021-10-12 14:05:05
【问题描述】:
假设我有 foo.vue,我将其作为名为 a 和 b 的组件导入到父级中,并根据变量 show 显示
现在如果我在组件a 和b 之间切换而不设置show = null,我会得到各种子状态错误。
所以我将show设置为null,然后像这样设置为相应的vue组件
this.show = null
this.show = a // or b
但这不起作用。组件以前一个状态结束。即使在未更新的道具上也可以验证这一点。
我使用timeout使它工作
toggle(show){
this.show = null
let that = this
setTimeout(() => {
that.show = show
}, 200)
}
有没有更好的方法?这对我来说并不优雅
我的理解是,如果父母告诉它切换它应该从空白开始并重建,那么孩子内部发生的事情并不重要?但就我而言,情况并非如此。有什么可能导致我的问题吗?
设置为null 会以某种方式强制进行硬刷新?
我的子组件很复杂,通过 ajax 调用来检索列表,但没有什么特别之处。
父代码
<template>
<div id="userAreaEventWrapper">
<div class="userarea-submenu">
<div v-on:click="toggle(comps.eventForm)" class='button-base-out'>
<div :class="isSelected(comps.eventForm)">
New Event
</div>
</div>
<div v-on:click="toggle(comps.events)" class='button-base-out'>
<div :class="isSelected(comps.events)">
My Events
</div>
</div>
<div v-on:click="toggle(comps.eventsAttending)" class='button-base-out'>
<div :class="isSelected(comps.eventsAttending)">
Attending
</div>
</div>
</div>
<EventForm v-if="show === comps.eventForm" @created="toggle(comps.events)" :mode="'create'"></EventForm>
<Events ref="events" :mode="currentMode" v-if="show === comps.events" @noResults="toggle(comps.eventForm)" :attending="false"></Events>
<AttendingEvents ref="attending" :mode="'home'" v-if="show === comps.eventsAttending" :attending="true"></AttendingEvents>
</div>
</template>
<script>
const EventForm = () => import( './event-form.vue')
const Events = () => import( './events.vue')
const AttendingEvents = () => import( './events.vue')
export default {
name: "UserEventComponent",
components:{
EventForm,
Events,
AttendingEvents
},
data(){
return{
comps:{
eventForm:1,
events:2,
eventsAttending:3
},
show: 2,
currentMode:'user',
}
},
methods: {
toggle(show){
this.show = null
let that = this
setTimeout(() => {
that.show = show
}, 200)
},
isSelected(n){
return n === this.show ? 'button-base-in button-base-in-hover' : 'button-base-in'
},
},
}
</script>
孩子
在mounted()上获取api
mounted() {
this.currentMode = this.mode
if(this.resumeData && this.resumeData.slug){
this.selectedSlug = this.resumeData.slug
} else {
this.resume(this.resumeData)
this.getEvents()
}
}
【问题讨论】:
-
请为您的问题提供stackoverflow.com/help/mcve。目前还不清楚它到底是什么样子。 但这不起作用,因为 JS 是异步正确的 - 它是异步还是同步,为什么它不起作用取决于你的情况。
-
是的,这不是一个好的说法,我知道 js 可以是异步的或同步的。但这与我认为的 JS 并没有真正的关系,而是更多的 vue 方式?我在网上没有看到任何地方说您应该使用承诺或异步或使用超时来保持状态分离
-
请张贴代码,不要描述它,这是 SO 规则要求的,以避免歧义。您可以看到为什么这很重要,用户已经发布了没有解决问题的答案,因为它不适合您的实际代码。
-
你想让我把孩子也寄出去吗?
-
@Roamer-1888 是的,就是这样,从您链接的帖子中,我只需将 :key="someUniqueValue" 添加到每个子组件,不再需要超时!谢谢。请发表一个答案,我会接受它
标签: javascript vue.js promise timeout