[Vue.js]その時点で存在しない要素にアクセスする
2019/12/11
Vue.js
Vue.jsにて、v-if
ディレクティブによりでレンダリングされていない要素を$refs
で参照しようとして嵌ったので記録を残しておきます。
環境
- vue 2.6.10
- typescript 3.5.3
NGケース
ボタンを押したら入力フィールドを表示してフォーカスを当てる単一ファイルコンポーネントです。フォーカスしようとしてもその時点ではDOM要素が存在しないので、this.$refs.inupt
はundefined
になってしまうわけですね。
<template>
<div>
<input v-if="isInputMode" ref="input">
<button v-on:click="onClick">focus</button>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component
export default class Sample extends Vue{
isInputMode : boolean = false;
onClick() : void{
isInputMode = true;
(this.$refs.input as HTMLInputElement).focus();
}
}
</script>
解決法
マウントしなおしてからアクセスするようにすればいいですね。
onClick() : void{
isInputMode = true;
Vue.nextTick(() =>{
(this.$refs.input as HTMLInputElement).focus();
});
}
まあとりあえず動くんですけど、時間を跨ぐ処理は不明なバグを埋めやすいのでなるべく避けたいですね。