Oracle JET仮想DOMアプリケーションのデータ・レコードの更新
はじめに
このチュートリアルでは、Oracle JavaScript Extension Toolkit (Oracle JET)仮想DOMアプリケーションを使用して、既存のデータ・レコードを更新し、RESTサービスに送信する方法を示します。
目的
このチュートリアルでは、既存のデータ・レコードを更新してRESTサービスに送信する方法を学習します。
前提条件
- Node.jsのインストールを含むOracle JET仮想DOMアプリケーションを作成するように設定された開発環境
- Oracle JET仮想DOMアプリケーションでデータ・レコードを作成するためのフォームの作成この学習パスでの前のチュートリアルの完了
タスク1: フォーム情報を管理するためのコンポーネントの作成
レコードを更新する機能を起動するダイアログを表示する新規コンポーネントを作成します。
-
JET-Virtual-DOM-app/src/components/ActivityItem
ディレクトリに移動し、新しいEditItemDialog.tsx
ファイルを作成してエディタで開きます。 -
新しいコンポーネントのファンクション名(
EditItemDialog
)を定義するプレースホルダ・エントリを追加します。import { h } from "preact"; type Props = { message?: string; }; const EditItemDialog = (props: Props) => { return ( <div class="oj-web-applayout-max-width oj-web-applayout-content"> <p>content</p> </div> ); }; export default EditItemDialog;
タスク2: ダイアログを開く処理
ItemActionsContainer
コンポーネントでタイプおよび関数を宣言し、レコードを更新する機能を含むEditItemDialog
コンポーネントを起動します。
-
JET-Virtual-DOM-app/src/components/ActivityItem
ディレクトリに移動し、ItemActionsContainer.tsx
ファイルを開きます。 -
ファイルの上部で、
useState
およびuseEffect
Preactフックをインポートし、EditItemDialog
コンポーネントを使用するために必要なProps
型の別名に追加のプロパティを定義してから、Item
型の別名を定義します。import { h } from "preact"; import "ojs/ojbutton"; import { useState, useEffect } from "preact/hooks"; type Props = { create: () => void; edit: () => void; itemSelected: Partial<Item>; }; type Item = { id: number; name: string; short_desc?: string; price?: number; quantity?: number; quantity_shipped?: number; quantity_instock?: number; activity_id?: number; image?: string; };
-
return
文の前に、インポートしたPreactフックを使用して、アクティビティ・アイテムが選択されているかどうかを確認します。const ItemActionsContainer = (props: Props) => { const [hideActions, setHideActions] = useState<boolean>(true); if (props.itemSelected?.id) { console.log("Selected: " + JSON.stringify(props.itemSelected)); } useEffect(() => { if (props.itemSelected?.id) { setHideActions(false); } else { setHideActions(true); } }, [props.itemSelected]); return (
-
return
文で、edit
プロパティを参照するonojAction
属性を持つ新しいoj-button
要素を追加します。const ItemActionsContainer = (props: Props) => { return ( <div> <oj-button id="createButton" onojAction={props.create}>Create</oj-button> <oj-button id="updateButton" disabled={hideActions} onojAction={props.edit}>Update</oj-button> </div>
ItemActionsContainer.tsx
ファイルを保存します。コードはItemActionsContainer.tsx.txt
のようになります。 -
EditItemDialog.tsx
ファイルの上部で、Oracle JETダイアログ・コンポーネントのモジュール、およびuseRef
、useEffect
、MutableRef
およびuseState
Preactフックのモジュールをインポートします。import { h } from "preact"; import { useRef, useEffect, useState, MutableRef } from "preact/hooks"; import "ojs/ojdialog"; import { ojDialog } from "ojs/ojdialog";
-
Props
型の別名で、次のプロパティを作成します。type Props = { isOpened: boolean; closeDialog: (ref: MutableRef<ojDialog>, type: string) => void; editItem: (data: Partial<Item>, ref: MutableRef<ojDialog>) => void; itemData: Partial<Item>; };
-
return
文で、既存のdiv
要素を、oj-dialog
カスタム要素をラップするspan
要素に置き換えます。return ( <span> <oj-dialog id="editDialog" ref={editDialogRef as MutableRef<ojDialog>} dialogTitle="Update Item Details" onojClose={closeDialog} cancelBehavior="icon"> <div slot="body"> <oj-label-value labelEdge="inside"> <oj-label for="itemid" slot="label"> Item ID </oj-label> <div id="itemid" slot="value" class="slot-line"> {editFormData?.id} </div> </oj-label-value> <oj-form-layout> <oj-input-text id="name" labelHint="Name" onvalueChanged={onChangeHandler} value={editFormData?.name}></oj-input-text> <oj-input-text id="price" labelHint="Price" onvalueChanged={onChangeHandler} value={editFormData?.price}></oj-input-text> <oj-input-text id="short_desc" labelHint="Description" onvalueChanged={onChangeHandler} value={editFormData?.short_desc}></oj-input-text> </oj-form-layout> </div> <div slot="footer"> <oj-button id="submitBtn" onojAction={editItem}> Submit </oj-button> </div> </oj-dialog> </span> );
-
return
文の前に、属性値がoj-dialog
カスタム要素参照の子カスタム要素にあるメソッドを追加します。たとえば、onChangeHandler
メソッドは、oj-input-text
コンポーネントがonvalueChanged
属性を使用して変更を検出したときにコールされます。const EditItemDialog = (props: Props) => { const editDialogRef = useRef<ojDialog>(); const [editFormData, setEditFormData] = useState<Partial<Item>>({}); const onChangeHandler = (event: any) => { if (event.detail.updatedFrom === "internal") { setEditFormData({ ...editFormData, [event.currentTarget.id]: event.detail.value, }); } }; const closeDialog = () => { props.closeDialog(editDialogRef as MutableRef<ojDialog>, "edit"); }; const editItem = () => { console.log("data: " + JSON.stringify(editFormData)); props.editItem(editFormData, editDialogRef as MutableRef<ojDialog>); }; useEffect(() => { setEditFormData(props.itemData); props.isOpened ? editDialogRef.current?.open() : editDialogRef.current?.close(); }, [props.isOpened]); return (
-
EditItemDialog
関数の宣言の前に、更新してRESTサービスに送信するデータのフィールドを含むItem
型の別名を定義します。type Item = { id: number; name: string | undefined; short_desc?: string; price?: number; quantity?: number; quantity_shipped?: number; quantity_instock?: number; activity_id?: number; image?: string; }; const EditItemDialog = (props: Props) => {
EditItemDialog.tsx
ファイルを保存します。コードはEditItemDialog.tsx.txt
のようになります。
タスク3: EditItemDialogコンポーネントの消費
-
ActivityItemContainer.tsx
ファイルを開き、最後のタスクで作成したEditItemDialog
コンポーネントに加えて、PreactのMutableRef
フックと、DialogコンポーネントのOracle JETモジュールをインポートします。import { useState, useCallback, MutableRef, useRef } from "preact/hooks"; import EditItemDialog from "./EditItemDialog";
-
Props
型の別名で、data
のエントリを更新してRESTDataProvider
のany
型をサポートし、コンポーネントで使用されなくなったActivityItem
型を削除またはコメント・アウトします。type Props = { data?: RESTDataProvider<any, any>; selectedActivity: Item | null; onItemChanged: (item: Item) => void; }; // type ActivityItem = { // id: number; // name: string; // items: Array<Item>; // short_desc: string; // image: string; // };
-
return
文で、ItemActionsContainer
要素をitemSelected
およびedit
属性値で更新します。CreateNewItemDialog
要素の後に、インポートしたEditItemDialog
コンポーネントに新しい要素を追加します。<div id="container"> <h3>Activity Items</h3> <ItemActionsContainer create={openCreateDialog} itemSelected={activityItemValue} edit={openEditDialog} /> . . . </div> <CreateNewItemDialog isOpened={isCreateOpened} createNewItem={createItem} closeDialog={handleDialogClose} /> <EditItemDialog isOpened={isEditOpened} editItem={editItem} closeDialog={handleDialogClose} itemData={itemData} /> . . .
-
return
文の前に、編集ダイアログを開くopenEditDialog
関数と、更新されたアクティビティ・アイテムをRESTサービスに送信するeditItem
関数を追加します。const openEditDialog = () => { console.log("Item: " + JSON.stringify(itemData)); setIsEditOpened(true); console.log("Edit dialog opened"); }; const editItem = async (newItemData:Partial<Item>, editDialogRef = useRef<ojDialog>()) => { if (newItemData != null) { const row = { itemId: newItemData.id, name: newItemData.name, price: newItemData.price, short_desc: newItemData.short_desc, }; // Create and send request to update row on rest service const request = new Request(`${restServerURLItems}${itemData.id}`, { headers: new Headers({ "Content-type": "application/json; charset=UTF-8", }), body: JSON.stringify(row), method: "PUT", }); const response = await fetch(request); const updatedRow = await response.json(); // Create update mutate event and call mutate method // to notify dataprovider consumers that a row has been // updated const updatedRowKey = itemData.id; const updatedRowMetaData = { key: updatedRowKey }; props.data?.mutate({ update: { data: [updatedRow], keys: new Set([updatedRowKey]), metadata: [updatedRowMetaData], }, }); } // End if statement console.log("Edited item"); editDialogRef.current?.close(); };
ActivityItemContainer.tsx
ファイルを保存します。コードはActivityItemContainer.tsx.txt
のようになります。
タスク4: コードのテストおよびレコードの更新
-
ターミナル・ウィンドウで、
JET-Virtual-DOM-app
ディレクトリに移動し、仮想DOMアプリケーションを実行します。npx ojet serve
- ブラウザで、仮想DOMアプリケーションの動的変更を表示します。
- 仮想DOMアプリケーションで、Baseballアクティビティをクリックし、SureFire Ball (Set of 4)アイテムをクリックします。
-
[更新]ボタンをクリックします。
「品目詳細の更新」ダイアログ・ボックスが表示されます。
-
価格を
20.5
から21
に変更し、「発行」をクリックします。セクションがリフレッシュされ、品目の価格が更新されました。
- 実行中の仮想DOMアプリケーションを表示するブラウザ・ウィンドウまたはタブを閉じます。
- ターミナル・ウィンドウでCtrl+Cを押し、プロンプトが表示されたら、
y
と入力してOracle JETツール・バッチ・ジョブを終了します。
次のステップ
このチュートリアルは、「RESTサービスを使用したCRUD操作」モジュールの一部です。
- Oracle JETによるREST APIからのデータのフェッチ
- Oracle JET仮想DOMアプリケーションでデータ・レコードを作成するためのフォームの作成
- Oracle JET仮想DOMアプリケーションでのデータ・レコードの更新
- Oracle JET仮想DOMアプリケーションでのデータ・レコードの削除
仮想DOM学習パスのメイン・ページに戻ると、仮想DOMアプリケーションの構築に関するすべてのモジュールにアクセスできます。
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Update data records in an Oracle JET virtual DOM app
F70660-02