使用scrollIntoView()的VueJS组件

时间:2017-06-17 16:54:10

标签: javascript html vue.js getelementbyid vue-component

我正在尝试在vue组件中使用document.getElementById()。scrollIntoView()来使用Jump-To-Div类功能。

如果我在组件中调用该函数,该功能可以正常工作。但是如果我尝试使用ref从父组件调用该函数,则该元素不会滚动到视图中。

父组件是一个页面,子组件是页面中的选项卡。

这是父组件中的子Vue组件: -

<el-tab-pane label="Solution Details" name="Solution Details" v-loading="loading">
                <solution-details
                    :formData="response"
                    ref="solutionDetails"
                    @done="$emit('done')">
                </solution-details>
            </el-tab-pane>

所以有一个SolutionDetails.Vue子组件,它有一个ref =“solutionDetails”。 我使用子组件的ref:

在父组件
中调用此方法
handleClick(command) {
            this.activeTab = 'Solution Details';
            this.$refs.solutionDetails.showCurrent(command);
        },

子组件中有一个showCurrent函数,它应该为参数“command”执行。这是子组件中的功能

methods: {
        showCurrent(index) {
            document.getElementById(index).scrollIntoView();
        },

正如您所看到的,showCurrent应该获取页面中的元素并应滚动到视图中。如果SolutionDetails.vue是活动选项卡,则相应的元素将完全滚动到视图中。但我正在从其他选项卡执行父函数,然后this.activeTab = 'Solution Details';正在执行,即。活动选项卡正在更改为SolutionDetails.vue,但请求的元素不会滚动到视图中。

当其他标签是activeTab时,我该怎么做才能滚动到一个元素?

3 个答案:

答案 0 :(得分:6)

问题是{<1}}在选项卡在页面上呈现之前被称为,因为渲染是异步的。基本上,当你打电话

scrollIntoView

Vue不会立即呈现页面,它只是对渲染进行排队。然而,在此之后,您立即告诉Vue寻找渲染的元素并滚动到它。它还没有。

我认为我第一次尝试解决这个问题就是使用$nextTick

this.activeTab = 'Solution Details';

在尝试滚动到视图之前,应该等待需要发生的渲染。

答案 1 :(得分:2)

实际上,您必须引用组件中的元素。

例如:this.$refs[ref name here].$el.scrollIntoView();

答案 2 :(得分:1)

给你想要的元素一个引用名称。在父元素上的函数内部,最好尝试 console.log(this.$refs.[ref_name]) 来检查哪个部分会产生影响。它并不总是父元素。真的取决于你的 CSS 结构。当提交表单并收到错误信息时,视图会转到您想要的部分。

1, 2, 3
1, 2, 3
1, 2, 3