【问题标题】:JavaScript: Get DOM elements inside Vue.js modalJavaScript:在 Vue.js 模态中获取 DOM 元素
【发布时间】:2019-08-13 15:32:24
【问题描述】:

我在我的 Vue 应用程序中使用 Vue.js modal。它是 Vue 组件的一部分。模板部分仅包含模态:

<template>
    <!-- Modal: Edit exercise -->
    <modal name='edit-exercise-modal'
           :draggable='true'
           height='auto'>

        <form @submit.prevent='storeEdits'>
            <div ref='myDiv'>Some text</div>
            <!-- Also tried:
            <div id='my-div'>Some text</div>
            -->
        </form>

    </modal>
</template>

我需要访问 DOM 元素以使用 Rangy 库并突出显示 my-div 中的一些文本。但是每当我尝试在方法中获取它时,我会得到undefinednull,这取决于我使用的是纯JS 还是Vue refs:

console.log(this.$refs.myDiv); // undefined
console.log(document.getElementById('my-div'); // null

当我执行console.log(this.$refs) 时,我在refs 属性中得到myDiv。但是当我在console.log 之后直接用debugger 停止代码执行时,refs 似乎是空的。

这里有什么问题?我该怎么做才能获得对我需要修改的div 的引用?

编辑:这是一个更完整的 sn-p

<template>
    <!-- Modal: Edit exercise -->
    <modal name='edit-exercise-modal'
           :draggable='true'
           height='auto'>

        <form @submit.prevent='storeEdits'>
            <div ref='myDiv'>Some text</div>
            <!-- Also tried:
            <div id='my-div'>Some text</div>
            -->
        </form>

    </modal>
</template>

<script>

    import Vue from 'vue';

    import VModal from 'vue-js-modal';
    Vue.use(VModal);

    import rangy from 'rangy';
    import 'rangy/lib/rangy-classapplier';

    export default {

        props: [ 'exercise' ],

        /**********************************************
        ********************* Data ********************
        **********************************************/

        data: function() {
            return {
                selected:    [],
                category_id: undefined,
                text:        undefined,
                mistakes:    undefined
            };
        },


        /**********************************************
        ******************** Methods ******************
        **********************************************/

        methods: {
            sampleMethod: function() {
                console.log(this.$refs.textWithMistakes);
                console.log(document.getElementById('text-with-mistakes'));
            }
        },


        /**********************************************
        ******************* Watchers ******************
        **********************************************/

        watch: {
            /**
             * Sets up and shows modal when exercise data is loaded from parent.
             */
            exercise: function() {
                this.category_id = this.exercise.category_id;
                this.text = this.exercise.text;
                this.mistakes = this.exercise.mistakes;

                this.$modal.show('edit-mistakes-exercise-modal');

                // Not working
                this.applyClass(sampleMethod);
                
                // Working, but not a way I'd like to go
                setTimeout(() => {
                    this.applyClass(sampleMethod);;
                }, 3000);
            }
        }
    }
</script>

【问题讨论】:

  • 您的参考文献&lt;div ref='myDiv&gt;没有结束报价
  • 谢谢,这只是 Stackoverflow 中的一个错字。
  • 问题是当console.log $refs 时,DOM 中没有你的 div。如果您可以提供 sn-p 代码来记录 refs 以及模态组件,这对我们将非常有帮助。
  • 谢谢,我加了一个sn-p。如您所见,当我使用 setTimeout 延迟函数调用时,一切正常,但这感觉就像一个 hacky 解决方案。
  • 你试过这个$nextTick()吗?

标签: javascript vue.js dom vuejs2


【解决方案1】:

只要模态框关闭,您就无法访问模态框内的内容。但是当模式切换为可见时,vue-js-modal 组件会发出一个“打开”事件。您可以在模式打开并完成渲染时调用您的代码。

<modal 
  name='edit-exercise-modal'
  @opened="onModalOpened"
  :draggable='true'
  height='auto'
>
   ...
</modal>

【讨论】:

  • 1:这不适用,至少模板内没有v-if。 2:我不明白这种方法。我应该什么时候发出一个事件,我应该如何处理它? 3:我确实将数据作为道具传递,只是在模态打开之前,该数据是未定义的。这个道具上有一个观察者,当道具改变时显示模态。所以我明白为什么setTimeout 解决了我的问题,我只需要一个解决方案而不必猜测我需要等待的时间间隔。
  • 对不起,没注意到模态不是你自己的代码。看看这个:github.com/euvl/vue-js-modal/blob/master/src/Modal.vue#L25 那是v-if 我在说。这意味着,在模态框可见之前,模态框内的 HTML 不存在。
  • 选项 2 可能是一个解决方案:github.com/euvl/vue-js-modal/blob/master/src/Modal.vue#L524 打开模式时会发出一个事件。 &lt;modal @opened="onModalOpened"&gt;
  • @opened 解决了我的问题。我实际上知道这个事件,但我很困惑,因为在我的情况下,模态在嵌套组件内,我认为这个事件对我没有帮助。谢谢!
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多