uniappのグローバル変数実装の詳細な説明

uniappのグローバル変数実装の詳細な説明

序文

この記事では、uniapp グローバル変数の実装方法をいくつかまとめています。詳細な知識は、uView 公式 Web サイトの uniapp でのグローバル変数の実装から得られます。興味のある学生は、uView 公式 Web サイトにアクセスして vuex を検索し、それを表示できます。

グローバル変数の実装方法

一般的に言えば、uniapp にはいくつかの方法があります。

  • ローカルストレージ
  • 設定ファイル
  • Vue.prototypeにマウントする
  • グローバルデータ
  • ヴュークス

以下では、これら 5 つの方法の実装について紹介します。

ローカルストレージ

永続的なストレージ、例えばアプリを閉じてもデータは保存されます

これは、Webのローカルストレージに似た永続的なストレージ方法です(Cookie、トークン、SessionStorage、LocalStorageについては、別の記事でまとめます)。この方法は、ユーザーの情報を永続的に保存する必要がある場合に使用されますが、パフォーマンスに一定の影響を与えるため、この方法では保存されたデータの頻繁な取得と変更を避ける必要があることに注意してください。アプリケーション宣言サイクル内の変数では、この方法を使用しないでください。

ストレージには同期と非同期の2種類があります。

同期ストレージ

  //同期ストレージ uni.setStorageSync("key","value")
  //同期取得 let value = uni.getStorageSync("key")  
  console.log("上記が完了するまで実行を待ちます)

非同期ストレージ

  uni.setStorage({
   キー:"キー",
    データ:"値",
    成功:関数(){
      //ストレージ成功コールバック console.log("私は非同期ストレージのコールバックです。valが宣言された後に実行されます")
    }
  })
  let val = 1 //この行はまずuni.getStorage({
   キー:"キー",
    成功:function(res){
      //成功したコールバックを保存 console.log("これは非同期に取得されたコールバックです。val2が宣言された後に実行されます")
    }
  })
  let val2 = 2 // この行が最初に実行されます

設定ファイル

これは、モジュラーファイルエクスポートを使用する方法です。まず js ファイルに変数を記述し、export default の形式でエクスポートします。

一般的に言えば、このように実装されたグローバル変数は、バックエンドに要求されたドメイン名など、アプリケーションがユーザーによってインストールされる前とユーザーがそれをアンインストールするときに使用する必要がある変数です。この方法は他の状況には適していません。同時に、この方法には欠点もあります。つまり、使用するたびにファイルの導入が必要になります。

config.js

  //たとえば、config.js ではベースドメイン名をエクスポートしています export default {
   ベース URL:"http://www.test.com"
  }

インデックス

  // このファイルを import import config from "../common/config.js" から導入します
  エクスポートデフォルト{
    オンロード(){
     console.log(config.baseUrl)//baseUrl:"http://www.test.com"
    }
  }

Vue.prototypeにマウントする

これはプロトタイプを使用して実装する方法です(jsプロトタイプチェーンと継承については、別の記事で整理します)が、この方法はWeChatアプレットで特別なパフォーマンスを発揮します。

注意: WeChat アプレットでは、テンプレートは導入されたグローバル変数を直接読み取って表示することはできません。
メイン.js

  //ここでのconfig.jsは、すでに上で記述したファイルを参照します。import config from "./common/config.js"
  // baseUrl を Vue にマウントすると、ページやコンポーネントで this.baseUrl を介してアクセスできるようになります。Vue.prototype.baseUrl = config.baseUrl

ページ

<テンプレート>
 <!-- WeChat アプレットでは値は未定義ですが、他の端末では有効です -->
 <表示>
 値は次のとおりです: {{this.baseUrl}}
 </ビュー>
</テンプレート>

<スクリプト>
 エクスポートデフォルト{
 オンロード() {
    console.log(this.baseUrl)//"http://www.test.com"
 }
 }
</スクリプト>

グローバルデータ

この方法はWeChatミニプログラムに特有のものです。ミニプログラムはvuexを使用できないため、globalDataが登場します。Uniappはミニプログラムの別の実装であるため、globalDataも登場します。

globalData を使用する際に注意すべき点がいくつかあります。

  • globalData は応答しません。1 つのファイル内の globalData への変更は、別のファイルに動的に反映されません。
  • globalDataの「レスポンス」を実装したい場合は、onShowライフサイクルで値を手動で取得する必要があります。

2 番目のポイントを説明してください。onShow で値を取得する必要があるのはなぜですか? onLoad は不可能ですか?

なぜなら、A ページと B ページの両方に globalData が導入され、B がページ内で globalData の値を変更して A ページに戻る場合、A ページは破棄されず、onLoad ライフ フックは呼び出されません。onShow のみが実行されます。onLoad で globalData を取得しようとすると、実行されず、応答性が得られません。

アプリ.vue

  エクスポートデフォルト{
   //App.vueでglobalDataを定義する必要があります
   グローバルデータ:{
     ユーザー名:"白居易"
    },
    // ここで注意すべき点は、App.vue で globalData を使用する場合、getApp() がこの時点ではまだ生成されていないため、getApp().globalData.Name を直接使用できないことです // 1. 非 V3 モードでは、this.$scope.globalData を通じて取得できます // 2. V3 モードでは、getApp({allowDefault: true}).globalData onLaunch(){ を通じて取得できます
     console.log(this.$scope.globalData.userName)
    }
  }

App.vueでglobalDataを定義したら、それをページで使うことができます。
A.vue

<テンプレート>
 <表示>
 <表示>
  <!-- getApp().globalData.userName はテンプレート内で直接使用できないことに注意してください -->
  <<The Charcoal Seller>> の著者は: {{author}} です。
 </ビュー>
 <表示>
  <u-button @click="modifyUserName">userName の値を変更する</u-button>
 </ビュー>
 </ビュー>
</テンプレート>

<スクリプト>
 エクスポートデフォルト{
 データ() {
  戻る {
  著者: ''
  }
 },
 オンショー() {
  // A.vue が画面に表示されるたびに onShow がトリガーされ、著者の値が更新されます。this.author = getApp().globalData.userName;
 },
 メソッド: {
  ユーザー名を変更する() {
                //この時点でglobalDataの値が変更されます getApp().globalData.userName = "诗圣";
  // userName を変更した後、globalData が応答しないため、このページの作成者は自動的に更新されません。// 引き続きこのページの作成者の値を手動で更新する必要があります。これは globalData の欠点を示しています。 this.author = getApp().globalData.userName;
  }
 }
 }
</スクリプト>

Vuexの実装方法

vuexの使用を強くお勧めします。uniappでvuexを使用するには、従来のvue方式とuViewカプセル化方式の2つの方法があります。以下はuView公式サイトのvuexdのカプセル化を紹介します。

従来の実装

ここでは、vuexの従来の使用法について簡単に紹介します。vuexを知らない場合は、vueの公式Webサイトで公式ドキュメントを参照してください。

uni.appのルートディレクトリにストアファイルを作成し、その中に次の内容のindex.jsファイルを作成します。

//index.js
  「vue」からVueをインポートします
  「vuex」からVuexをインポートします
  Vue.use(Vuex)
  定数ストア = 新しい Vuex.Store({
   州:{
     vuex_トークン:"123456"
    },
    //状態の変化の値を同期的に変更するためのメソッド:{
     //Payload は、ユーザーがミューテーションを使用するときに渡されるパラメータです。単一の値またはオブジェクトにすることができます。modifyToken(state,payload){
       state.vuex_token = ペイロード.token
      }
    }
  })
  デフォルトストアをエクスポート

main.js にインポートする

'@/store' からストアをインポートします。

//ストアをVueオブジェクト作成に配置する const app = new Vue({
 店、
 ...アプリ
})

ページ内での使用

<テンプレート>
 <表示>
 <表示>
  トークンの値は {{vuex_token}} です
 </ビュー>
 <u-button @click="btnClick">vuex_token を変更する</u-button>
 </ビュー>
</テンプレート>

<スクリプト>
//これは、ストアを使いやすくするために Vue が提供する API です。詳細については、Vue の公式ドキュメントを参照してください。import {mapState, mapMutations} from 'vuex'; 
エクスポートデフォルト{
 計算: { 
 ...mapState(['vuex_token']) 
 }, 
 メソッド: { 
 ...mapMutations(['modifyToken'])、
 ボタンクリック() {
  // ここでの 2 番目のパラメータは通常の変数またはオブジェクトで、カスタマイズされ、ミューテーション要件に従って処理されます (mapMutations を使用せずに)
  this.$store.commit('modifyToken', {トークン: 'xxxyyyzzz'}
            //mapMutations を使用する this.modifyToken({token: 'xxxyyyzzz'})
 }
 } 
}
</スクリプト>

uView の vuex 実装 (要点)

まず、uView が vuex をカプセル化する理由について説明します。これには 2 つの理由があります。

  • uView は vuex で状態とミューテーションを定義し、vuex が必要な箇所ごとに分解用の mapState を導入して再度使用する(操作が面倒)必要があると考えます
  • vuex は変数をメモリ上に保存するため、ブラウザを更新すると vuex 変数が消えてしまいます。通常は LocalStorage などの他の保存方法と併用する必要があります。

これらの問題に対応するため、uView は vuex をカプセル化して使用するための一連のメソッドを公式に提供しています。このメソッドは LocalStorage と vuex を組み合わせることで、ユーザーは vuex への面倒な呼び出しや更新損失の問題を考慮する必要がなくなります。以下ではコードを示し、そのアイデアとプロセスについて説明します。

  • まず、ルートディレクトリに index.js ファイルを作成し、次の内容を記述します。最初に大まかな考え方を示し、具体的な意味については後でコメントで説明します。

アイデア:index.jsの一般的なアイデアは次のとおりです

a. vuex がデータをリフレッシュして失い、永久に保存できない問題を解決するために、lifeData オブジェクトが作成されます。このオブジェクトは関数を介して LocalStorage に保存され、永久保存の効果を実現します。このとき、vuex に永久に保存する必要があるデータのみをキーと値の形式でこのオブジェクトに保存する必要があります。

b. vuex を使用するたびに、ミューテーション内の関数を使用して対応するストア内の変数を操作する必要があるという問題を解決するために、$uStore メソッドはストア内のすべての変数を操作するためにカプセル化されています。 もちろん、単純なコピー操作のみが実行されます。 より拡張された機能については、ユーザーはミューテーション内の関数をカプセル化して拡張することができます。

c. saveStateKeys 配列をカプセル化します。この配列のデータはアプリの起動時に取得されるため、ユーザーがアプリケーションに最後にログインした時の情報など、アプリの起動時に取得する必要があるデータを入れることができます。実際には、saveStateKeys と lifeData は一緒に使用されます。saveStateKeys 内の変数のみが保存中に lifeData に保存され、永続的な保存が実現されます。残りは通常の vuex 保存方法と同じです。次のコードでこれを確認できます。

//Vuex、vue を導入します。Vuex を使用します。この手順は、vuex import Vue from 'vue' の一般的な使用法と変わりません。
'vuex' から Vuex をインポートします
Vue.use(Vuex)

// 永続的に保存する必要があるデータを格納する変数を作成します。let lifeData = {};

試す{
  // lifeData 変数がローカルに存在するかどうかを取得します。APP を初めて起動したときには存在しません。lifeData = uni.getStorageSync('lifeData');
}キャッチ(e){
 
}

// 永続的に保存し、次回 APP を起動したときに取得する必要がある、状態の変数名 let saveStateKeys = ['vuex_user', 'vuex_token'];

// 変数をローカル ストレージに保存します (更新/再起動しても失われません (アプリは更新されず、再起動のみされます))
const saveLifeData = function(キー、値){
 // 変数名が保存する配列にあるかどうかを判定します // これは、変数名が saveStateKeys に保存されているかどうかを判定し、それを永久保存のために lifeData に保存します。それ以外の場合は、一般的な vuex 保存方法と同じです if (saveStateKeys.indexOf(key) != -1) {
 // ローカルに保存された lifeData オブジェクトを取得し、そのオブジェクトに変数を追加します。let tmp = uni.getStorageSync('lifeData');
 // アプリを初めて開いたときは lifeData 変数が存在しないので、{} 空のオブジェクトを配置します tmp = tmp ? tmp : {};
 tmp[キー] = 値;
 // このステップを実行すると、保存する必要があるすべての変数がローカルの lifeData オブジェクトにマウントされます uni.setStorageSync('lifeData', tmp);
 }
}
定数ストア = 新しい Vuex.Store({
 // 以下の値は単なる例です。使用時には削除してください: {
 // 上記のローカルから取得した lifeData オブジェクトの下に対応する属性がある場合は、それを state 内の対応する変数に代入します // vuex_ プレフィックスを追加すると、変数名の競合を防ぎ、一目でわかりやすくなります // lifeData はすでにローカルに保存されているため、永続的に保存されるデータは lifeData から取得されます vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {name: '明月'},
 vuex_token: lifeData.vuex_token ? lifeData.vuex_token : ''、
 // vuex_version をローカルの永続ストレージに保存する必要がない場合は、lifeData.vuex_version メソッドは必要ありません vuex_version: '1.0.1',
 },
 突然変異:
 $uStore(状態、ペイロード) {
            //Payload は、this.$u.vuex が後で呼び出されるときに渡されるオブジェクトです //たとえば、this.$u.vuex("user.info.score","jack") payload = {name:"user.info.score",value:"jack"}
  // マルチレベル呼び出しであるかどうか、およびオブジェクトが user.info.score = 1 などの状態に存在するかどうかを判断します。
  nameArr = payload.name.split('.');//[ユーザー、情報、スコア]
  saveKey = '' とします。
  len = nameArr.length;とします。
  nameArr.length >= 2の場合{
  obj = state[nameArr[0]]とします。
  for(i = 1; i < len - 1; i++) {
   obj = obj[nameArr[i]]; // この時点ではobjはuser.infoなので、もちろんまだ空のデータです}
                //nameArr[len-1]はスコア、obj[nameArr[len - 1]]はuser.info.scoreと同等です
  obj[nameArr[len - 1]] = ペイロード.値;
  保存キー = nameArr[0];
  } それ以外 {
  // 単一レベル変数(状態が通常の変数の場合) state[payload.name] = payload.value;
  保存キー = ペイロード名;
  }
  // 変数をローカルに保存します。上部の関数定義を参照してください saveLifeData(saveKey, state[saveKey])
 }
 }
})
デフォルトストアをエクスポート

同じディレクトリにmixin.jsファイルを作成する

アイデア:
a. これを介して変数を使用できるようにするには、すべてのページで、Vueミックスインを介してmapStateをグローバルにミックスする必要があります。
b. 各ページのvuexのミューテーション内のメソッドを簡単に呼び出せるようにするには、毎回コミットする代わりにuStoreを呼び出すのに役立つメソッドが必要なので、uViewは別のメソッド$u.vuexもミックスします。

ps: minxi (mixin) は、グローバル関数を実装するために Vue が提供する API です。mixin にはさまざまな方法があります。ここでは、グローバル mixin を使用します。mixin についてよくわからない場合は、Vue の公式サイトにアクセスして関連ドキュメントを参照してください。

//ミックスイン.js
'vuex' から { mapState } をインポートします。
「@/store」からストアをインポートします

// ルート ディレクトリの store/index.js にあるユーザーの vuex のすべての状態変数をグローバル変数にロードしてみます。let $uStoreKey = [];
試す{
 ストアのキーをストアのステートに格納します。
}キャッチ(e){
 
}

モジュール.エクスポート = {
 作成された() {
 // vuex メソッドを this.$u にフックします // 使用方法: vuex 状態の user.name 変数を "epic" に変更する場合 => this.$u.vuex('user.name', 'epic')
 // vuex の状態のバージョン変数を 1.0.1 に変更したい場合 => this.$u.vuex('version', '1.0.1')
 this.$u.vuex = (名前、値) => {
  this.$store.commit('$uStore', {
  name,value //$uStore によって渡されたペイロードを覚えていますか? 笑 
  })
 }
 },
 計算: {
 // vuex の状態にあるすべての変数をグローバル ミックスインに分解します...mapState($uStoreKey)
 }
}

グローバルミキシングを開始し、ミキシングのためにmain.jsにmixin.jsファイルを導入します。

//メイン.js
vuexStore を require("@/store/$u.mixin.js"); にします。
Vue.mixin(vuexStore);

ストアをVueインスタンスに配置する

//メイン.js
'@/store' からストアをインポートします。

//ストアをVueオブジェクト作成に配置する const app = new Vue({
 店、
 ...アプリ
})

上記は、uView による vuex の公式カプセル化です。アプリ開発では、このカプセル化された vuex を使用すると非常に便利です。同時に、必要に応じて @/stote/index.js で独自のメソッドを拡張することもできます。

結論

上記は、uniapp グローバル変数を実装するさまざまな方法です。実際の開発では、どの方法を使用するかは実際の状況に応じて選択する必要があります。個人的には、フロントエンド初心者の私にとって、uView の vuex カプセル化は非常に参考価値が高いと感じたので、共有するために特別に整理しました。

uniapp のグローバル変数の実装方法の詳細な説明はこれで終わりです。より関連性の高い uniapp のグローバル変数コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • uniapp 要素ノードスタイルの動的変更の詳細な説明
  • uniappとvueの違いの詳細な説明
  • uniappの無痛トークンリフレッシュ方法の詳細な説明
  • uni-appのスタイルの詳細な説明

<<:  WeChatミニプログラム抽選コンポーネントの使い方

>>:  Vue で手ぶれ補正を実装するためのサンプルコード

推薦する

Maven プロジェクトのリモート デプロイメント && Tomcat を使用してデータベース接続を構成する方法

1つ。 tomcat を使用したリモート展開1.1 発生した問題:プロジェクトでは、サードパーティの...

CSSにスティッキー効果を追加する方法

前面に書かれたfilter:blur と filter:contrast がこのような素晴らしい化学...

MySQL ストアド プロシージャのエラー処理例の詳細な説明

この記事では、例を使用して MySQL ストアド プロシージャのエラー処理について説明します。ご参考...

iframeをカプセル化するvueコンポーネントを開発する

目次1. コンポーネントの紹介2. コンポーネントの内部構造とロジック1. コード組織構造2. マッ...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

マウスがカード上に移動したときにフローティング効果を実現する CSS の使用例

原理ホバーしたときに要素に影を設定します: box-shadow で、通常とは異なるスタイルにします...

子要素の margin-top によって親要素が移動する問題の解決方法

問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...

Nginx サービスを使用してサブドメイン環境を構築し、2D マップの読み込みパフォーマンスを向上させる方法を説明します。

1. 背景最近、友人が大規模なマップの読み込みが遅いという問題に遭遇しました。iServer のパ...

JavaScriptはキュー構造プロセスを実現する

目次1. キューを理解する2. カプセル化キュー3. 太鼓をたたいて花を渡す場合1. キューを理解す...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

WeChat アプレット学習 WXS 使用方法チュートリアル

wxsとは何ですか? wxs (WeiXin Script) は、小規模プログラム用のスクリプト言語...

アイデアのパッケージ化とクラウドサービスへのアップロードにおけるプロジェクトプロセスの分析

1つ。まず、アイデアとしてパッケージ化する必要があります。私はSpringbootフレームワークプロ...

MybatisはSQLクエリのインターセプションと変更の詳細を実装します

序文インターセプターの機能の 1 つは、特定のメソッドの呼び出しをインターセプトできることです。イン...

リソースアップロード機能を実現するための SpringBoot+nginx の詳細な例

最近、画像、ビデオ、CSS/JS などの静的リソースを配置するために nginx を使用する方法を学...

Vueで複数の添付ファイルをアップロードする実装例

目次序文コアコードコードのファイル表示部分序文この記事では主に、Vue プロジェクトでの添付ファイル...