我有一个父/子组件设置,父母从服务器加载数据并通过道具传递给儿童。在这个孩子中,我想用父母收到的一些数据实例化一个jQuery日历。VueJs子组件道具没有立即更新
为了在设置日历之前等待数据,我在父项中广播了一个事件,该事件中有一个为子项设置的事件侦听器。
监听器正在被解雇,但如果我this.$log('theProp')
,它是未定义的。但是,如果我用VueJs devtools检查组件,那么父母/孩子的关系就在那里,同时这个孩子已经收到了道具。
道具在儿童身上被定义为动态道具:the-prop="theProp"
。由于孩子最终收到道具,我假设我的设置是正确的,但似乎有某种延迟。父母在ajax调用的返回函数中设置道具并且再次:它正在工作,只是稍微延迟了一下。
我还试着在儿童道具上注册一个watch
监听器,这样我就可以设置日历,并确保道具在那里。但是,监听者会触发,但this.$log('theProp')
仍未定义。
如果我将数据与广播电话一起传递,如this.$broadcast('dataLoaded', theData)
,孩子接收它就好了。但这样做似乎是错误的,因为我基本上构建了自己的道具处理程序。
我没有发布任何代码,因为组件相当大,VueJs devtools告诉我父/子情况正在工作。
我是否缺少一些信息?在设置父母的值和接受父母的孩子之间是否有轻微的延迟?等待孩子父母数据的正确方法是什么?
通常,当您只是将数据呈现到模板中时,由于数据绑定到模板,时序并不重要。但在这种情况下,我确实需要数据来设置日历,否则将会出错。
谢谢。
编辑1:这里是一个的jsfiddle:https://jsfiddle.net/dr3djo0u/1/ 这似乎证实,广播后马上数据不可用。然而,观察者确实工作,尽管我几乎可以发誓,当我设置测试用例时,有时this.$log('someData')
返回undefined
。
但我想我的问题可能在别的地方,今晚我会看看,现在没有和我在一起的项目。
编辑2:做了一些更多的测试。我的问题是a)事件监听器似乎不能立即收到数据,并且b)我也试图在route.data
回调中初始化日历,如果someData
已经在(例如来自父代时),但是调用该路由回调组件准备就绪之前,所以它不在那里工作。
我的解决方案现在是这样的:
// works when the child route is loaded directly and parent finishes loading someData
watch: {
someData() {
this.initCalendar();
}
},
// works when navigating from parent (data already loaded)
ready() {
if (this.someData && this.someData.length) {
this.initCalendar()
}
}
嗨,你可以提供一个简单的代码示例来重现该问题? – Nora
如果你正在'监视'一个变量,并且'watch'内的值是未定义的,事实上它将它设置为undefined。 –
感谢您的意见。用我发现的问题更新了我的问题。 – Chris