【发布时间】: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 中的一些文本。但是每当我尝试在方法中获取它时,我会得到undefined 或null,这取决于我使用的是纯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>
【问题讨论】:
-
您的参考文献
<div ref='myDiv>没有结束报价 -
谢谢,这只是 Stackoverflow 中的一个错字。
-
问题是当
console.log$refs时,DOM 中没有你的 div。如果您可以提供 sn-p 代码来记录 refs 以及模态组件,这对我们将非常有帮助。 -
谢谢,我加了一个sn-p。如您所见,当我使用
setTimeout延迟函数调用时,一切正常,但这感觉就像一个 hacky 解决方案。 -
你试过这个$nextTick()吗?
标签: javascript vue.js dom vuejs2