Vue3 ドキュメント クイックスタート

Vue3 ドキュメント クイックスタート

1. セットアップ

組み合わせAPI:

  • setupオプションは関数である必要があります
  • setupオプション関数は、 propscontext 2つのパラメータを受け入れます。
  • setupオプション関数は、コンポーネントに公開されるコンテンツを返す必要があります。
  • コンポーネントがデータやメソッドを使用するには、 setup returnを使用して返す必要があります。

1. セットアップ関数の最初のパラメータ - props

setup関数内のpropsレスポンシブであり、新しいプロパティが渡されると更新されます。

エクスポートデフォルト{
  小道具: {
    タイトル: 文字列
  },
  セットアップ(プロパティ) {
    コンソールログ(props.title)
  }
}

ただし、 propsはリアクティブであるため、props の応答性が失われるため、ES6 の構造化分解は使用できません。
プロパティを分解する必要がある場合は、セットアップ関数でtoRefsを使用して安全に行うことができます。

'vue' から { toRefs } をインポートします

セットアップ(プロパティ) {
    const { title } = toRefs(props)

    console.log(タイトル.値)
}

2. 文脈

setup関数の 2 番目のパラメーターであるcontextcontextは、3 つのコンポーネントのプロパティを公開するプレーンな JavaScript オブジェクトです。

xport デフォルト {
  セットアップ(プロパティ、コンテキスト) {
    // 属性(非応答オブジェクト)
    コンソールログ(コンテキスト属性)

    // スロット(非応答オブジェクト)
    コンソールログ(コンテキストスロット)

    // トリガーイベント(メソッド)
    コンソールログ(コンテキスト出力)
  }
}

contextは単純なJavaScriptオブジェクトであり、つまりリアクティブではないため、コンテキストに対してES6のデストラクチャリングを安全に使用できます。

エクスポートデフォルト{
  セットアップ(props、{attrs、slots、emit}) {
    ...
  }
}

2. セットアップ関数の戻り値

1. セットアップ関数の戻り値 - オブジェクト

setupがオブジェクトを返す場合、 setupに渡されるprops propertyと同様に、コンポーネントのテンプレートでそのオブジェクトのプロパティにアクセスできます。

<テンプレート>
  <!-- テンプレート内で使用すると自動的に解凍されるため、.value は必要ありません -->
  <div>{{ 読者数 }} {{ book.title }}</div>
</テンプレート>

<スクリプト>
  'vue' から { ref, reactive } をインポートします

  エクスポートデフォルト{
    設定() {
      const 読者数 = ref(0)
      const book = reactive({ title: 'Vue 3 ガイド' })

      // テンプレートに公開する
      戻る {
        読者数、
        本
      }
    }
  }
</スクリプト>

注意:セットアップから返された参照は、テンプレート内でアクセスされると自動的にラップ解除されるため、テンプレート内で .value を使用しないでください。

3. レスポンシブシステムAPI

1. 反応的

reactive()はプレーン オブジェクトを受け取り、そのプレーン オブジェクトのレスポンシブ プロキシを返します。 2.x のVue.observable()と同等

const obj = リアクティブ({ カウント: 0 })

レスポンシブ変換は「深い」ものであり、オブジェクト内のすべてのネストされたプロパティに影響します。 ES2015 プロキシ実装に基づくと、返されるプロキシ オブジェクトは元のオブジェクトと等しくありません。プロキシ オブジェクトのみを使用し、元のオブジェクトに依存しないようにすることをお勧めします。

<テンプレート>
  <div id="app">{state.count }</div>
</テンプレート>

<スクリプト>
'vue' から { reactive } をインポートします
エクスポートデフォルト{
  設定() {
    // 状態はリアクティブ状態になりました const state = reactive({
      カウント: 0,
    })
  }
}
</スクリプト>

2. 参照

値を受け入れ、応答性の高い変更可能なrefオブジェクトを返します。 refオブジェクトには、内部値を指す単一のプロパティ.valueがあります。

定数カウント = ref(0)
console.log(count.value) // 0

カウント値++
console.log(count.value) // 1

渡されたrefがオブジェクトの場合、リアクティブ メソッドが呼び出され、ディープ レスポンス変換が実行されます。

テンプレート内のアクセス:

refがレンダリング コンテキストのプロパティとして返され (つまり、 setup()によって返されるオブジェクト内)、テンプレート内で使用される場合、テンプレートに .value を書き込む必要なく、自動的にアンラップされます。

<テンプレート>
  <div>{{ カウント }}</div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    設定() {
      戻る {
        カウント: ref(0),
      }
    },
  }
</スクリプト>

レスポンシブ オブジェクトのプロパティとしてアクセスします。

ref がreactiveオブジェクトのpropertyとしてアクセスまたは変更されると、 valueも自動的にアンラップされ、その動作は通常のプロパティと同様になります。

定数カウント = ref(0)
定数状態 = リアクティブ({
  カウント、
})

console.log(状態.count) // 0

状態数 = 1
console.log(count.value) // 1

注意:既存のrefに新しいrefを割り当てると、古いref置き換えられます。

定数otherCount = ref(2)

状態.count = その他のカウント
console.log(状態.count) // 2
console.log(count.value) // 1

注意: ref reactive Objectにネストされている場合にのみアンラップされます。 ArrayMapなどのネイティブ コレクション クラスからrefにアクセスする場合、自動的にはラップ解除されません。

定数 arr = リアクティブ([ref(0)])
// ここで .value が必要です
コンソール.log(arr[0].値)

const map = reactive(新しい Map([['foo', ref(0)]]))
// ここで .value が必要です
console.log(map.get('foo').value)

型定義:

インターフェースRef<T> {
  値: T
}

関数 ref<T>(値: T): Ref<T>

場合によっては、 refに対してより複雑な型注釈を作成する必要があるかもしれません。 refを呼び出すときにジェネリック型引数を渡すことで、デフォルトの推論をオーバーライドできます。

const foo = ref<string | number>('foo') // foo の型: Ref<string | number>

foo.value = 123 // 合格!

3. 計算された

レスポンシブcomputed API使用するには 2 つの方法があります。

(1) getter関数を渡し、デフォルトでは手動で変更できないrefオブジェクトを返します。

定数カウント = ref(1)
const plusOne = 計算された(() => count.value + 1)

console.log(plusOne.value) // 2

plusOne.value++ // エラー!

(2) getset関数を持つオブジェクトを渡し、手動で変更できる計算状態を作成します。

定数カウント = ref(1)
const plusOne = 計算された({
  取得: () => count.value + 1,
  設定: (値) => {
    カウント値 = val - 1
  },
})

plusOne.値 = 1
console.log(count.value) // 0

型定義:

// 読み取り専用関数 computed<T>(getter: () => T): Readonly<Ref<Readonly<T>>>

// 変更可能な関数 computed<T>(options: {
  取得: () => T
  設定: (値: T) => void
}): 参照<T>

4. 読み取り専用

オブジェクト (レスポンシブまたは通常) またはrefを渡し、元のオブジェクトへの読み取り専用プロキシを返します。読み取り専用プロキシは「深い」ため、オブジェクト内のネストされたプロパティも読み取り専用になります。

const オリジナル = リアクティブ({ カウント: 0 })

const コピー = 読み取り専用(オリジナル)

ウォッチエフェクト(() => {
  // 依存関係の追跡 console.log(copy.count)
})

// オリジナルを変更すると、コピー元のリスナーがトリガーされます。original.count++

// コピーを変更できないため警告が表示されます copy.count++ // 警告!

5. ウォッチエフェクト

渡された関数を直ちに実行し、その依存関係をリアクティブに追跡し、依存関係が変更された場合は関数を再実行します。

定数カウント = ref(0)

watchEffect(() => console.log(count.value))
//-> 0 を出力

タイムアウトを設定する(() => {
  カウント値++
  //-> 1 を出力
}, 100)

5.1 聞くのをやめる

コンポーネントのsetup()関数またはライフサイクル フックでwatchEffectが呼び出されると、リスナーはコンポーネントのライフサイクルにリンクされ、コンポーネントがアンインストールされると自動的に停止されます。

場合によっては、戻り値を明示的に呼び出してリスニングを停止することもできます。

const stop = watchEffect(() => {
  /* ... */
})

// その後stop()

5.2 副作用の解消

場合によっては、副作用関数が非同期の副作用を実行し、それが無効な場合 (つまり、完了する前に状態が変わった場合) にクリーンアップする必要があることがあります。したがって、リスニング副作用によって渡される関数は、クリーンアップが失敗したときにコールバックを登録するための入力パラメータとしてonInvalidate関数を受け取ることができます。この無効化コールバックは、次の場合にトリガーされます。

  • 副作用が再実行されるとき
  • リスナーは停止します(setup() またはライフサイクルフックで watchEffect が使用されている場合、コンポーネントがアンマウントされたとき)
ウォッチエフェクト((onInvalidate) => {
  const トークン = performAsyncOperation(id.value)
  onInvalidate(() => {
    // ID が変更されるか、リスニングを停止した場合 // 前の非同期操作をキャンセルします token.cancel()
  })
})

無効化コールバックをコールバックから返すのではなく関数を渡して登録する理由は ( React useEffectのように)、戻り値が非同期エラー処理にとって重要だからです。

データ要求を実行する場合、副作用関数は多くの場合非同期関数になります。

定数データ = ref(null)
watchEffect(非同期() => {
  data.value = fetchData(props.id) を待機します
})

非同期関数は暗黙的にPromiseを返すことはわかっていますが、 Promiseresolve前にクリーンアップ関数を登録する必要があります。さらに、 Vue返されたこのPromiseを使用して、 Promiseチェーン上の潜在的なエラーを自動的に処理します。

5.3 副作用リフレッシュタイミング

Vueのレスポンシブ システムは副作用関数をキャッシュし、非同期的に更新します。これにより、同じティック内での複数の状態変更によって発生する不要な繰り返し呼び出しを回避できます。コア実装では、コンポーネントの更新機能も監視対象の副作用です。ユーザー定義の副作用関数がキューに入れられると、すべてのコンポーネントが更新された後に実行されます。

<テンプレート>
  <div>{{ カウント }}</div>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    設定() {
      定数カウント = ref(0)

      ウォッチエフェクト(() => {
        console.log(カウント.値)
      })

      戻る {
        カウント、
      }
    },
  }
</スクリプト>

この例では、

count最初の実行時に同期的に印刷されます。 count変更すると、コンポーネントが更新された後に副作用が実行されます。

注意:初期化実行はコンポーネントmounted前に実行されます。したがって、副作用関数を記述するときにDOM (またはテンプレート参照) にアクセスする場合は、 onMountedフックで実行します。

マウント時(() => {
  ウォッチエフェクト(() => {
    // ここでDOMまたはテンプレート参照にアクセスできます
  })
})

副作用を同期的に再実行する必要がある場合、またはコンポーネントが更新される前に、フラッシュ プロパティを持つオブジェクトをオプションとして渡すことができます (デフォルトは ' post ')。

// watchEffectを同期的に実行する(
  () => {
    /* ... */
  },
  {
    フラッシュ: 'sync'、
  }
)

// watchEffect を実行する(
  () => {
    /* ... */
  },
  {
    フラッシュ: 'pre'、
  }
)

5.4 リスナーのデバッグ

onTrackおよびonTriggerオプションを使用して、リスナーの動作をデバッグできます。

  • onTrackreactiveオブジェクト プロパティまたはrefが依存関係として追跡されるときに呼び出されます。
  • onTrigger依存関係の変更によって副作用が引き起こされたときに呼び出されます

両方のコールバックは、依存関係に関する情報を含むデバッガー イベントを受け取ります。依存関係をチェックするには、次のコールバックにデバッガー ステートメントを記述することをお勧めします。

ウォッチエフェクト(
  () => {
    /* 副作用 */
  },
  {
    onTrigger(e) {
      デバッガ
    },
  }
)

onTrackonTrigger開発モードでのみ使用できます。

型定義:

関数watchEffect(
  効果: (onInvalidate: InvalidateCbRegistrator) => void、
  オプション?: WatchEffectOptions
): ストップハンドル

インターフェース WatchEffectOptions {
  フラッシュ?: 'pre' | 'post' | 'sync'
  onTrack?: (イベント: DebuggerEvent) => void
  onTrigger?: (イベント: DebuggerEvent) => void
}

インターフェース DebuggerEvent {
  効果: ReactiveEffect
  対象: 任意
  タイプ: 操作タイプ
  キー: 文字列 | シンボル | 未定義
}

型 InvalidateCbRegistrator = (invalidate: () => void) => void

タイプ StopHandle = () => void

6. 見る

watch API 2.x this.$watch (およびwatch内の対応するオプション) とまったく同じです。 watch特定のデータ ソースをリッスンし、コールバック関数で副作用を実行する必要があります。デフォルトは遅延実行です。つまり、監視対象のソースが変更された場合にのみコールバックが実行されます。

  • watchEffect,watch次のことが可能になります。
  1. 副作用の遅延実行。
  2. どの状態変化がリスナーに副作用の再実行をトリガーするかを明確にします。
  3. リスニング状態の変更前後の値にアクセスします。
  • 単一のデータソースをリッスンする
  1. リスナーのデータ ソースは、値を返す getter 関数にすることも、ref にすることもできます。
// ゲッターをリッスンする
定数状態 = リアクティブ({ カウント: 0 })
時計(
  () => 状態.count、
  (カウント、前のカウント) => {
    /* ... */
  }
)

// refを直接聞く
定数カウント = ref(0)
ウォッチ(カウント、(カウント、前のカウント) => {
  /* ... */
})

6.1 複数のデータソースのリスニング

watcher配列を使用して複数のソースを同時にリッスンすることもできます。

ウォッチ([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
  /* ... */
})

6.2 watchEffectと共有される動作

watchwatchEffect 、リスニングの停止、副作用のクリア (それに応じてonInvalidateコールバックの 3 番目のパラメータとして渡されます)、副作用の更新タイミング、リスナーのデバッグにおいて同じように動作します。

型定義:

// 単一のデータソースをリッスンする function watch<T>(
  ソース: WatcherSource<T>、
  折り返し電話:
    値: T、
    古い値: T、
    onInvalidate: InvalidateCbRegistrator
  ) => 無効、
  オプション?: WatchOptions
): ストップハンドル

// 複数のデータソースを監視する function watch<T extends WatcherSource<unknown>[]>(
  出典: T
  折り返し電話:
    値: MapSources<T>、
    古い値: MapSources<T>、
    onInvalidate: InvalidateCbRegistrator
  ) => 無効、
  オプション? : WatchOptions
): ストップハンドル

WatcherSource<T> = Ref<T> | (() => T) 型

タイプ MapSources<T> = {
  [K in keyof T]: T[K]はWatcherSource<infer V>を拡張しますか? V: なし
}

// 共通プロパティについては、`watchEffect` の型定義を参照してください。インターフェース WatchOptions extends WatchEffectOptions {
  即時?: ブール値 // デフォルト: false
  深い?: ブール値
}

これで、vue3 ドキュメント編成のクイックスタートに関するこの記事は終了です。vue3 ドキュメント編成に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3.xはコンポーネント通信にmitt.jsを使用します
  • Vue3 がコンポーネント通信に mitt を使用する手順
  • Vue3カプセル化メッセージメッセージプロンプトインスタンス関数の詳細な説明
  • Vue3 親子コンポーネントパラメータ転送における sync 修飾子の使用法の詳細な説明
  • Vue3 のリアクティブ関数 toRef 関数 ref 関数の紹介
  • vue3とvue2の利点の比較
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録
  • Vue3とTypeScriptを組み合わせたプロジェクト開発の実践の概要
  • Vue3ナビゲーションバーコンポーネントのカプセル化実装方法
  • Vue3における7種類のコンポーネント通信の詳細

<<:  Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

>>:  MySQL InnoDBストレージエンジンについて簡単に説明します

推薦する

NodeJSのモジュール性に関する詳細な説明

目次1. はじめに2. 本文2.1 モジュールとは何ですか? 2.2 解決2.3、require.r...

CSSは固定比率のブロックレベルコンテナを簡単に実装できる

H5 レイアウトを設計する場合、通常はバナーに遭遇することになります。例えば、2:1 で表示したい場...

カレンダー効果を実現するJavaScript

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

mybatis-plusページングパラメータが渡された後、SQLのwhere条件にはページング情報操作の制限がありません

2時間近くかけて、さまざまな方法を試しました。後で、whereでフィルタリングした後のデータ量が1ペ...

Node.JS で悪天候のリアルタイム警報システムを構築する

目次序文:ステップ1: 無料の天気予報インターフェースを見つけるステップ2: 天気予報インターフェー...

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

Windows 10 システムで nginx ファイル サーバーを構成するためのグラフィック チュートリアル

Nginx の公式 Web サイトから Windows バージョンの Nginx をダウンロードしま...

Eclipseを使用してMySQLデータベースに接続する方法を説明します

序文常にエラーが発生するため、MySQL データベースに接続するプロセスを記録します。接続プロセス1...

Win10 構成 Tomcat 環境変数チュートリアル図

設定する前に、次の操作を行う必要があります。 1. まずjdk bloggerをインストールします。...

Dockerfileを使用してApacheイメージを作成する方法

目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...

MyCat を使用して Linux で MySQL マスター/スレーブの読み取り/書き込み分離を実装する方法

目次Linux - MyCat を使用して MySQL マスター スレーブの読み取り書き込み分離を実...

vue-cli 3 で vue-bootstrap-datetimepicker 日付プラグインを使用する方法

需要背景最近、Vue を使用してフロントエンド エンジニアリング システムと組み合わせ、以前のデモを...

Webフロントエンドツール、Sublime Text 2の紹介

Sublime Text 2 は、軽量でシンプル、効率的なクロスプラットフォーム エディターです。ブ...

MySQL での limit の使用方法は何ですか (推奨)

SELECT * FROM テーブル名制限m,n; SELECT * FROM テーブル LIMI...