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 をインストールする方法

推薦する

HTML ul 順序なしテーブルのアプリケーションネスト

順序なしリストのアプリケーションネストコードをコピーコードは次のとおりです。 <!DOCTYP...

HTML 画像 img タグ_Powernode Java アカデミー

まとめプロジェクトの説明形式<img src="..."> H2+ ...

Mac に mysql5.7 をインストールするための完全な手順 (画像とテキスト付き)

最近、Mac システムを使用して、ローカル Web サーバー環境を構築する準備をしていました。 Ma...

docker compose の使い方の詳しい説明

目次Docker Compose の使用シナリオ基本的なデモ基本的な操作とメンテナンスdocker-...

jsは古典的なマインスイーパゲームを実装します

この記事の例では、古典的なマインスイーパゲームを実装するためのjsの具体的なコードを参考までに共有し...

MySQL データベースの Binlog 使用法の概要 (必読)

MySQL データベースにとって binlog バイナリ ログがどれほど重要であるかについては詳し...

パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法

ある達人がかつて、自分の妻のことを知るのと同じくらい、自分が管理するデータベースのことを知るべきだと...

例を通してBRタグとPタグの違いを理解する

<br />改行タグの使用<br>改行タグ<br>は終わりのない...

SQL インジェクションのある Web サイトを見つける方法 (必読)

方法 1: Google の詳細検索を使用します。たとえば、次に示すように.asp?id=9などの ...

ネイティブJSで禁止すべきメソッドの記述

目次ブロックレベル関数オブジェクトのプロトタイプを直接変更すると呼び出された人発信者評価ブロックレベ...

Nofollowタグの書き方と使い方

「nofollow」タグは数年前に Google、Yahoo、Microsoft によって提案されま...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

Vueはドラッグプログレスバーを実装します

この記事では、ドラッグプログレスバーを実現するためのVueの具体的なコードを例として紹介します。具体...

CentOS 7 に PHP5 用の suPHP をインストールする方法 (Peng Ge)

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

レスポンシブ原則と Vue2.0/3.0 の違いについての簡単な分析

序文vue3.0 が正式にリリースされて以来、多くの友人が vue3.0 に切り替えました。ここでは...