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ストレージエンジンについて簡単に説明します

推薦する

Mysql ファジークエリが大文字と小文字を区別するかどうかの詳細な調査

序文最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実...

css n番目から始まるすべての要素を取得する

具体的なコードは次のとおりです。 <div id="ボックス"> &...

MySQLはデータベースのN+1クエリ問題を解決します

導入HibernateやMyBatisなどのORMフレームワークでは、部門に関連付けられたユーザーオ...

Mysql5.7.14 インストールと設定方法操作グラフィックチュートリアル(パスワード問題解決)

この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...

SQL Server 2019 Always On クラスターの Docker デプロイメントの実装

目次Docker デプロイメント Always on クラスターDockerをインストールする建築関...

PSを使用して2分でxhtml+cssウェブサイトのホームページを作成します

xhtml+css のウェブサイト再構築、ウェブ標準などについては、記事が多すぎるので繰り返しません...

MySQL での正規表現の使用に関する詳細

目次1. はじめに2. 製品テーブルを準備する2.1 ステートメントの順序2.2 大文字と小文字の区...

Linux での nginx のインストール、展開、使用方法の詳細な説明

目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...

Vueのハッシュジャンプ原理の詳細な説明

目次ハッシュと履歴の違いハッシュ履歴getCurrentLocation の実装setupListe...

JavaがMySQL 8.0に接続できない問題の解決策

この記事では、参考までにMySQL 8.0に接続できないJavaの問題をまとめて紹介します。具体的な...

MySQL で複数の主キーが定義されているエラーの解決方法

主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...

純粋な CSS で DIV サスペンションを実装するサンプル コード (固定位置)

DIV フローティング効果 (固定位置) は CSS のみで実装されており、IE8、360、Fir...

CentOS 7 でゲートウェイを変更して IP を設定する方法の例

Centos7 バージョンをインストールするときに、外部ネットワークへの接続を選択すると、外部ネット...

MySQL 5.7.23 解凍バージョンのインストールチュートリアル(画像とテキスト付き)

MySQLインストーラをダウンロードする公式ダウンロードアドレス: http://dev.mysq...