目次
構成手順
ホームページ ウェブフロントエンド uni-app uni-app でグローバル エラスティック レイヤー コンポーネントを開発する方法 (コード例)

uni-app でグローバル エラスティック レイヤー コンポーネントを開発する方法 (コード例)

Mar 07, 2022 pm 07:59 PM
uni-app

uni-app でグローバル エラスティック レイヤー コンポーネントを開発するにはどうすればよいですか?次の記事では、uni-app でグローバル エラスティック レイヤー コンポーネントを実装する方法を例を用いて紹介します。

uni-app でグローバル エラスティック レイヤー コンポーネントを開発する方法 (コード例)

この会社には、uni-app フレームワークを使用して書かれたアプリがあります。内部の弾性層は基本的に、公式の uni.showModal API を使用して実装されています。パフォーマンスは、デバイスはネイティブの弾性レイヤーですが、お客様の要望により、設計されたスタイルに置き換える必要があるため、そのようなコンポーネントの実装を開始しました。

弾性層でよく使用されるメソッドとメソッドに従って、必要なプロパティとメソッドを大まかに列挙します。

  • タイプ: alert/confirm など
  • アイコン icon を表示
  • コンテンツ content を表示
  • API から呼び出すことができます
  • サポート promise$api.xx().then

最初のいくつかの項目は簡単に実行でき、data でフィールドを定義し、直接使用するだけです。公式のホイール uni は外層 -popup にあるため、ポップアップを制御するためのロジックを少なくする必要があり (遅延)、一般的な構造は次のように記述されます

// template部分
<uni-popup ref="popup" :maskClick="maskClick">
		<view class="st-layer" :style="{ width: width }">
			<view class="st-layer__content">
				<!-- #ifndef APP-NVUE -->
				<text class="st-layer__icon" :class="option.iconClass || getIconClass()"
					v-if="option.type !== &#39;none&#39; && option.showIcon"></text>
				<!-- #endif -->
				<view class="st-layer__msg" v-if="option.msg">
					<text>{{ option.msg }}</text>
				</view>
			</view>
			<view class="st-layer__footer" :class="{&#39;is-reverse-cofirmcancel&#39; : isReverseConfirmCancel}" v-if="option.showConfirmButton || option.showCancelButton">
				<view class="st-layer__footer__btn st-layer__footer__btn--confirm" @tap.stop="confirmClick"
					v-if="option.showConfirmButton"><text>确认</text></view>
				<view class="st-layer__footer__btn st-layer__footer__btn--cancel" @tap.stop="cancelClick"
					v-if="option.showCancelButton"><text>取消</text></view>
			</view>
		</view>
	</uni-popup>
ログイン後にコピー

その後、js最初の部分は、いくつかの open メソッドと close メソッドを実装するだけです。

data() {
    return {
            option: {}
    }
},
methods: {
    open(option) {
        let defaultOption = {
                showCancelButton: false, // 是否显示取消按钮
                cancelButtonText: &#39;取消&#39;, // 取消按钮文字
                showConfirmButton: true, // 是否显示确认按钮
                confirmButtonText: &#39;取消&#39;, // 确认按钮文字
                showIcon: true, // 是否显示图标
                iconClass: null, // 图标class自定义
                type: &#39;none&#39;, // 类型
                confirm: null, // 点击确认后的逻辑
                cancel: null, // 点击取消后的逻辑
                msg: &#39;&#39;
        }
        this.option = Object.assign({}, defaultOption, option)
        this.$refs.popup.open()
    },
    close() {
            this.$refs.popup.close()
    },
    confirmClick() {
            const confirmHandler = this.option.confirm
            if (confirmHandler && typeof confirmHandler === &#39;function&#39;) {
                    confirmHandler()
            }
            this.close()
            this.$emit(&#39;confirm&#39;)
    },
    cancelClick() {
            const cancelHandler = this.option.cancel
            if (cancelHandler && typeof cancelHandler === &#39;function&#39;) {
                    cancelHandler()
            }
            this.close()
            this.$emit(&#39;cancel&#39;)
    }
}
ログイン後にコピー

現在他のページで利用可能です

// test.vue  可以使用uni-app的 [easycom组件规范](https://uniapp.dcloud.io/component/README?id=easycom%e7%bb%84%e4%bb%b6%e8%a7%84%e8%8c%83),不用写import语句
<st-layer ref="stLayer"></st-layer>

// js部分
this.$refs.stLayer.open({
    msg: &#39;测试&#39;,
    confirm: () => {
        console.log(&#39;点击了确认&#39;)
    },
    cancel: () => {
        console.log(&#39;点击了取消&#39;)
    }
})
ログイン後にコピー

これで基本的な機能は実装されましたが、このように呼び出すのは不便だと言いたい人がいます。このように呼び出したいです

open(msg).then(() => {
    console.log(&#39;点击了确认&#39;)
}).catch(() => {
     console.log(&#39;点击了取消&#39;)
})
ログイン後にコピー

実装方法promiseはどうですか?最も簡単な方法は、open メソッドに promise を返させることです。 [確認] または [キャンセル] をクリックするときに then メソッドを入力するにはどうすればよいですか? 次の記述メソッドを参照してください

...
open() {
     return new promise((reoslve, reject) => {
        ...
        this.option.confirm = this.option.confirm || function confirmResolve () {
            resolve()
        }
         this.option.cancel = this.option.cancel || function cancelReject () {
            reject()
        }
     })
 }
...
ログイン後にコピー

他の個別のメソッド (confirm など) をカプセル化したい場合は、オープンに基づいて拡張できます:

confirm(msg, option = {}) {
        if (typeof msg === &#39;object&#39;) {
                option = msg
        } else {
                option.msg = msg
        }
        return this.open({
                ...option,
                showCancelButton: true,
                type: &#39;confirm&#39;
        })
}
// 调用方式
this.$refs.stLayer.confirm(&#39;是否确认?&#39;).then().catch()
ログイン後にコピー

このような基本的な弾性層コンポーネントが実装されています。以下は最後のステップですグローバル使用元の vue プロジェクトに記述されたレイヤー コンポーネントをグローバルに使用するには、通常、次のメソッドを使用してページに挿入されます

import main from &#39;./main.vue&#39;

const LayerConstructor = vue.extend(main)

const initInstance = () => {
  instance = new LayerConstructor({
    el: document.createElement(&#39;div&#39;)
  })

  instance.callback = defaultCallback
  document.getElementById(&#39;app&#39;).appendChild(instance.$el)
}
ログイン後にコピー

直接プルオーバーされます使用すると、結果はエラーとプロンプト エラー: ドキュメントが未定義です でした。その後、uni-app が通常の vue プロジェクトとは大きく異なることを思い出しました。動作原理:

uni-app 論理層とビュー層が分離されており、非 H5 側で実行する場合は、論理層の 2 つの部分に分割されます。そしてビューレイヤー。ロジック層はビジネス ロジックの実行、つまり JS コードの実行を担当し、ビュー層はページのレンダリングを担当します。開発者は vue ページに js と css を記述しますが、実際にはコンパイル中に分割されます。ロジック層は独立した jscore で実行されます。ローカル Web ビューに依存しないため、ブラウザーの互換性の問題がなく、Android 4.4 上で es6 コードを実行できます。一方で、ウィンドウ、ブラウザーを実行することはできません。ドキュメント、ナビゲーター、ローカルストレージなどの特定の js API。

そのため、このグローバル登録方法は利用できなくなりました。では、それを uni-app に実装するにはどうすればよいでしょうか? 公式フォーラムを調べてみると、loadervue-inset-loader の実装を発見しました。実装原理は、sfc テンプレートのコンテンツを取得し、指定された場所 (つまり、は、 global を必要とするコンポーネントです)、使用法は次のとおりです:

// 第一步
npm install vue-inset-loader --save-dev 
// 第二步 在vue.config.js(hbuilderx创建的项目没有的话新建一个)中注入loader
module.export = {
    chainWebpack: config => {
            // 超级全局组件
            config.module
                    .rule(&#39;vue&#39;)
                    .test(/\.vue$/)
                    .use()
                    .loader(path.resolve(__dirname, "./node_modules/vue-inset-loader"))
                    .end()
	} 
}
// 支持自定义pages.json文件路径  
// options: {  
//     pagesPath: path.resolve(__dirname,&#39;./src/pages.json&#39;)  
// } 
// 第三步 pages.json配置文件中添加insetLoader
"insetLoader": {  
    "config":{  
        "confirm": "<BaseConfirm ref=&#39;confirm&#39;></BaseConfirm>",  
        "abc": "<BaseAbc ref=&#39;BaseAbc&#39;></BaseAbc>"  
    },  
    // 全局配置  
    "label":["confirm"],  
    "rootEle":"div"  
}
ログイン後にコピー

構成手順

  • config (デフォルト: {} )
    定義 ラベル名と内容のキーと値のペア

  • label(デフォルト: [])
    パッケージ化後にグローバルに導入する必要があるラベル このタグはすべてのページに導入されます

  • rootEle(デフォルト: "div" )
    ルート要素のタグ タイプ、デフォルト値は div で、通常のルールをサポートします。たとえば、任意のラベル ".*"

    label および に一致します。 rootEle は別ページのスタイルでの設定をサポートしており、グローバル設定よりも優先されます。この時点で

を設定した後、コンポーネントはグローバルに使用できるようになります。各ページにタグを記述する必要はなく、API を呼び出すだけで使用できます。

後で使用状況に基づいて最適化できます。レベルは限られていますが、皆さんのアドバイスは大歓迎です。

推奨: 「uniapp チュートリアル

以上がuni-app でグローバル エラスティック レイヤー コンポーネントを開発する方法 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

VSCode でユニアプリを開発するにはどうすればよいですか? (チュートリアルの共有) VSCode でユニアプリを開発するにはどうすればよいですか? (チュートリアルの共有) May 13, 2022 pm 08:11 PM

VSCode でユニアプリを開発するにはどうすればよいですか?次の記事では、VSCode でのユニアプリ開発に関するチュートリアルを紹介します。これは、おそらく最も詳細なチュートリアルです。ぜひ見に来てください!

uniapp を使用してシンプルなマップ ナビゲーションを開発する uniapp を使用してシンプルなマップ ナビゲーションを開発する Jun 09, 2022 pm 07:46 PM

uniapp を使用してシンプルなマップ ナビゲーションを開発するにはどうすればよいですか?この記事では簡単な地図の作り方を紹介しますので、ぜひ参考にしてください。

uniapp を使用してスネーク ゲームを開発する方法について話しましょう。 uniapp を使用してスネーク ゲームを開発する方法について話しましょう。 May 20, 2022 pm 07:56 PM

uniapp を使用してスネーク ゲームを開発するにはどうすればよいですか?次の記事では、Uniapp に Snake ゲームを実装する手順を段階的に説明します。お役に立てば幸いです。

uni-app vue3 インターフェイスリクエストをカプセル化する方法 uni-app vue3 インターフェイスリクエストをカプセル化する方法 May 11, 2023 pm 07:28 PM

uni-app インターフェイス、グローバル メソッドのカプセル化 1. ルート ディレクトリに API ファイルを作成し、API フォルダーに api.js、baseUrl.js、および http.js ファイルを作成します。 2.baseUrl.js ファイル コード exportdefault"https://XXXX .test03.qcw800.com/api/"3.http.js ファイル コードexportfunctionhttps(opts,data){lethttpDefaultOpts={url:opts.url,data:data,method:opts.method

ユニアプリ カレンダー プラグインを開発 (および公開) する手順を段階的に説明します。 ユニアプリ カレンダー プラグインを開発 (および公開) する手順を段階的に説明します。 Jun 30, 2022 pm 08:13 PM

この記事では、ユニアプリ カレンダー プラグインの開発をステップごとに説明し、次期カレンダー プラグインの開発からリリースまでの手順を紹介します。

uniapp が複数選択ボックスの全選択機能を実装する方法を説明する例 uniapp が複数選択ボックスの全選択機能を実装する方法を説明する例 Jun 22, 2022 am 11:57 AM

この記事では、uniapp に関する関連知識を提供します。主に、複数選択ボックスの全選択機能の実装に関する問題を整理します。全選択機能が実装できない理由は、チェックボックスのチェックされたフィールドがオンになっている場合です。動的に変更されると、インターフェイス上のステータスはリアルタイムに変更されますが、checkbox-group の変更イベントはトリガーされません。

uniapp のスクロールビュー ドロップダウンの読み込みについて話しましょう uniapp のスクロールビュー ドロップダウンの読み込みについて話しましょう Jul 14, 2022 pm 09:07 PM

uniapp はスクロールビューのドロップダウン読み込みをどのように実装しますか?次の記事では、uniapp WeChat アプレットのスクロールビューのドロップダウン読み込みについて説明しています。

uniapp が電話録音機能を実装する方法の詳細な例 (コード付き) uniapp が電話録音機能を実装する方法の詳細な例 (コード付き) Jan 05, 2023 pm 04:41 PM

この記事では、uniapp に関する関連知識を皆さんに提供します。主に uniapp を使用して電話をかける方法と同期録音する方法を紹介します。興味のある友人はぜひご覧ください。皆様のお役に立てれば幸いです。

See all articles