LoginSignup
3
2

More than 1 year has passed since last update.

Vue.js(Nuxt.js) v-if使用時$refsがundefinedになってしまう時の対処法

Posted at

Vue.js(Nuxt.js)にて、 v-if使用時に$refsがundefinedになってしまう時の対処法になります。

v-if使用時$refsがundefinedになってしまう

<template>
  <div>
    <input v-if="isInputName" ref="inputName" type="text" name="name" />
    <button @click="inputFocus">編集</button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    inputFocus() {
      this.isInputName = true
      const inputName = this.$refs.inputName
      inputName.focus()
    }
  }
})
</script>

上記のコード例ですと、TypeError: Cannot read property 'focus' of undefinedと言うエラーが出ます。
v-ifはレンダリングされないので、$refsでは取得できずにundefinedとなる為です。
v-showに変更すればundefinedにはなりません。

v-ifのレンダリングを待つことで解決

v-ifによるレンダリングを待つことで解決することができます。

setTimeout

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    inputFocus() {
      this.isInputName = true
      setTimeout(() => {
        const inputName = this.$refs.inputName
        inputName.focus()
      }, 100)
    }
  }
})
</script>

setTimeoutで処理を遅らせることで、$refsがundefinedになるのを防げます。

async/await

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      isInputName: false
    }
  },
  methods: {
    async inputFocus() {
      await (this.isInputName = true)
      const inputName = this.$refs.inputName
      inputName.focus()
    }
  }
})
</script>

async/awaitv-ifのレンダリングを待つことでも対応できます。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2