国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
ディスカッションの質(zhì)問(wèn)
解決策
VueUse でソリューションを簡(jiǎn)素化します
ホームページ ウェブフロントエンド jsチュートリアル Vue で v-model でオブジェクトを使用する方法

Vue で v-model でオブジェクトを使用する方法

Jan 20, 2025 am 02:34 AM

How to use an object with v-model in Vue

コンポーネント間の雙方向のデータ バインディングを?qū)g裝する Vue.js の v-model ディレクティブについては誰(shuí)もがよく知っています。ただし、カスタム コンポーネントの v-model を手動(dòng)で実裝すると、通常、いくつかの問(wèn)題が発生します。

通常のアプローチは次のとおりです:

const props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);
<template></template>

コンポーネント內(nèi)の modelValue プロパティの値は変更しないことに注意してください。代わりに、更新された値を emit メソッド経由で親コンポーネントに返し、親コンポーネントが実際の変更を行います。その理由は次のとおりです。子コンポーネントは親コンポーネントの狀態(tài)に影響を與えるべきではありません。これにより、データ フローが複雑になり、デバッグが困難になります。

Vue のドキュメントに記載されているように、props は子コンポーネント內(nèi)で変更すべきではありません。これを行うと、Vue はコンソールに警告を出します。

対象者の調(diào)子はどうですか?

JavaScript のオブジェクトと配列は參照によって渡されるため、特殊なケースです。これは、コンポーネントがオブジェクト プロパティのネストされたプロパティを直接変更できることを意味します。ただし、Vue は、ネストされたオブジェクトのプロパティの変更について警告しません (これらの変更を追跡すると、パフォーマンスが低下します)。したがって、このような予期しない変更により、アプリケーションで検出やデバッグが困難な問(wèn)題が発生する可能性があります。

ほとんどの場(chǎng)合、基本値を v-model として使用します。ただし、フォームコンポーネントを構(gòu)築する場(chǎng)合など、場(chǎng)合によっては、オブジェクトを処理できるカスタム v-model が必要になる場(chǎng)合があります。これは重要な疑問(wèn)につながります:

上記の落とし穴を回避しながらオブジェクトを処理するカスタム v-model を?qū)g裝するにはどうすればよいですか?

ディスカッションの質(zhì)問(wèn)

1 つの方法は、書(shū)き込み可能な計(jì)算プロパティまたは defineModelヘルパー関數(shù)を使用することです。ただし、どちらのソリューションにも重大な欠點(diǎn)があります。元のオブジェクトを直接変更するため、明確なデータ フローを維持するという目的が損なわれます。

この問(wèn)題を説明するために、「フォーム」コンポーネントの例を見(jiàn)てみましょう。このコンポーネントは、フォーム內(nèi)の値が変更されたときに、オブジェクトの更新されたコピーを親コンポーネントに返すように設(shè)計(jì)されています。書(shū)き込み可能な計(jì)算プロパティを使用してこれを?qū)g現(xiàn)しようとします。

この例では、書(shū)き込み可能な計(jì)算プロパティによって元のオブジェクトが変更されます。

import { computed } from 'vue';
import { cloneDeep } from 'lodash-es';

type Props = {
  modelValue: { name: string; email: string; };
};

const props = withDefaults(defineProps<Props>(), {
  modelValue: () => ({ name: '', email: '' }),
});

const emit = defineEmits<{
  'update:modelValue': [value: Props['modelValue']];
}>();


const formData = computed({
  // 返回的getter對(duì)象仍然是可變的
  get() {
    return props.modelValue;
  },
  // 注釋掉setter仍然會(huì)修改prop
  set(newValue) {
    emit('update:modelValue', cloneDeep(newValue));
  },
});

ゲッターから返されたオブジェクトはまだ 変更可能であるため、これは 機(jī)能しません。元のオブジェクトが予期せず変更されてしまいます。

defineModel 同じことです。 update:modelValue はコンポーネントから出力されないため、オブジェクトのプロパティは警告なしに変更されます。

解決策

この狀況に対処する「Vue の方法」は、內(nèi)部リアクティブ値を使用してオブジェクトを表し、2 つのオブザーバーを?qū)g裝することです。

  1. オブザーバーは、modelValue プロパティの変更を監(jiān)視し、內(nèi)部値を更新します。これにより、內(nèi)部狀態(tài)が親コンポーネントによって渡された最新の prop 値を反映するようになります。
  2. オブザーバーは內(nèi)部値の変化を観察します。內(nèi)部値が更新されると、元のオブジェクトが直接変更されるのを避けるために、オブジェクトの新しいクローン バージョンが親コンポーネントに出力されます。

これら 2 つのオブザーバー間の無(wú)限のフィードバック ループを防ぐには、modelValue プロパティの更新によって內(nèi)部値のオブザーバーが誤って再トリガーされないようにする必要があります。

const props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);
<template></template>

「これはやりすぎだ!」と思っていることはわかります。さらに簡(jiǎn)素化する方法を見(jiàn)てみましょう。

VueUse でソリューションを簡(jiǎn)素化します

このロジックを再利用可能な合成関數(shù)に抽出することは、プロセスを簡(jiǎn)素化する優(yōu)れた方法です。しかし良いニュースは、その必要さえないということです。 VueUse の useVModel 結(jié)合関數(shù)は、この問(wèn)題に対処するのに役立ちます。

VueUse は強(qiáng)力な Vue ユーティリティ ライブラリであり、複合ユーティリティの「スイス アーミー ナイフ」とも呼ばれます。完全にツリーシェイク可能なので、パッケージのサイズが大きくなる心配がなく、必要な部分だけを使用できます。

useVModel を使用してリファクタリングする前の例は次のとおりです:

import { computed } from 'vue';
import { cloneDeep } from 'lodash-es';

type Props = {
  modelValue: { name: string; email: string; };
};

const props = withDefaults(defineProps<Props>(), {
  modelValue: () => ({ name: '', email: '' }),
});

const emit = defineEmits<{
  'update:modelValue': [value: Props['modelValue']];
}>();


const formData = computed({
  // 返回的getter對(duì)象仍然是可變的
  get() {
    return props.modelValue;
  },
  // 注釋掉setter仍然會(huì)修改prop
  set(newValue) {
    emit('update:modelValue', cloneDeep(newValue));
  },
});

はるかに簡(jiǎn)単です!

それだけです!子コンポーネントから直接変更せずに、Vue で v-model を含むオブジェクトを適切に使用する方法を検討してきました。オブザーバーを使用したり、VueUse の useVModel のような構(gòu)成関數(shù)を活用したりすることで、アプリケーション內(nèi)で明確で予測(cè)可能な狀態(tài)管理を維持できます。

この記事のすべての例を含む Stackblitz リンクは次のとおりです。自由に探索して実験してください。

読んでいただきありがとうございます。コーディングを楽しんでください!

以上がVue で v-model でオブジェクトを使用する方法の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類(lèi)リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語(yǔ)であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開(kāi)発に使用されますが、JavaScriptは主にWebページ開(kāi)発に使用されます。

JavaScriptコメント:短い説明 JavaScriptコメント:短い説明 Jun 19, 2025 am 12:40 AM

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

JSで日付と時(shí)間を操作する方法は? JSで日付と時(shí)間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時(shí)間を処理する場(chǎng)合は、次の點(diǎn)に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお?jiǎng)幛幛筏蓼埂?2。時(shí)間情報(bào)を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動(dòng)でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお?jiǎng)幛幛筏蓼埂¥长欷椁沃匾圣荪ぅ螗趣蛄?xí)得すると、一般的な間違いを効果的に回避できます。

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript vs. Java:開(kāi)発者向けの包括的な比較 JavaScript vs. Java:開(kāi)発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設(shè)定することにより実裝されます。 2。イベントバブルはデフォルトの動(dòng)作であり、UseCaptureはfalseに設(shè)定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動(dòng)的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaとJavaScriptの違いは何ですか? JavaとJavaScriptの違いは何ですか? Jun 17, 2025 am 09:17 AM

JavaとJavaScriptは、異なるプログラミング言語(yǔ)です。 1.Javaは、エンタープライズアプリケーションや大規(guī)模なシステムに適した、靜的に型付けされ、コンパイルされた言語(yǔ)です。 2。JavaScriptは動(dòng)的なタイプと解釈された言語(yǔ)であり、主にWebインタラクションとフロントエンド開(kāi)発に使用されます。

See all articles