简体   繁体   English

如何在 asyncData 之后滚动到元素?

[英]How to scroll to an element after asyncData?

I'm getting some data via asyncData and after the items are displayed, the website has to scroll to an element.我通过asyncData获取一些数据,显示项目后,网站必须滚动到一个元素。

methods: {
    scrollTo() {
        // ScrollTo Element...
    }
},
asyncData({ env, params }) {
    return axios.get(`${env.cockpit.apiUrl}/collections/get/kalender`)
    .then(({data}) => {
        return {
            items
        }
    })
}

this.scrollTo() is not available in asyncData . this.scrollTo()asyncData中不可用。

If I use a timeout in the mounted() method, it works.如果我在mounted()方法中使用超时,它可以工作。 Without a timeout it doesn't.没有超时就不会。

mounted() {
    setTimeout(() => {
        this.scrollTo()
    }, 500)
}

But I think, this is not the right way.但我认为,这不是正确的方法。 The same thing with this.$nextTick is not working, either.this.$nextTick相同的事情也不起作用。

What is the right way to scroll to an element after getting the data via asyncData() ?通过asyncData()获取数据后滚动到元素的正确方法是什么?

I'd suggest using events i'm not too sure about event dispatching in vue, in angular we have:我建议使用我不太确定 vue 中的事件调度的事件,在角度我们有:

$scope.$broadcast('event-name', data)

$scope.$on('event-name', () => {})

but I'll show in you vanilla js so you can learn how it works under the hood.但我会向你展示 vanilla js,这样你就可以了解它是如何在幕后工作的。

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

We'll want to register the event to the window or even better the element that should be targeted.我们希望将事件注册到窗口,甚至更好地注册应该定位的元素。

const onDataFetched = new Event('on-kalender-fetched');
    
methods: {
   scrollTo() {
     // ScrollTo Element...
   }
},
        
        
asyncData({ env, params }) {
   return axios.get(`${env.cockpit.apiUrl}/collections/get/kalender`)
      .then(({data}) => {
         return {
           items
         }
       })
       .finally(items => window.dispatchEvent('on-kalender-fetched', items))
}
    

next we'll want to set up the listener in your mounted function you'll want to avoid timeouts as what if they're on a slow connection and it takes more than half a second its much more reliable this way.接下来,我们将要在您的挂载函数中设置侦听器,您将要避免超时,因为如果它们的连接速度较慢并且需要半秒以上的时间,这种方式更加可靠。

 mounted() {
    window.addEventListener('on-kalender-fetched', () => this.scrollTo(), false);
 }

finally we want to dispatch the event when the request has finished using window or an element.dispatchEvent('name-of-event', dataToSend)最后,我们希望在请求完成时使用 window 或 element.dispatchEvent('name-of-event', dataToSend) 调度事件

EDIT:编辑:

how vue does event dispatching vue 是如何进行事件调度的

this.$emit('myEvent')

Listening to the kebab-cased version will have no effect:听 kebab-case 版本将没有效果:

 <my-component v-on:my-event="doSomething"></my-component>

https://v2.vuejs.org/v2/guide/components-custom-events.html https://v2.vuejs.org/v2/guide/components-custom-events.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM