序文Vue エコシステムでは、公式の状態管理ライブラリである Vuex が、Vue アプリケーション開発に非常に便利な機能をもたらします。ただし、Vuex 20K+ のサイズにはコストも伴います。小規模なプロジェクトでは、ユーザー情報などの少量のデータを保存するためだけに Vuex を導入する価値はありません。 Vue2.2.x では、レベル間コンポーネント間の通信を実現するために、provide/inject API が提供されました。 Vue3.x ではアプリケーション API も提供されるため、これに基づいて基本的な状態管理を実装することが容易になります。 provide/inject を通じて Vuex 関数を実装する方法まずは大まかなロジックを考えてプラグイン化し、use メソッドを通じてアプリケーション インスタンスに登録してみましょう。 install メソッドでは、app.provide メソッドを通じてルート コンポーネントにデータがマウントされます。データはレスポンシブ データである必要があり、データ セキュリティのために、データの変更は制限される必要があります。単方向データ フローの設計に従い、ユーザーが直接変更することはできません。したがって、データを公開するときは、データを読み取り専用として処理する必要があります。 Vuex に似た useStore 関数を実装し、ユーザーがこのメソッドを通じてデータにアクセスできるようにします。 操作を簡素化するために、Vuex に似た mapState、mapMutations、mapActions メソッドを実装します。 使い方はVuexと全く同じです。 このプラグインをアプリケーションに登録する//メイン.ts 'vue' から {createApp} をインポートします。 './App.vue' からアプリをインポートします。 './router' からルーターをインポートします './store' からストアをインポートします const app = createApp(App) app.use(ルーター).use(ストア).mount('#app') プラグインエントリファイルエントリ ファイルで、すべてのメソッドを直接エクスポートします。 // スカイビューエクス/index.ts './main/index' から * をエクスポートします ストアを作成し、対応するデータをルートコンポーネントにマウントします。ストア自体は、コミットやディスパッチなどの状態プロパティとメソッドを含むオブジェクトです。ストアの主な機能は、すべてのコンポーネントがストア オブジェクトを取得して状態のデータを取得し、関連するメソッドを呼び出して状態を変更できるようにすることです。 //スカイビューエクス/メイン/インデックス.ts 'vue' から {inject, reactive, readonly} をインポートします。 const mainStoreSky = Symbol('メインストアキー') インターフェース storeOptions { 状態: 任意 アクション?: 任意 突然変異?: どれか } export const createStore = (options: storeOptions = {}) => { // ストアオブジェクトを作成する const initOptions = { 州: {}、 アクション: {}, 変異: {}, } const mergeOptions: storeOptions = Object.assign(initOptions, オプション) const 状態 = リアクティブ(mergeOptions.state) 定数ストア = { 状態: 読み取り専用(状態)、 ディスパッチ(イベント名: 文字列、...引数: 任意[]) { mergeOptions.actions[イベント名](ストア、...引数) }, コミット(イベント名: 文字列、...引数: 任意[]) { ... }, } 戻る { インストール(アプリ: 任意) { app.provide(メインストアSky、ストア) }, } } export const useStore = (): any => { // 他のコンポーネントはこのメソッドを使用してストアオブジェクトを取得します return inject(mainStoreSky) } mapState、mapMutations、mapActions メソッドの実装エクスポートconst mapState = () => { 定数ストア = useStore() ストアの状態を返す } エクスポート const mapActions = (イベント名: 文字列) => { 定数ストア = useStore() return (...args: any[]) => store.dispatch(eventName, ...args) } エクスポートconst mapMutations = (eventName: string) => { 定数ストア = useStore() return (...args: any[]) => store.commit(eventName, ...args) } コンポーネントで使用される// ストア/インデックス.ts '../sky-vuex/index' から {createStore} をインポートします。 エクスポートデフォルトcreateStore({ 州: { 年齢: 18 }, 突然変異: setAge(状態: 任意、データ: 数値) { state.age = データ } }, }) // ホーム.vue <テンプレート> <div class="home"> <button @click="handleAge(23)">データの変更</button> <h1>{{ 状態.年齢 }}</h1> </div> </テンプレート> <script lang="ts"> 'vue' から {defineComponent} をインポートします。 '@/sky-vuex/index' から { useStore、mapActions、mapMutations } をインポートします。 エクスポートデフォルトdefineComponent({ 名前: 'ホーム'、 設定() { 定数ストア = useStore() 定数 handleAge = mapMutations('setAge') // 定数 handleAge = mapActions('setAge') // 定数 handleAge = () => { // store.dispatch('setAge', 5) // } 戻る { 状態: store.state、 ハンドル年齢、 } }, }) </スクリプト> 要約するここまでで、基本的なVuexの機能が実装されました。ご自身で実践して最適化してみてください。ご不明な点がございましたら、お気軽にお問い合わせください。 これで、vue3 の provide を使用して状態管理を実装する方法についての説明は終了です。vue3 provide を使用して状態管理を実装する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: HTML テーブル マークアップ チュートリアル (9): セル間隔属性 CELLSPACING
>>: Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明
この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...
body{font-size:12px; font-family:"宋体";}...
興味深い発見:合計 1000 件のレコードを含むテーブルがあります。クエリ ステートメントは次のよう...
ウェブデザインでは、ウェブページを美しく見せるために矢印を装飾としてよく使用します。現在、多くのウェ...
多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...
目次1. 画像1. 鏡とは何ですか? 2. 画像の構成と目的(1) Dockerファイル(2)スクラ...
[nslookup とは?] 】 nslookup コマンドは、Linux で非常によく使用されるネ...
find コマンドは主にディレクトリやファイルを検索するために使用され、一致のために複数のパラメータ...
1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...
現在、OK ボタンをクリックしたときやキーボードの Enter キーを押したときに操作を実行するとい...
Linux の scp コマンド (Windows では scp は使用できません) と、mysql...
この記事では、jsでスライダーをドラッグする方法の具体的なコードを参考までに共有します。具体的な内容...
誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...
検証環境: [root@~~/]# rpm -qa | grep mysql mysql-5.6.2...
序文多くの Web アプリケーションは、リレーショナル データベース管理システム (RDBMS) に...