質問するログイン新規登録
Remix

Remix(旧browser-solidity)は、Ethereumの独自トークン及びスマートコントラクトを開発するための統合開発環境。コード編集からブロックチェーンへのデプロイが可能です。ソースコードはGitHubで取得でき、オープンソースで開発されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

101閲覧

【Remix】外部スクリプトを読み込んでクライアント側でその関数を実行したい

user202102

総合スコア12

Remix

Remix(旧browser-solidity)は、Ethereumの独自トークン及びスマートコントラクトを開発するための統合開発環境。コード編集からブロックチェーンへのデプロイが可能です。ソースコードはGitHubで取得でき、オープンソースで開発されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2025/08/01 10:52

編集2025/08/02 08:26

0

0

実現したいこと

Remixを使用したプロジェクトにて、外部javascriptを読み込み
default export内でそのjavascript内の関数を実行、更にそのままFormのバリデーションを行いたいです。バリデーションはconformを使っています。

発生している問題・分からないこと

外部Javascriptの実行やその後のバリデーション実行、actionメソッドへの渡し方の流れがわからないです。

該当のソースコード

typescript

1export const handle: ExternalScriptsHandle = { 2 scripts: [ 3 { 4 src: "https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js", 5 async: true, 6 }, 7 ], 8}; 9 10export default function User { 11 const actionData = useActionData<typeof action>(); 12 const [form, fields] = useForm({ 13 lastResult: actionData?.lastResult, 14 onValidate({ formData }) { 15 return parseWithZod(formData, { schema: UserSchema }); 16 }, 17 shouldValidate: "onBlur", 18 shouldRevalidate: "onBlur", 19 }); 20 21 return ( 22 //省略 23 <UserForm 24 // 色々引数 25 // 色々引数 26 form={form} 27 fields={fields} 28 > 29 ); 30}

typescript

1export default function UserForm(割愛){ 2 3 //色々割愛 4 <Form method="PUT" {...getFormProps(form)}> 5 <BootstrapForm.Control 6 className={clsx({ "is-invalid": fields.user_id.errors })} 7 autoComplete="user_id" 8 placeholder="•••• •••• •••• ••••" 9 {...getInputProps(fields.user_id, { type: "text" })} 10 /> 11 <BootstrapForm.Control.Feedback type="invalid">{fields.user_id.errors}</BootstrapForm.Control.Feedback> 12 </Form> 13}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

javascriptの読み込みはExternalScriptsHandleを使用して、body内で読み込むまでは完了しています。
(以下をdefault exportのファイルに記述済み)

export const handle: ExternalScriptsHandle = { scripts: [ { src: "https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js", async: true, }, ], };

補足

useFormでonSubmitを指定するとバリデーション後に実行される関数を指定できるとのことで、以下まで書いてみました。こちらで値設定、エラーハンドリングができる方法があればこちらでの解決法をご教示ください。

tsx

1const [form, fields] = useForm({ 2 lastResult: actionData?.lastResult, 3 onValidate({ formData }) { 4 return parseWithZod(formData, { schema: UserSchema }); 5 }, 6 shouldValidate: "onBlur", 7 shouldRevalidate: "onBlur", 8 onSubmit: afterDoing, 9}); 10 11async function afterDoing() { 12 if (typeof window !== "undefined" && (window as any)._?.shuffle) { 13 const shuffled = (window as any)._?.shuffle([1, 2, 3, 4]); 14 setResult(`シャッフル結果: ${shuffled.join(", ")}`); 15 } else { 16 setResult("lodash がまだロードされていないか、関数が見つかりません"); 17 } 18 19 // TODO:ここで値セットできるか? 20 // TODO:エラー対応もしたい、エラー設定方法は? 21};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

e.preventDefaultの追加とUseStateを使用して手動でエラーメッセージを設定するようにしました。

tsx

1const [lastResult, setLastResult] = useState(actionData?.lastResult ?? null); 2 3onSubmit: async (e, context) => { 4 e.preventDefault(); 5 const { submission, formData } = context; 6 if (!submission) return; 7 if (typeof window !== "undefined" && (window as any)._?.shuffle) { 8 const shuffled = (window as any)._?.shuffle([1, 2, 3, 4]); 9 setResult(`シャッフル結果: ${shuffled.join(", ")}`); 10 } else { 11 setLastResult("lodash がまだロードされていないか、関数が見つかりません"); 12 return; 13 } 14 15 submit(formData, {method: "POST"}); 16};

投稿2025/08/03 23:08

user202102

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問