国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
ツールとアーキテクチャ
はじめる
スケジューリングのための耐久性のある編成機(jī)能
編成された耐久性のある関數(shù)を作成します
耐久性のあるHTTPトリガーを使用したスケジューリング
耐久性のあるオーケストレーターで調(diào)整
耐久性のあるアクティビティで電子メールを送信します
Azureに関數(shù)を展開します
8ベース付きのデータとGraphQLレイヤー
イベントストレージと取得用の8ベーステーブルを作成します
GraphQLクエリと遊び場(chǎng)での突然変異のテスト
カレンダーとイベントフォームインターフェイス
カレンダーにイベントを表示します
イベントフォームコンポーネントでイベントを作成、更新、削除します
8ベースから耐久性のあるhttpトリガーを呼び出します
トリガースケジューリングロジック
8ベースロジック構(gòu)成
すべてのものを展開したいと思っています
フロー全體をテストします
ホームページ ウェブフロントエンド CSSチュートリアル ねえ、'はJamstackを使用して機(jī)能的なカレンダーアプリを作成しました

ねえ、'はJamstackを使用して機(jī)能的なカレンダーアプリを作成しました

Apr 19, 2025 am 10:22 AM

ねえ、'はJamstackを使用して機(jī)能的なカレンダーアプリを作成しました

ねえ、'はJamstackを使用して機(jī)能的なカレンダーアプリを作成しました

私はいつもダイナミックなスケジューリングがどのように機(jī)能したか疑問に思っていたので、広範(fàn)な研究を行い、新しいことを?qū)Wび、旅の技術(shù)的な部分について書くことにしました。あなたに警告するのは公平です。ここで私がカバーするものはすべて、3週間の研究が単一の記事に凝縮されていることです。初心者に優(yōu)しいですが、健康的な量の読書です。それで、椅子を引き上げて、座って冒険をしましょう。

私の計(jì)畫は、Googleカレンダーのように見えるが、3つのコア機(jī)能を示すもののみを作成することでした。

  1. カレンダーに既存のすべてのイベントをリストします
  2. 新しいイベントを作成します
  3. 作成中に選択された日付に基づくスケジュールと電子メールの通知。スケジュールは、時(shí)間が正しいときにユーザーに電子メールを送信するためのコードを?qū)g行する必要があります。

かなり、そうですか?これが私たちが作るものだからです。

私がコードに後で実行するように依頼することについての唯一の知識(shí)は、Cronの仕事でした。 Cronジョブを使用する最も簡(jiǎn)単な方法は、コード內(nèi)のジョブを靜的に定義することです。これはアドホックです。靜的には、Googleカレンダーのようなイベントを単純にスケジュールすることができず、Cronコードを簡(jiǎn)単に更新できないことを意味します。 Cronトリガーの執(zhí)筆の経験がある場(chǎng)合、あなたは私の痛みを感じます。そうでない場(chǎng)合は、この方法でCronを使用する必要がないかもしれません。

私のフラストレーションについてさらに詳しく説明するために、HTTPリクエストのペイロードに基づいてスケジュールをトリガーする必要がありました。このスケジュールに関する日付と情報(bào)は、HTTPリクエストを介して渡されます。これは、事前に予定されている日付のようなことを知る方法がないことを意味します。

私たち(私の同僚と私)は、この仕事をする方法を考え出しました。イベントの作成から電子メールのスケジューリング、カレンダーリストまで、この記事で私が作ったすべてについて學(xué)びます。これがアクション中のアプリのビデオです:

https://www.youtube.com/watch?v=simam4fxpoo&

微妙な遅延に気付くかもしれません。これは、スケジュールの実行タイミングやコードの実行とは何の関係もありません。何らかの形のレイテンシがあると思われる無料のSendGridアカウントでテストしています。これは、電子メールを送信せずにサーバーレス関數(shù)をテストすることで確認(rèn)できます。コードが正確にスケジュールされた時(shí)間に実行されることに気付くでしょう。

ツールとアーキテクチャ

このプロジェクトの3つの基本ユニットは次のとおりです。

  1. React FrontEnd :カレンダーUI、UIを含むイベントを作成、更新、または削除します。
  2. 8ベースGraphQL :アプリのバックエンドデータベースレイヤー。ここで、日付を保存、読み取り、更新します。楽しい部分は、このバックエンドのコードを書いていないことです。
  3. 耐久性のある関數(shù):耐久性のある関數(shù)は、以前の実行から狀態(tài)を記憶する力を持つサーバーレス関數(shù)の一種です。これがCronの仕事に取って代わるものであり、前述のアドホックな問題を解決します。

この投稿の殘りの部分には、上記の3つのユニットに基づいた3つの主要なセクションがあります。私たちはそれらを次々と取り、それらを構(gòu)築し、テストし、作業(yè)を展開します。それに取り組む前に、私が始めたスタータープロジェクトを使用してセットアップしましょう。

プロジェクトレポ

はじめる

このプロジェクトをさまざまな方法で設(shè)定できます。1つのプロジェクトに3つのユニットを備えたフルスタックプロジェクトとして、または各ユニットが獨(dú)自のルートに住んでいるスタンドアロンプ??ロジェクトとして。まあ、私は1つのプロジェクトであるため、より簡(jiǎn)潔で、教えるのが簡(jiǎn)単で、管理しやすいので、私は最初に行きました。

このアプリはCreate-React-Appプロジェクトとなり、セットアップする障壁を下げるためのスターターを作成しました。補(bǔ)足コードとロジックには、記事の範(fàn)囲外であるため、説明する必要はありません。以下が私たちのために設(shè)定されています:

  1. カレンダーコンポーネント
  2. イベントフォームを提示するためのモーダルおよびポップオーバーコンポーネント
  3. イベントフォームコンポーネント
  4. データをクエリして変異させるためのいくつかのGraphQLロジック
  5. スケジューラを書き込む耐久性のあるサーバーレス機(jī)能足場(chǎng)

ヒント:私たちが気にする既存の各ファイルには、ドキュメントの上部にコメントブロックがあります。コメントブロックは、コードファイルで現(xiàn)在起こっていることと、次に行うために必要なことを説明するTo Doセクションを教えてくれます。

スターターフォームGithubをクローニングすることから始めます。

 git clone -bスターター - シングルブランチhttps://github.com/christiannwamba/calendar-app.git

root package.jsonファイルとserverless package.jsonに記載されているNPM依存関係をインストールします。

 NPMインストール

スケジューリングのための耐久性のある編成機(jī)能

この用語が何であるかを理解する前に、最初に邪魔にならないようにする必要がある2つの単語があります -オーケストレーション耐久性

オーケストレーションは、もともと、適切に調(diào)整されたイベント、アクションなどのアセンブリを説明するために使用されていました。コンピュータシステムのスムーズな調(diào)整を記述するために、コンピューティングで大幅に借用されています。キーワードは座標(biāo)です。システムの2つ以上のユニットを調(diào)整された方法でまとめる必要があります。

耐久性は、長(zhǎng)続きするという優(yōu)れた機(jī)能を持つものを説明するために使用されます。

システムの調(diào)整と長(zhǎng)持ちすると、耐久性のある機(jī)能が得られます。 Azureのサーバーレス機(jī)能の場(chǎng)合、これは最も強(qiáng)力な機(jī)能です。私たちが知っているものに基づいて耐久性のある関數(shù)は、これらの2つの機(jī)能を持っています。

  1. それらを使用して、2つ以上の関數(shù)の実行を組み立て、それらを調(diào)整することができ、人種條件が発生しない(オーケストレーション)。
  2. 耐久性のある機(jī)能は物事を覚えています。これがそれをとても強(qiáng)力にしている理由です。 http:statelessのナンバーワンルールを破ります。耐久性のある機(jī)能は、どれだけ長(zhǎng)く待たなければならないとしても、狀態(tài)をそのままに保ちます。未來の1、000、000年のスケジュールを作成すると、トリガーの日に渡されたパラメーターを覚えている間、100萬年後に耐久性のある機(jī)能が実行されます。つまり、耐久性のある機(jī)能はステートフルです。

これらの耐久性機(jī)能は、サーバーレス機(jī)能の機(jī)會(huì)の新しい領(lǐng)域のロックを解除しているため、今日の機(jī)能の1つを調(diào)査しています。耐久性のある機(jī)能のいくつかの可能なユースケースのいくつかの視覚化されたバージョンについては、サラの記事をもう一度強(qiáng)くお?jiǎng)幛幛筏蓼埂?/p>

また、今日書く耐久性のある機(jī)能の動(dòng)作を視覚的に表現(xiàn)しました。これをアニメーション化されたアーキテクチャ図として取る:

外部システム(8ベース)からのデータ変異は、HTTPトリガーを呼び出すことによりオーケストレーションをトリガーします。トリガーは、イベントをスケジュールするオーケストレーション関數(shù)を呼び出します。実行の時(shí)間が期限になると、オーケストレーション関數(shù)が再び呼び出されますが、今回はオーケストレーションをスキップし、アクティビティ関數(shù)を呼び出します。アクティビティ関數(shù)はアクションパフォーマーです。これは、「電子メール通知の送信」などの実際のことです。

編成された耐久性のある関數(shù)を作成します

VSコードを使用して関數(shù)の作成を説明します。 2つのことが必要です。

  1. Azureアカウント
  2. VSコード

両方のセットアップを取得したら、それらを結(jié)び付ける必要があります。これを行うには、VSコード拡張機(jī)能とノードCLIツールを使用できます。 CLIツールのインストールから始めます:

NPMインストール-G Azure-Functions-Core-Tools

# または

Brew Tap Azure/関數(shù)
Brew Install Azure-Functions-Core-Tools

次に、Azure関數(shù)拡張機(jī)能をインストールして、VSコードをAzureの関數(shù)に結(jié)び付けます。以前の記事からAzure関數(shù)のセットアップの詳細(xì)を読むことができます。

すべてのセットアップが完了したので、これらの関數(shù)を作成してみましょう。作成する機(jī)能は、次のフォルダーにマッピングされます。

フォルダ 関數(shù)
スケジュール 耐久性のあるHTTPトリガー
ScheduelOrchestrator 耐久性のあるオーケストレーション
sendemail 耐久性のあるアクティビティ

トリガーから始めます。

  1. Azure Extensionアイコンをクリックして、下の畫像に従ってスケジュール機(jī)能を作成します
  2. これは最初の関數(shù)であるため、関數(shù)プロジェクトを作成するためにフォルダーアイコンを選択しました。その後のアイコンは、単一の関數(shù)(プロジェクトではなく)を作成します。
  3. [閲覧]をクリックして、プロジェクト內(nèi)のサーバーレスフォルダーを作成します。新しいサーバーレスフォルダーを選択します。
  4. 言語としてJavaScriptを選択します。 TypeScript(または他の言語)がジャムである場(chǎng)合は、お?dú)葺Xにお問い合わせください。
  5. 耐久性のある機(jī)能HTTPスターターを選択します。これがトリガーです。
  6. 最初の関數(shù)にスケジュールとして名前を付けます

次に、オーケストレーターを作成します。関數(shù)プロジェクトを作成する代わりに、代わりに関數(shù)を作成します。

  1. 関數(shù)アイコンをクリックします:
  2. 耐久性のある関數(shù)オーケストレーターを選択します。
  3. 名前を付けて、Schedule -orchestratorを掲載し、 Enterを押してください。
  4. ストレージアカウントを選択するように求められます。オーケストレーターは、ストレージを使用して、プロセスの機(jī)能の狀態(tài)を保持します。
  5. Azureアカウントでサブスクリプションを選択します。私の場(chǎng)合、私は無料の試用サブスクリプションを選択しました。
  6. 殘りのいくつかの手順に従って、ストレージアカウントを作成します。

最後に、以前の手順を繰り返してアクティビティを作成します。今回は、以下が異なるはずです:

  • 耐久性のある機(jī)能アクティビティを選択します。
  • sendemailに名前を付けます。
  • ストレージアカウントは必要ありません。

耐久性のあるHTTPトリガーを使用したスケジューリング

サーバーレス/スケジュール/index.jsのコードに觸れる必要はありません。これは、VSコードまたはCLIツールを使用して機(jī)能が足場(chǎng)になったときの元々のように見えるものです。

 const df = require( "durable-functions");
module.exports = async function(context、req){
  const client = df.getClient(context);
  const instanceId = await client.startnew(req.params.functionname、undefined、req.body);
  context.log( `id = '$ {instanceId}'。`)でオーケストレーションを開始しました。
  return client.createcheckstatusResponse(context.bindingdata.req、instanceId);
};

ここで何が起こっているのですか?

  1. リクエストのコンテキストに基づいて、クライアント側(cè)に耐久性のある機(jī)能を作成しています。
  2. クライアントのstartnew()関數(shù)を使用してオーケストレーターを呼び出しています。オーケストレーターの関數(shù)名は、paramsオブジェクトを介してstartnew()の最初の引數(shù)として渡されます。 req.bodyは、オーケストレーターに転送される3番目の引數(shù)としてstartnew()に渡されます。
  3. 最後に、オーケストレーター機(jī)能のステータスを確認(rèn)するために使用できるデータのセットを返したり、完了する前にプロセスをキャンセルしたりできます。

上記の関數(shù)を呼び出すURLは次のようになります。

 http:// localhost:7071/api/orchestrators/{functionname}

ここで、functionnameはstartnewに渡された名前です。私たちの場(chǎng)合、それは次のとおりです。

 // localhost:7071/api/orchestrators/schedule -orchestrator

また、このURLの外観を変更できることを知っておくとよいでしょう。

耐久性のあるオーケストレーターで調(diào)整

HTTPトリガーStartNew Callは、渡す名前に基づいて関數(shù)を呼び出します。その名前は、オーケストレーションロジックを保持する関數(shù)とフォルダーの名前に対応しています。 ServerLess/ScheduleOrchestrator/index.jsファイルは、耐久性のある機(jī)能をエクスポートします。コンテンツを次のものに置き換えます。

 const df = require( "durable-functions");
module.exports = df.orchestrator(function*(context){
  const input = context.df.getInput()
  // todo -1
  
  // todo -2
});

オーケストレーター関數(shù)は、Context.df.getInput()を使用してHTTPトリガーからリクエスト本體を取得します。

TODO -1を、このデモ全體で最も重要なことである可能性のある次のコードの行に置き換えます。

 edvey Context.df.createtimer(new Date(input.startat)))

この行が耐久性のある関數(shù)を使用して、HTTPトリガーを介してリクエスト本體から渡された日付に基づいてタイマーを作成します。

この関數(shù)が実行されてここに到達(dá)すると、タイマーと保釈が一時(shí)的にトリガーされます。スケジュールが予定されている場(chǎng)合、それは戻ってきて、この行をスキップして、TODOの代わりに使用する必要がある次の行を呼び出します-2。

 return regjectoncement.df.callactivity( 'sendemail'、input);

この関數(shù)は、アクティビティ関數(shù)を呼び出して電子メールを送信します。また、2番目の引數(shù)としてペイロードを渡しています。

これは、完成した関數(shù)がどのように見えるかです:

 const df = require( "durable-functions");

module.exports = df.orchestrator(function*(context){
  const input = context.df.getInput()
    
  edvey Context.df.createtimer(new Date(input.startat)))
    
  return regjectoncement.df.callactivity( 'sendemail'、input);
});

耐久性のあるアクティビティで電子メールを送信します

スケジュールが期限が來ると、オーケストレーターが戻ってアクティビティを呼び出します。アクティビティファイルは、ServerLess/sendemail/index.jsに存在します。そこにあるものを次のものに置き換えます。

 const sgmail = require( '@sendgrid/mail');
sgmail.setapikey(process.env ['sendgrid_api_key']);

module.exports = async function(context){
  // todo -1
  const msg = {}
  // todo -2
  MSGを返します。
};

現(xiàn)在、SendGridのメーラーをインポートし、APIキーを設(shè)定しています。これらの指示に従ってAPIキーを取得できます。

資格を安全に保つために、環(huán)境変數(shù)にキーを設(shè)定しています。 SERDGRID_API_KEYキーをServerLess/local.settings.jsonで、sendgridキーを値として作成することで、同じ方法で安全に保存できます。

 {
  「Isencrypted」:False、
  「?jìng)帯梗簕
    「azurewebjobsstorage ":"  "、
    "functions_worker_runtime": "node"、
    「sendgrid_api_key」: ""
  }
}

TODO -1を次の行に置き換えます。

 const {email、title、startat、description} = context.bindings.payload;

これにより、オーケストレーター関數(shù)からの入力からイベント情報(bào)が引き出されます。入力はContext.bindingsに添付されています。ペイロードはあなたがそれに名前を付けるものになる可能性があるので、サーバーレス/sendemail/function.jsonに移動(dòng)し、ペイロードに名前の値を変更します。

 {
  「バインディング」:[
    {
      「名前」:「ペイロード」、
      「タイプ」:「ActivityTrigger」、
      「方向」:「in」
    }
  ]
}

次に、TODOを更新します-2次のブロックで電子メールを送信します。

 const msg = {
  宛先:メール、
  from:{email: '[電子メール保護(hù)]'、name: 'codebeast calendar'}、
  件名: `event:$ {title}`、
  html: `<h4> $ {title} @ $ {startat} </h4> <p> $ {説明} </p>`
};
sgmail.send(msg);

MSGを返します。

これが完全なバージョンです:

 const sgmail = require( '@sendgrid/mail');
sgmail.setapikey(process.env ['sendgrid_api_key']);

module.exports = async function(context){
  const {email、title、startat、description} = context.bindings.payload;
  const msg = {
    宛先:メール、
    from:{email: '[電子メール保護(hù)]'、name: 'codebeast calendar'}、
    件名: `event:$ {title}`、
    html: `<h4> $ {title} @ $ {startat} </h4> <p> $ {説明} </p>`
  };
  sgmail.send(msg);

  MSGを返します。
};

Azureに関數(shù)を展開します

Azureに機(jī)能を展開するのは簡(jiǎn)単です。これは、VSコードエディターから離れたクリックです。丸型アイコンをクリックして展開し、展開URLを取得します。

まだ私と一緒にここまで?あなたは大きな進(jìn)歩を遂げています!ここで休憩したり、晝寢をしたり、ストレッチしたり、休んだりすることはまったく大丈夫です。この投稿を書いている間、私は間違いなくやった。

8ベース付きのデータとGraphQLレイヤー

8ベースの私の最も簡(jiǎn)単な説明と理解は、「GraphQLのFirebase」です。 8ベースは、考えることができるあらゆる種類のアプリのデータベースレイヤーであり、その最も興味深い側(cè)面は、GraphQLに基づいていることです。

スタックの8ベースがどこに収まるかを説明する最良の方法は、シナリオの絵を描くことです。

あなたがクライアントのためのeコマースストアを構(gòu)築するための小規(guī)模なスケール契約を備えたフリーランス開発者であると想像してください。あなたのコアスキルはウェブ上にあるので、バックエンドであまり快適ではありません。少しノードを書くことはできますが。

殘念ながら、eコマースでは、在庫の管理、注文管理、購(gòu)入の管理、認(rèn)証とアイデンティティの管理などが必要です?;茎欹佶毪扦巍腹芾怼工稀ⅴ签`タCRUDとデータアクセスを意味します。

バックエンドコードのエンティティのアクセスを作成、読み取り、更新、削除、および管理する冗長(zhǎng)で退屈なプロセスの代わりに、これらのビジネス要件をUIで説明できたらどうでしょうか? CRUD操作、AUTH、およびアクセスを構(gòu)成できるテーブルを作成できる場(chǎng)合はどうなりますか?そのようなヘルプがあり、フロントエンドコードの構(gòu)築とクエリの書き込みにのみ集中した場(chǎng)合はどうなりますか?私たちが今まで説明したすべては、8ベースで取り組まれています

以下は、データレイヤーのために8ベースに依存するバックエンドのないアプリのアーキテクチャです。

イベントストレージと取得用の8ベーステーブルを作成します

テーブルを作成する前に最初に行う必要があることは、アカウントを作成することです。アカウントを取得したら、特定のプロジェクトのすべてのテーブルとロジックを保持するワークスペースを作成します。

次に、テーブルを作成し、テーブルイベントに名前を付けて、テーブルフィールドに記入します。

アクセスレベルを構(gòu)成する必要があります?,F(xiàn)在、各ユーザーから隠すものは何もないので、作成したイベントテーブルへのすべてのアクセスをオンにすることができます。

Authのセットアップは、Auth0と統(tǒng)合されるため、8Baseで非常にシンプルです。保護(hù)する必要があるエンティティがある場(chǎng)合、またはAUTHを使用するために模範(fàn)を拡張したい場(chǎng)合は、ワイルドにしてください。

最後に、Reactアプリで使用するためにエンドポイントURLをつかみます。

GraphQLクエリと遊び場(chǎng)での突然変異のテスト

URLをワイルドに持ち込み、クライアントの構(gòu)築を開始する準(zhǔn)備ができていることを確認(rèn)するために、最初にAPIをGraphQLプレイグラウンドでテストし、セットアップが問題ないかどうかを確認(rèn)しましょう。エクスプローラーをクリックします。

エディターに次のクエリを貼り付けます。

クエリ{
  イベントスリスト{
    カウント
    アイテム{
      id
      タイトル
      startat
      エンダット
      説明
      Allday
      メール
    }
  }
}

8ベースUIを介していくつかのテストデータを作成し、クエリを?qū)g行すると結(jié)果が戻ります。

Exploreページの右端にあるスキーマドキュメントを使用して、データベース全體を探索できます。

カレンダーとイベントフォームインターフェイス

プロジェクトの3番目の(および最後の)ユニットは、ユーザーインターフェイスを構(gòu)築するReactアプリです。 UIを構(gòu)成する4つの主要なコンポーネントがあり、次のものが含まれます。

  1. カレンダー:既存のすべてのイベントをリストするカレンダーUI
  2. イベントモーダル:イベントフォームコンポーネントをレンダリングしてコンポーネントを作成する反応モーダル
  3. イベントポップオーバー:ポップオーバーUIで1つのイベントを読む、EventFormまたは削除イベントを使用してイベントを更新する
  4. イベントフォーム:新しいイベントを作成するためのHTMLフォーム

カレンダーコンポーネントに飛び込む前に、React Apolloクライアントをセットアップする必要があります。 React Apolloプロバイダーは、Reactパターンを使用してGraphQLデータソースを照會(huì)するツールを使用します。元のプロバイダーを使用すると、高次コンポーネントを使用したり、プロップをレンダリングしてデータをクエリしたり変異させたりできます。元のプロバイダーにラッパーを使用して、Reactフックを使用してクエリして変異させることができます。

src/index.jsでは、todoでreact apolloフックと8ベースクライアントをインポートします-1:

 「race-apollo-hooks」から{apolloprovider}をインポートします。
'@8base/apollo-client'から{eightbaseapolloclient}をインポートします。

TODO -2では、8ベースのセットアップ段階で取得したエンドポイントURLでクライアントを構(gòu)成します。

 const uri = 'https://api.8base.com/cjvuk51i0000701S0HVVCBNXG';

const apolloclient = new Eight Baseapolloclient({
  uri:uri、
  withauth:false
});

このクライアントを使用して、アプリツリー全體をTODOでプロバイダーでラップします-3:

 Reactdom.Render(
  <apolloprovider client="{apolloclient}">
    <app></app>
  </apolloprovider>、
  document.getElementById( 'root')
);

カレンダーにイベントを表示します

カレンダーコンポーネントは、アプリコンポーネント內(nèi)でレンダリングされ、npmからBigCalendarコンポーネントをインポートします。それから :

  1. イベントのリストでカレンダーをレンダリングします。
  2. カレンダーに、イベントの編集に使用されるカスタムポップオーバー(EventPopover)コンポーネントを提供します。
  3. 新しいイベントを作成するために使用されるモーダル(EventModal)をレンダリングします。

更新する必要があるのは、イベントのリストです。イベントの靜的配列を使用する代わりに、すべてのストアイベントに8ベースをクエリしたいと思います。

TODO -1を次の行に置き換えます。

 const {data、error、loading} = usequery(events_query);

ファイルの先頭にあるNPMからUseQueryライブラリとevents_Queryをインポートします。

 「race-apollo-hooks」から{usequery}をインポートします。
'../../queries'から{events_Query}をインポートします。

Events_Queryは、8Base Explorerでテストしたクエリとまったく同じクエリです。それはSRC/クエリに住んでいて、次のように見えます:

 const events_query = gql`をエクスポートします
  クエリ{
    イベントスリスト{
      カウント
      アイテム{
        id
        ...
      }
    }
  }
`;

TODOに簡(jiǎn)単なエラーとロードハンドラーを追加しましょう-2:

 if(error)return console.log(error);
  if(ロード)
    戻る (
      <div classname="calendary">
        <p>読み込み... </p>
      </div>
    );

カレンダーコンポーネントがEventPopoverコンポーネントを使用してカスタムイベントをレンダリングすることに注意してください。また、カレンダーコンポーネントファイルがEventModalをレンダリングすることも観察できます。両方のコンポーネントがあなたのためにセットアップされており、それらの唯一の責(zé)任はイベントフォームをレンダリングすることです。

イベントフォームコンポーネントでイベントを作成、更新、削除します

src/components/event/eventform.jsのコンポーネントはフォームをレンダリングします。フォームは、イベントの作成、編集、削除に使用されます。 Todo -1では、usecreateupdatemutationとsudeletemutationをインポートします。

 './eventMutationhooks'から{usecreateupdatemutation、sudeletemutation}
  • usecreateupdatemutation:この突然変異は、イベントが既に存在しているかどうかに応じて、イベントを作成または更新するかのいずれかです。
  • UsedEleteMutation:この突然変異は、既存のイベントを削除します。

これらの関數(shù)のいずれかへの呼び出しは、別の関數(shù)を返します。返された関數(shù)は、均一なハンドラーとして機(jī)能します。

さて、先に進(jìn)み、Todo -2を両方の機(jī)能への呼び出しに置き換えます。

 const createUpdateEvent = usecreateupdatemutation(
  ペイロード、
  イベント、
  EventExists、
  ()=> closeModal()
);
const deleteevent = useletemutation(event、()=> closemodal());

これらは、React Apollo Hooksによって露出したUsemutationをラップするために書いたカスタムフックです。各フックは突然変異を作成し、突然変異変數(shù)をUsemutationクエリに渡します。 src/components/event/eventmutationhooks.jsで次のように見えるブロックが最も重要な部分です。

 usemutation(mutationType、{
  変數(shù):{
    データ
  }、
  更新:(キャッシュ、{データ})=> {
    const {eventslist} = cache.readquery({
      クエリ:events_Query
    });
    cache.writequery({
      クエリ:events_Query、
      データ: {
        イベントスリスト:transformcacheupdatedata(イベントスリスト、データ)
      }
    });
    // ..
  }
});

8ベースから耐久性のあるhttpトリガーを呼び出します

カレンダーアプリのサーバーレス構(gòu)造、データストレージ、UIレイヤーの構(gòu)築にかなりの時(shí)間を費(fèi)やしました。要約すると、UIはデータを8ベースにストレージ用に送信し、 8ベースはデータを保存し、耐久性のある関數(shù)httpトリガーをトリガーし、HTTPトリガーはオーケストレーションをキックし、殘りは歴史です?,F(xiàn)在、私たちは突然変異を使用してデータを保存していますが、8ベースのどこにもサーバーレス機(jī)能を呼び出していません。

8Baseを使用すると、カスタムロジックを作成できます。これにより、非常に強(qiáng)力で拡張可能なものがあります。カスタムロジックは、8ベースデータベースで実行されたアクションに基づいて呼び出される?yún)g純な関數(shù)です。たとえば、テーブルで突然変異が発生するたびに、呼び出されるロジックを設(shè)定できます。イベントが作成されたときに呼ばれるものを作成しましょう。

8ベースCLIをインストールすることから始めます。

 NPMインストール-G 8Base

カレンダーアプリプロジェクトで次のコマンドを?qū)g行して、スターターロジックを作成します。

 8ベースinit 8ベース

8Base initコマンド新しい8ベースロジックプロジェクトを作成します。この場(chǎng)合、8Baseロジックフォルダー、8ベースに名前を付けているディレクトリ名を渡すことができます。ねじれないでください。

トリガースケジューリングロジック

すべてを8base/srcで削除し、SRCフォルダーにtrigerschedule.jsファイルを作成します。それを行ったら、以下をファイルにドロップします。

 const fetch = require( 'node-fetch');

module.exports = async event => {
  const res = await fetch( '<http>'、{
    方法:「投稿」、
    ボディ:json.stringify(event.data)、
    ヘッダー:{'content-type': 'application/json'}
  })
  const json = await res.json();
  console.log(イベント、json)
  jsonを返します。
};</http>

GraphQL変異に関する情報(bào)は、イベントオブジェクトでデータとして利用できます。

を、関數(shù)を展開した後に得たURLに置き換えます。 Azure URLの関數(shù)に移動(dòng)し、[URLのコピー]をクリックすることでURLを取得できます。

また、Node-Fetchモジュールをインストールする必要があります。これにより、APIからのデータが取得されます。

 NPMインストール - 節(jié)約ノードフェッチ

8ベースロジック構(gòu)成

次に行うことは、このロジックをトリガーする必要がある正確な突然変異またはクエリを8ベースに伝えることです。私たちの場(chǎng)合、イベントテーブルに突然変異を作成します。この情報(bào)は8base.ymlファイルで説明できます。

関數(shù):
  トリガーシェード:
    ハンドラ:
      コード:src/triggerschedule.js
    タイプ:トリガー後
    操作:events.create

ある意味では、これは、イベントテーブルで作成された突然変異が発生したときに、突然変異が発生した後にSRC/Triggerschedule.jsに電話してください。

すべてのものを展開したいと思っています

何でも展開する前に、8Baseアカウントにログインする必要があります。これは、コマンドラインを介して行うことができます。

 8ベースログイン

次に、deployコマンドを?qū)g行して、ワークスペースインスタンスでアプリロジックを送信してセットアップします。

 8Base Deploy

フロー全體をテストします

すべての栄光でアプリを表示するには、カレンダーの日の1つをクリックしてください。フォームを含むイベントモーダルを取得する必要があります。それを記入して、將來の開始日を入れて、通知をトリガーします。私はそれよりも速く通知をトリガーできなかったので、現(xiàn)在から2?5分以上日付を試してください。

https://www.youtube.com/watch?v=simam4fxpoo&

ええ、あなたのメールをチェックしてください! SendGridのおかげでメールが屆くはずです。これで、イベントを作成し、イベントの提出の詳細(xì)を通知できるアプリがあります。

以上がねえ、&#039;はJamstackを使用して機(jī)能的なカレンダーアプリを作成しましたの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國(guó)語版

SublimeText3 中國(guó)語版

中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ロードスピナーとアニメーションを作成するためのCSSチュートリアル ロードスピナーとアニメーションを作成するためのCSSチュートリアル Jul 07, 2025 am 12:07 AM

CSSロード回転子を作成するには3つの方法があります。1。境界の基本回転子を使用して、HTMLとCSSを介してシンプルなアニメーションを?qū)g現(xiàn)します。 2。複數(shù)のポイントのカスタム回転子を使用して、異なる遅延時(shí)間を経てジャンプ効果を?qū)g現(xiàn)します。 3.ボタンに回転子を追加し、JavaScriptを介してクラスを切り替えて、読み込みステータスを表示します。各アプローチは、ユーザーエクスペリエンスを向上させるために、色、サイズ、アクセシビリティ、パフォーマンスの最適化などのデザインの詳細(xì)の重要性を強(qiáng)調(diào)しています。

CSSブラウザの互換性の問題とプレフィックスに対処します CSSブラウザの互換性の問題とプレフィックスに対処します Jul 07, 2025 am 01:44 AM

CSSブラウザの互換性とプレフィックスの問題に対処するには、ブラウザサポートの違いを理解し、ベンダーのプレフィックスを合理的に使用する必要があります。 1. FlexBoxやグリッドのサポート、位置:粘著性の無効、アニメーションのパフォーマンスなどの一般的な問題を理解することは異なります。 2. CANIUSE確認(rèn)機(jī)能サポートステータスを確認(rèn)します。 3. -webkit-、-moz-、-ms-、-o-およびその他のメーカーのプレフィックスを正しく使用します。 4.自動(dòng)的にプレフィックスを追加するためにAutoprefixerを使用することをお?jiǎng)幛幛筏蓼埂?5. PostCSSをインストールし、ターゲットブラウザを指定するようにBrowserSlistを構(gòu)成します。 6.建設(shè)中の互換性を自動(dòng)的に処理します。 7. Modernizr検出機(jī)能は、古いプロジェクトに使用できます。 8.すべてのブラウザの一貫性を追求する必要はありません、

CSSクリップパスでカスタムシェイプを作成します CSSクリップパスでカスタムシェイプを作成します Jul 09, 2025 am 01:29 AM

CSSのクリップパス屬性を作物要素に使用して、寫真やSVGに依存することなく、三角形、円形ノッチ、ポリゴンなどのカスタム形狀になります。その利點(diǎn)には、次のものが含まれます。1。円、楕円、ポリゴンなどのさまざまな基本的な形狀をサポートします。 2。レスポンシブ調(diào)整とモバイル端子に適応可能。 3.アニメーションが簡(jiǎn)単で、HoverまたはJavaScriptと組み合わせて動(dòng)的効果を?qū)g現(xiàn)できます。 4.レイアウトフローには影響せず、ディスプレイエリアのみを収穫します。一般的な使用法は、円形のクリップパス:円(50pxatcenter)および三角クリップパス:ポリゴン(50%0%、100 0%、0 0%)などです。知らせ

ディスプレイの違いは何ですか:インライン、ディスプレイ:ブロック、ディスプレイ:インラインブロック? ディスプレイの違いは何ですか:インライン、ディスプレイ:ブロック、ディスプレイ:インラインブロック? Jul 11, 2025 am 03:25 AM

Themaindifferencesbetweendisplay:インライン、ブロック、およびinline-blockinhtml/cssarelayoutbehavior、spaceusage、andstylingcontrol.1.inlineelementsflowwithtext、notstartonnewlines、nagrorewidth/height、height、andonlyhorizo??ntalpadddddddddddddddding

スタイリングは、CSSとは異なるリンクを訪問しました スタイリングは、CSSとは異なるリンクを訪問しました Jul 11, 2025 am 03:26 AM

アクセスしたリンクのスタイルを設(shè)定すると、特にコンテンツ集約型のWebサイトでユーザーエクスペリエンスを向上させることができ、ユーザーがより良いナビゲートを支援します。 1。CSSを使用してください:訪問した擬似クラスは、色の変化などの訪問されたリンクのスタイルを定義します。 2。ブラウザは、プライバシーの制限により、いくつかの屬性の変更のみを許可することに注意してください。 3.突然の狀態(tài)を避けるために、色の選択は全體的なスタイルと調(diào)整する必要があります。 4.モバイル端子はこの効果を表示しない場(chǎng)合があり、アイコン補(bǔ)助ロゴなどの他の視覚的なプロンプトと組み合わせることをお?jiǎng)幛幛筏蓼埂?/p>

CSSペイントAPIとは何ですか? CSSペイントAPIとは何ですか? Jul 04, 2025 am 02:16 AM

thecsspaintingapienablesdynamicimagegeneration incssusingjavascript.1.developerscreateapaintclasswithapaint()method.2.they registeritviaregisterpaint()

CSSを使用して応答性のある畫像を作成する方法は? CSSを使用して応答性のある畫像を作成する方法は? Jul 15, 2025 am 01:10 AM

CSSを使用してレスポンシブ畫像を作成するには、主に次の方法で達(dá)成できます。1。最大幅を使用してください:100%と高さ:自動(dòng)化して、割合を維持しながら畫像がコンテナ幅に適応できるようにします。 2。HTMLのSRCSETおよびサイズの屬性を使用して、異なる畫面に適合した畫像ソースをインテリジェントにロードします。 3.オブジェクトフィットとオブジェクトポジションを使用して、畫像のトリミングとフォーカスディスプレイを制御します。一緒に、これらの方法により、畫像がさまざまなデバイスで明確かつ美しく表示されるようになります。

一般的なCSSブラウザの矛盾とは何ですか? 一般的なCSSブラウザの矛盾とは何ですか? Jul 26, 2025 am 07:04 AM

さまざまなブラウザのCSS解析に違いがあるため、主にデフォルトのスタイルの違い、ボックスモデルの計(jì)算方法、フレックスボックスおよびグリッドレイアウトサポートレベル、および特定のCSS屬性の一貫性のない動(dòng)作を含む一貫性のないディスプレイ効果が得られます。 1.デフォルトのスタイル処理は一貫性がありません。解決策は、cssresetまたはremormize.cssを使用して初期スタイルを統(tǒng)合することです。 2。IEの古いバージョンのボックスモデル計(jì)算方法は異なります。 Box-Sizing:Border-Boxを統(tǒng)一された方法で使用することをお?jiǎng)幛幛筏蓼埂?3. FlexBoxとグリッドは、エッジの場(chǎng)合や古いバージョンでは異なる機(jī)能を示します。より多くのテストを行い、Autoprefixerを使用します。 4.一部のCSS屬性の動(dòng)作は一貫性がありません。 Caniuseは相談して格下げする必要があります。

See all articles