質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1561閲覧

Next.jsのreact-hook-formが動作しない...

ts21

総合スコア32

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/05/17 16:20

編集2021/05/18 01:26

やりたいこと

こんにちは!Next.js+tsでtsxを書いています。関数コンポーネントを使ってフォーム内にIDを入力し、送信ボタンを押すと、ある外部のヘルパーが呼び出される実装を考えています。
このIDの入力が存在すれば、ヘルパーが起動する方針です。
(helper.jsはあるサービスにデータを渡すモーダルが出力される機能を提供しています)

具体的にやりたいことは次の2つです

1.onSubmit内でpublicIdのstateを触りたい
2.HelperにpublicIdを渡したい

実装方法

1.→onSubmitのタイミングでid = true にして、ヘルパーを立ち上げる
2.→このときに、idをHelperに渡す

やったこと

IDの有無に関わらず、「ヘルパーを出力する」を押すと、「IDが見つかりません」というエラーメッセージがhelper.jsのモーダルとして現れました。
1.→デベロッパーツールで確認すると、idが渡っていないことが確認できた
2.→Helperのstateも変更されていない様子

できていいないこと&所感

1→onsubmitで id = true になっていない
2 →Helperにidを渡せていない...getvalueとregisterを訂正する必要あり?

ソースコード

Typescript

1import { ReactElement, useEffect, useState } from 'react' 2import { useForm } from 'react-hook-form' 3 4function Opener(): ReactElement { 5 const { handleSubmit, getValues, register } = useForm() 6 const [isOpen, setIsOpen] = useState(false) 7 8 const onSubmit = (): void => { 9 setIsOpen(true) 10 } 11 12 return ( 13 <div> 14 {{ isOpen } && <Helperid={getValues()}></Helper>} 15 <div className="relative top-10"> 16 <div className="text-center"> 17 <div className="relative mt-4 pt-2"> 18 {/* //このタイミングでpublicIdをuseStateしたい */} 19 <form onSubmit={handleSubmit(onSubmit)}> 20 <input className="pl-4 w-full focus:outline-blue bg-transparent h-14" /> 21 <input 22 {...register} 23 type="submit" 24 value="ヘルパーを開く" 25 className="opener" 26 /> 27 </form> 28 </div> 29 </div> 30 </div> 31 </div> 32 ) 33} 34 35function Helper(props: { id: string }): null { 36 const { id } = props 37 useEffect(() => { 38 const existingScript = document.getElementById('hoge_ul') 39 if (!existingScript) { 40 const script = document.createElement('script') 41 script.src = 'https://helper.test.hogehoge.io/v2/helper.js' 42 script.id = 'helper_ul' 43 document.body.appendChild(script) 44 script.onload = () => { 45 const data = new Data({ 46 id: { id }, 47 openerSelector: '.opener', 48 }) 49 } 50 }, []) 51 return null 52} 53 54export default Helper 55

ここ1週間でNext.jsを触り始めたので、よくわかっていないことが多いです。。
Helper関数は問題がないと思ってますが、何か間違えている点をご指摘いただければ幸いです

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

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

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

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

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

hoshi-takanori

2021/05/17 19:33

Next.js や react-hook-form はよく分かりませんが、React 的には getElementById を使うのは良くないですね。というか、この helper.js ってどういうものですか?
ts21

2021/05/18 00:24

なるほど、それはどのような理由からでしょうか? helper.jsはあるサービスにデータを渡すモーダルが出力される機能を提供しています
hoshi-takanori

2021/05/18 00:54

React が仮装 DOM という技術を使ってるからです。 https://qiita.com/seira/items/6767e222890c9890ecb9 モーダルの出力というのが、createElement したものを appendChild する方法で実装されているなら、それが React の環境でうまく動くような調整が必要になると思います。
ts21

2021/05/18 01:22

ありがとうございます 「普通のhtmlではないため、getElementById、などでinput要素を取ることができない」ということですね ボタンを押したタイミングでモーダルの出力はできているので機能としてはデータを渡す方法を考えるだけだと思っていました
guest

回答1

0

自己解決

useFormではregisterをgetElementByIdのように使用する必要がありました

投稿2021/05/23 09:57

ts21

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問