マウントされたフックでのエラー: "TypeError: TypeError: Cannot read property 'XXXXX' of undefined" マウントされたフックにエラーが発生しました。
今日、iview を使ってページを描画する際、コントロールを追加すると、非常に単純だが長年のバグに出くわした。
<user-select
style="width:200px"
@on-change="handleSelect"
ref="user"
v-model="form.userCode">
</user-select>
次に、$refs を使用して、コンポーネントのプロパティを呼び出します。
this.$refs.user.initData();
それから魔法が起こる、それがどのようにあるべきかに関係なく、それはマウントされたフックのエラーを報告し続ける: "TypeError.TypeError.TypeError.TypeError: このメソッドは以前から使われていたもので、なぜここで動作しないかはいろいろと推測できます。
やっとすごいものを見つけました。コンポーネントの位置を変えたらうまくいったのに、戻したら動かなくなったので、"これはiviewのバグで、2つのコントロールを真横に置くことができないのか、と思ったのです。そして、「まさか、vueのエコシステム全体はとても成熟しているので、こんな低レベルのエラーはないはずだ!」と思い、振り返りました。
そしてふと、このコントロールは余計なv-if判定がある位置にあることに気づいたのですが、レンダリング順のせいでしょうか?
<Row :gutter="32" v-if="type=='2'">
<Col span="12>
<FormItem label="user-select" prop="userCode" >
<user-select
style="width:200px"
@on-change="handleSelect"
ref="user"
v-model="form.userCode">
</user-select>
<FormItem>
</Col>
<Row>
突然、新しい世界を発見したような気分で、v-if属性を削除しても問題なく動作します。
そこで思ったのが、htmlコードのレンダリングを優先するvueの読み込みとレンダリングの仕組みで、jsコードはまだ実行されていないので、ダイナミックプロパティはまだ値を持っておらず、v-ifでラップされているコードブロックはラップされておらず、この時点でjs初期化コードを実行すると、当然callrefコンポーネントは未定義になってしまうということでした。
思い切って考えてみた結果、本当にそうなら、v-ifとv-showの違いによれば、v-showはhtmlを読み込むときに、表示しないだけでフルコードを読み込むので、その場合、jsコードを実行するときにコンポーネントが存在するはずだと推測されたのです。そこで、v-ifをv-showに変更してみると、確かにコードは正常に実行されます。
v-ifとv-showの違いをおさらいしておきましょう。
- の意味は、v-if は dom ノードの有無を制御して要素の表示を制御し、v-show は DOM 要素の表示スタイルを設定し、block は表示、none は非表示にすることです。
- コンパイルプロセス:v-ifトグルは、トグル中に内部のイベントリスナーやサブコンポーネントを適切に破棄して再構築する、ローカルなコンパイル/アンコンパイルプロセスを持ちます。v-showは、単純なcssベースのトグルです。
- コンパイル条件:v-ifは不活性で初期条件が偽の場合は何もしない、ローカルコンパイルは条件が最初に真になったときのみ開始する(コンパイルはキャッシュされ、切り替え時にローカルにアンロードされる)、v-showは任意の条件でコンパイルし(条件が最初に真であっても)キャッシュし、DOM要素は保持される。
- パフォーマンス消費:v-ifはトグルの消費量が多く、v-showは初期レンダリングの消費量が多くなります。
これらの違いから、頻繁にトグルする必要がある場合はv-showを、実行時に条件がほとんど変化しない場合はv-ifを使用するのがよいでしょう。
関連
-
vue.cli3はクロスドメイン問題を解決する XMLHttpRequestへのアクセスは「http://192.168.88.228/login/Login?phone=19939306484&pass」で。
-
VUE で未定義のエラーのプロパティ 'length' を読み取ることができません。
-
VueComponent で未定義のプロパティ '$el' を読み取ることができません。
-
ウィンドウやドキュメントがNuxtで定義されていない問題のまとめ
-
error: 'lianxi/' does not have a commit checked out fatal: Add files failed Solution
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'E:\webnode_modules_nod
-
無効なHostヘッダー サーバードメインのアクセス問題
-
vueコンソールがエラーUncaughtを報告する(promiseの場合)
-
Vueプロジェクトのエラーです。Uncaught (in promise) Error: ネットワークエラー
-
Vue+springboot+websocketベースのWeChatウェブチャットルーム(プライベートおよびグループチャット機能)の短い模造品(オンラインプレビュー可)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
npm ERR!コード ENOENT npm ERR!システムコールオープンエラーが解決されました。
-
「未定義のプロパティ'length'を読み取れない」エラー処理
-
videojs: エラーです。(CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) このメディアと互換性のあるソースは見つかりませんでした。
-
vueでechartsを使用する際の問題点。Error Initialize failed invalid dom
-
赤色と警告を報告することによって、vueで使用するためのvを解決する
-
Uncaught (in promise) TypeError: 未定義のVueエラーのプロパティ'theData'を読み取れない
-
npm install エラー "Unexpected end of JSON input while parsing near" は解決されました。
-
ElementUI checksum 【違反】スクロールブロックの「touchmove」イベントに非パッシブなイベントリスナーを追加した。問題解決
-
Vueプロジェクトを開くためのVSCode、解决无法对@/assets/aaa.vue指向的文件使用跳转、ほぼすべてのwebpackプロジェクトに対応しています。
-
VUE ストリングスプライシング 各種スプライシング