実現したいこと
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};

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。