Vueバインディングオブジェクトと配列変数を変更した後にレンダリングできない問題の解決策

Vueバインディングオブジェクトと配列変数を変更した後にレンダリングできない問題の解決策

プロジェクトシナリオ:

ページ表示には <ul> タグがあります。リストデータを動的に表示する必要があります。リストの値に加えて、ページに表示される他の値があります。そのため、リストデータのデータ構造はオブジェクトの下の配列です。データを動的に変更した後、自動的にレンダリングされないことがわかります。

問題の説明:

「click me!」ボタンをクリックすると、データが変更され、コンソールに出力されますが、リスト データはレンダリングされません。
コードは次のとおりです。

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="アプリ">
  <button @click="pushDataToDataList">クリックしてください!</button>
  <ul>
    <li v-for="(item, i) in form.dataList" :key="item">
      {{ i + ":" + アイテム }}
    </li>
  </ul>
</div>
<スクリプト>
  アプリを新しいVue({
    データ: 関数() {
      戻る {
        形状: {}
      }
    },
    メソッド: {
      プッシュデータからデータリストへ() {
        if (this.form.dataList == null) {
          this.form.dataList = []
        }
        this.form.dataList.push("abc" + this.form.dataList.length)
        console.log(このフォームのデータリスト)
      }
  }
  }).$mount('#app')
</スクリプト>

Chromeのコンソール表示

原因分析:

公式文書を調べたところ、次のような一節が見つかりました。

JavaScript の制限により、Vue は配列やオブジェクトの変更を検出できません。ただし、これらの制限を回避し、応答性を維持する方法はあります。

  1. オブジェクトの場合: Vue はプロパティの追加または削除を検出できません。 Vue はインスタンスを初期化するときにプロパティに対して getter/setter 変換を実行するため、Vue がプロパティをレスポンシブに変換するには、 dataオブジェクトにプロパティが存在している必要があります。
  2. 配列の場合: Vue は次の配列の変更を検出できません。
  • 配列項目をそのインデックスを使用して直接設定する場合、例: vm.items[indexOfItem] = newValue
  • 配列の長さを変更する場合、例えば: vm.items.length = newLength

理由は明らかです。最初はフォームの data の下にdataList属性がないため、データはレンダリングされません。そのため、後で値が変更されても、Vue はその変更を検出できません。これは配列だけではなく、js オブジェクトでも同様です。また、添字を押して配列の要素を直接変更しても、ビューのレンダリングはトリガーされません
次の配列メソッドは配列のレンダリングをトリガーします。

  • push(element) // 配列の末尾に要素を追加する
  • pop() // 配列の最後の要素を削除して返す
  • shift() // 配列の最初の要素を削除して返す
  • unshift(ele1, ele2, …, eleN) // 配列の先頭に1つ以上の要素を追加し、新しい長さを返します
  • splice(start, deleteCount?, …item) // 配列内の要素を削除し、新しい要素に置き換えます
  • sort() // 配列をソートし、配列要素の位置を変更する
  • 逆順() // 配列要素を反転すると配列要素の位置が変更されます

解決:

1. フォーム オブジェクトの data の下側で、 dataListプロパティを設定します。フロントエンドはデータを処理する際のコードの構造を認識しているため、事前に設定しておくとその後の開発や理解も容易になります。建議使用

データ: 関数() {
  戻る {
    形状: {
      データリスト: null
    }
  }
}

2. this.$set() メソッドを使用する

プッシュデータからデータリストへ() {
  if (this.form.dataList == null) {
    // まずフォームのdataListプロパティを設定します。this.$set(this.form, 'dataList', [])
  }
  this.form.dataList.push("abc" + this.form.dataList.length)
  console.log(このフォームのデータリスト)
}

参考リンク

Vue のデータ変更検出に関する注意事項

これで、Vue バインドオブジェクトと配列変数が変更後にレンダリングできない問題を解決する方法についての記事は終了です。Vue バインドオブジェクトと配列変数が変更後にレンダリングできない問題に関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VueのSSRサーバーサイドレンダリング例の詳細な説明
  • Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。
  • Vueの最初のレンダリングのプロセス全体についての簡単な説明
  • Vue3 のレンダリング関数における互換性のない変更の詳細な説明
  • Vue シングルページ アプリケーションで Markdown レンダリングを実装する

<<:  MySQLからデータをインポートする際の不正なフォーマット、インポートの遅延、データ損失などの問題を迅速に解決します。

>>:  Alibaba Cloud CentOS 7 に MySQL 8.0.13 をインストールする方法

推薦する

CentOS7 に YUM 経由で MySQL 5.7 をインストールする詳細な手順

1. インストールパッケージを保存する場所に移動しますcd /home/lnmp 2. MySQL ...

枠線や境界線のない iframe を使用するための完全ガイド (実践経験のまとめ)

<iframe src=”ページのURL” width=”100″ height=”30″ f...

Docker ベースの MySQL マスタースレーブ レプリケーションを実装する方法

序文MySQL マスター/スレーブ レプリケーションは、アプリケーションの高パフォーマンスと高可用性...

Linux アカウントのパスワードを変更する詳細な例

個人アカウントのパスワードを変更する一般ユーザーが個人アカウントのパスワードを変更する場合は、他のコ...

Echarts バー水平棒グラフのサンプルコード

目次横棒グラフデータとスタイルを動的に更新するeChartsの幅と高さの適応の問題を解決する縦棒グラ...

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...

レスポンシブデザインについての簡単な説明

1. レスポンシブ デザインとは何ですか?レスポンシブデザインとは、ウェブサイトの開発プロセス中に、...

Vue でよく使われる命令 v-if と v-show の違いを簡単に分析します。

目次序文1.v-ショー2.v-if 3. v-showとv-ifの違い1. 原則の違い2. アプリケ...

フォームから Vue ElementUI を使用してログイン効果を実装する例

目次1. ElementUIで基本的なスタイルを構築する2. [送信]ボタンをクリックして、アカウン...

Raspberry Pi 4 に Ubuntu 19.10 をインストールするための詳細なチュートリアル

以前、raspbian で実行したときに opencv の一部の依存関係をパッケージ化できず、一部の...

nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

序文add_header は、headers モジュールで定義されたディレクティブです。名前が示すよ...

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具...

CSS 動的読み込みバー効果のサンプルコード

CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明itemcontractprice ...

写真のプレビューとアップロード機能を実現するhtml+css+js

はじめに: Web ページを作成するときに、画像をアップロードする必要がある場合がよくあります。画像...