0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

beforeCreate

Posted at

beforeCreate

beforeCreateフックははインスタンスが生成され始めた直後に呼び出される。
つまりインスタンスが初期化される前に呼び出されるのでdataオプションに記述されてる
データの更新や参照はできない。
100分は一件にしかずということで実際にやってみた

以下のコードは単純でbeforeCreateでdataのmessageを呼び出している
↑のbeforeCreateフックの説明が正しけばdataオプションはまだ初期化されてないので
undefindが出力されるはず

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'test'
    };
  },
  // インスタンスが初期化する前に呼び出される
  beforeCreate() {    
    console.log(this.message)
  }
};
</script>

出力結果

undefined

想像の通りundefindが出力された

で、次は更新してみよう。

beforeCreate内でmessageの値を'Test Message'に更新して出力してみる。
データ初期化前にデータを更新しようとしたら恐らくReferenceError、TypeError
等になるはず
実際に試し目見る

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'test'
    };
  },
  // インスタンスが初期化する前に呼び出される
  beforeCreate() {
    this.message = 'Test Message'
    console.log(this.message)
    
  }
};
</script>

出力結果

Test Message

ファ!?!?!?!?更新されてる!?!?

この現象について調べてみたけどあまりピンとくる記事がなかったのでChatGPTさんに質問した

↓GPTさんによる考察

beforeCreate フック内で this.message の更新が実行されているように見えますが
それは Vue.js の内部的な仕組みやブラウザの実行環境により、意図せず動作している可能性があります。
これは、Vue の一部のバージョンや特定のブラウザ環境では発生する場合がありますが
Vue の仕様上は beforeCreate フック内で data プロパティに依存しないのが原則です。

とのことです。
まあそもそもインスタンス初期化が完了する前にbeforeCreateでdataオプションの値を更新することなんて滅多にないと思うのでdataオプションの更新は大人しくcreated以降のフックで行うようにしましょう。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?