WeChatアプレット開発の章:落とし穴の記録

WeChatアプレット開発の章:落とし穴の記録

最近、会社初のミニプログラムの開発に参加しました。開発経験は基本的にWebViewをベースとしたハイブリッド開発と似ています。公式の強力なAPIを呼び出すことができますが、落とし穴や慣れていない点もあります。この記事では、実用性の観点から開発プロセスにおけるいくつかの問題を記録します。

1. スタイルの優先順位が混乱している

ボタン コンポーネントを使用すると、クラスで幅を設定しても効果がないことがわかりました。コードは次のとおりです。

.my-button{
 幅: 140rpx;
 高さ: 60rpx;
 行の高さ: 60rpx;
 パディング: 0;
}

WeChat デバッグツールで確認したところ、ユーザーエージェントのスタイル優先度が、自分で記述したスタイルクラスよりも高いことがわかりました。これはブラウザでは基本的に不可能です。

解決策は実はとても簡単です。width または style="width:140rpx" に接尾辞 !important を追加するだけです。変更後の効果を見てみましょう。

!important を追加した後、幅の実際の効果は期待どおりになりましたが、WeChat デバッグ ツールでは依然としてユーザー エージェント スタイルが優先されることが示されています。これはデバッグ ツールのバグと見なす必要があります。

2. 通常のUIコンポーネントのカプセル化、面倒なパラメータ定義

一般的に、ボタンなどの UI ビジュアル ドラフトの基本コンポーネントには、背景色やフォントなどの特定のスタイルがあります。ミニプログラムの Component 機能を使用してコンポーネントにカプセル化し、デフォルトのスタイルを記述して外部から渡されたクラスを受け取ることで、その後の開発が容易になります。

React には <tag {...props}></tag> という記述方法があり、これはコンポーネントが props を受け取っても処理せずに次のコンポーネントに渡すことを意味します。ただし、ミニプログラムはこの記述方法をサポートしていません (検索しても結果は得られず、公式ドキュメントにも説明されていません)。

つまり、ボタン コンポーネントでサポートされているすべてのパラメータをプロパティにリストする必要があります。

プロパティ:
  クラス: {
   タイプ: 文字列、
   価値: ''、
  },
  タイプ: {
   タイプ: 文字列、
   値: 'デフォルト'、
  },
  無地:
   タイプ: ブール値、
   値: false、
  },
  サイズ: {
   タイプ: 文字列、
   値: 'デフォルト'、
  },
  ......
 },

3. グローバルスタイルセレクター*が無効になっています

*{
 ボックスのサイズ: 境界線ボックス;
}

上記のコードは、アプレットがこのタイプのセレクターを禁止しているため、コンパイル時にエラーを報告します。具体的な理由を大胆に推測すると、比較的広い範囲を持つこのタイプのセレクターは、カスタム コンポーネントのスタイル分離と競合するのではないかということです。 ?

では、ミニプログラムにグローバル共通スタイルを追加するにはどうすればよいでしょうか?使用されているタグはすべて手動で記述するしかないようです。幸いなことに、インターネット上には貼り付け可能な既製のコードがあります。

ビュー、スクロール ビュー、スワイパー、スワイパー項目、移動可能領域、移動可能ビュー、カバー ビュー、カバー画像、アイコン、テキスト、リッチ テキスト、進行状況、ボタン、チェックボックス グループ、チェックボックス、フォーム、入力、ラベル、ピッカー、ピッカー ビュー、ラジオ グループ、ラジオ、スライダー、スイッチ、テキスト領域、ナビゲーター、機能ページ ナビゲーター、画像、ビデオ、カメラ、ライブ プレーヤー、ライブ プッシャー、マップ、キャンバス、オープン データ、Web ビュー、広告{
 ボックスのサイズ: 境界線ボックス;
}

4. カスタムコンポーネント、bind:tapが2回呼び出される

ボタンなどの基本コンポーネントをカプセル化する場合は、次のことを避ける必要があります。

タップすると{
 (!このデータが無効で、&!このデータがロード中){
  this.triggerEvent('タップ', e.detail)
 }
},
<button bindtap="onTap"></button>

このようにカプセル化されたコンポーネントは、ミニプログラム自体によって 1 つ、triggerEvent によって 1 つの 2 つのタップ イベントをトリガーします。

クリックなど、アプレットに組み込まれていないイベント タイプに変更できます。

タップすると{
 (!このデータが無効で、&!このデータがロード中){
  this.triggerEvent('クリック', e.detail)
 }
},

タップ イベントのバブルを防ぐことでも問題を解決できます。

<button catchtap="onTap"></button>

5. wxml の型変換には Boolean() を使用する

たとえば、コンポーネントでは、String 型のパラメータをリッスンします。空でない場合はテキスト ラベルが表示され、空の場合は表示されません。

// プレーヤー.wxml
<text class="text1" wx:if="{{ Boolean(leftText) }}">{{ leftText }}</text>
// インデックス.wxml
<player leftText="読む"></player>

この方法では、leftText フィールドは渡されますが、テキスト ラベルはまだ表示されません。別の方法で記述すると、次のようになります。

// プレーヤー.wxml
<text class="text1" wx:if="{{ leftText }}">{{ leftText }}}</text>

これは正しく、私たちの期待に応えています。

すごいですよね?

6. InnerAudioContextがseekメソッドを呼び出した後、onTimeUpdateコールバックは無効になります。

InnerAudioContext はオーディオの再生に使用されます。現在の再生の進行状況を取得するには、onTimeUpdate コールバックを渡します。

ただし、再生のために指定された位置にジャンプするために seek メソッドが呼び出されると、onTimeUpdate は呼び出されなくなります。

ミニプログラムコミュニティの多くの人がこの問題を提起しています。約1年半が経過しましたが、WeChatチームはまだこれを修正していません。一時的に妥協案を使用することしかできません。解決策は実際には非常に簡単です。

進捗状況の変更(e) {
 this.properties.src と this.data.innerAudioContext の場合 {
  定数 innerAudioContext = this.data.innerAudioContext;
  内部オーディオコンテキストを一時停止します。
  innerAudioContext.seek(innerAudioContext.duration * e.detail.value / 100);
  タイムアウトを設定する(() => {
   内部オーディオコンテキストを再生します。
  }, 500);
 }
},

まず再生を一時停止し、次に seek メソッドを実行し、次に約 500 ミリ秒の遅延を設定して play メソッドを呼び出します。

7. InnerAudioContext で継続時間を取得するタイミング

オーディオが再生される前の継続時間を取得したいのですが、できません。onPlay と onCanplay の呼び出しに関するインターネット上の記述はあまり信頼できません。1 つの解決策は次のとおりです。

innerAudioContext.onCanplay(() => {
 タイムアウトを設定する(() => {
  this.setData({
   継続時間Str: secondToTimeStr(innerAudioContext.duration) || '--:--',
  });
 }, 500);
});

setTimeout を設定するのに適切なミリ秒数は言うまでもなく、実際のマシンでは無効です。

したがって、onTimeUpdate を使用する方が適切です。

innerAudioContext.onTimeUpdate(() => {
 this.setData({
  継続時間Str: secondToTimeStr(innerAudioContext.duration) || '--:--'
 })
});

すべての onTimeUpdate を計算するとパフォーマンスが過度に低下すると思われる場合は、自分で実装して 1 回だけ計算することもできます。

8. ページの背景色を設定する

現在のページの json ファイルには backgroundColor フィールドがありますが、設定後に無効になっています。後で調べたところ、このフィールドは表示されている領域の背景色を表すのではなく、ページをプルダウンしたときのウィンドウの背景色を表すことがわかりました。

ページの背景色を設定する必要がある場合は、ページ タグのスタイルを通じて設定できます。

ページ{
 背景: #f9fafb;
}

要約する

WeChatミニプログラム開発の落とし穴に関するこの記事はこれで終わりです。WeChatミニプログラム開発の落とし穴に関する関連コンテンツの詳細については、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援してください。

以下もご興味があるかもしれません:
  • taroを使用してWeChatアプレットを開発する際に遭遇する落とし穴のまとめ
  • Taro WeChatアプレット開発におけるEchartsの落とし穴
  • WeChatアプレット開発で遭遇したことのない落とし穴のまとめ

<<:  Linux CentOS MySQL データベースのインストールと設定のチュートリアル

>>:  MySQL 5.7.18 でパスワードを変更する方法

推薦する

MySQLシリーズのMariaDBサーバーのインストール

目次チュートリアルシリーズ1. yumパッケージマネージャーを使用してMariaDBサーバーをインス...

HTML ページ内の js および css ファイルのキャッシュを自動的にクリーンアップします (バージョン番号を自動的に追加します)

Web プロジェクトの開発プロセスでは、CSS ファイルや JS ファイルを参照することがよくあり...

携帯電話に GreasyFork js スクリプトをインストールするチュートリアル

目次序文1. Iceraven ブラウザ (Firefox) (Android) 2. (アンドロイ...

CSS3 での 2D および 3D 変換の実装

CSS3 は、要素の 2D 平面変換と視覚的な 3D 空間変換を実装します。2D 変換はより頻繁に使...

WINDOWS での MYSQL のインストールに関する詳細なチュートリアル

1. インストールパッケージをダウンロードする- お使いのコンピュータシステムに応じて適切なバージョ...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

CSS3 border-radius 丸角の実装方法と使い方の詳しい説明

以前は、角を丸くするのは非常に面倒でしたが、CSS3 では、角を丸くするのは非常に簡単になり、bor...

最も単純な ErrorBoundary コンポーネントをカプセル化して、React 例外を処理する

序文React 16から、子コンポーネントで発生したエラーを捕捉し、エラーログを記録し、ダウングレー...

iframe タグの使用方法の詳細な説明 (属性、透明度、適応高さ)

1. iframe の定義と使用法iframe 要素は、別のドキュメントを含むインライン フレーム...

JavaScript でのカスタム スワイパー コンポーネントの詳細な説明

目次エフェクト表示コンポーネント設定ステップ1ステップ2ステップ3コンポーネントの使用ステップ1ステ...

Vueは2つのルーティング許可制御メソッドを実装しています

目次方法 1: ルーティング メタ情報 (meta)方法 2: ルーティング テーブルを動的に生成す...

MySQLの共有ロックと排他ロックの使用例の分析

この記事では、例を使用して MySQL の共有ロックと排他ロックの使用方法を説明します。ご参考までに...

@Font-face の基本的な使い方と、すべてのブラウザと互換性を持たせる方法

@Font-face 基本紹介: @font-face は、Web ページにカスタム フォントを表示...

JavaScript Three.js でテキストを作成する最初の経験

目次効果テキストの作成を開始するまずフォントローダーを作成するフォントライブラリを読み込むテキストジ...

Linux の daily_routine サンプルコードの詳細な説明

まずサンプルコードを見てみましょう: #/bin/bash cal 日付 -u echo "...