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

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

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

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

TypeScript

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

Q&A

解決済

1回答

1119閲覧

typescriptでuseStateを関数の引数に渡したい

yutadd

総合スコア18

Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

TypeScript

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

0グッド

0クリップ

投稿2022/11/08 03:16

編集2022/11/08 03:58

前提

TypeScriptでuseStateのXXX及びsetXXXを別の関数オブジェクトに引数として渡す処理をいくつか書いて試している際、

渡し手:

typescript

1function App(){ 2const [left,setLeft]=useState(<></>); 3Left1(setTest);

受け取り手:

typescript

1function Left1(setTest:(value: React.SetStateAction<JSX.Element>) => void){ 2setTest(<></>);

コンパイルエラーは発生しませんでしたが、ブラウザで確認すると上のコードの一行下のエラーが発生しないであろう行をエラー発生源として表示し、処理が中断されていました。
念のため、そのエラー発生源として指摘された部分を削除してみたところ、そのまた一行下のエラーが発生していなかった行がエラーとして指摘されたためコンソールのエラー出力のミスだと思い、一番怪しい処理を今回質問内容として投稿しました

error

1Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 21. You might have mismatching versions of React and the renderer (such as React DOM) 32. You might be breaking the Rules of Hooks 43. You might have more than one copy of React in the same app

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

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

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

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

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

maisumakun

2022/11/08 03:36

> ブラウザで確認するとエラーが発生していて、処理が中断されていました。 そのコードが原因だと、どのように確認しましたか?
yutadd

2022/11/08 03:46

すみません、たしかにエラーの発生源として、スタックトレースに指摘される部分は、実際のコードのsetText(<></>)の一行下と指摘されますが、その該当業を消すとまたそのひとつ下の行が指摘されるため、エラーの表示ズレだと推測し、一番怪しい処理を今回質問として記載しました。
maisumakun

2022/11/08 04:40

Left1は通常の関数でしょうか、それとも関数コンポーネントでしょうか?
maisumakun

2022/11/08 04:41

> その該当業を消すとまたそのひとつ下の行が指摘されるため もしかして、当該の2行はuse***の呼び出しではありませんか?
yutadd

2022/11/08 04:55

はい、そのとおりでございます。 しかし、この2行は元々エラーが出ていない行でして、この受け渡しの処理をすることで、エラー発生源としてマークされました
yutadd

2022/11/08 05:05

function Left1(){と定義し、Left1(setText)という形で利用呼び出ししています。 しかし、呼び出しのみで、帰り値を domに追加する処理はまだ書いていません。
guest

回答1

0

ベストアンサー

しかし、この2行は元々エラーが出ていない行でして、この受け渡しの処理をすることで、エラー発生源としてマークされました

そのエラー表示は全く正しいです。

Hookの使われた関数コンポーネントを、Left1(setTest)のように普通の関数として呼び出すことはできません。setStateとは全く関係なく、関数コンポーネントの使い方の問題です。

投稿2022/11/08 05:04

編集2022/11/08 05:05
maisumakun

総合スコア146018

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

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

maisumakun

2022/11/08 05:07

> Left1(setText)という形で利用呼び出ししています。 その使い方が正しくありません。<Left1 />のように、JSXから呼んでください。
yutadd

2022/11/08 05:19 編集

すみません、ありがとうございます、移動後修正してみます。 呼び出し方は<Left1 setTest={setTest}/>このような形でよろしいでしょうか。
maisumakun

2022/11/08 05:18

関数コンポーネントの引数はオブジェクトで来ます。コンポーネントサイドで、{}でspreadする、プロパティ参照するなどが必要です。
yutadd

2022/11/08 05:56

すみません、スプレッド構文をオブジェクトとして渡された関数にどのように使うのかわかりません。 とりあえず、 呼び出し側を<Left1 st={setTest} /> 受け取り側をfunction Left1(setTest: (value: React.SetStateAction<JSX.Element>) => void){ に変更したところ、呼び出し側でコンパイルエラー``` error '{ st: Dispatch<SetStateAction<Element>>; }' を型 'IntrinsicAttributes & ((value: SetStateAction<Element>) => void)' に割り当てることはできません。 プロパティ 'st' は型 'IntrinsicAttributes & ((value: SetStateAction<Element>) => void)' に存在しません。ts(2322) ```が発生しました。
maisumakun

2022/11/08 06:01

function Left1(setTest: (value: React.SetStateAction<JSX.Element>)という引数が間違いです。 この場合、関数コンポーネントの引数には{st: setStateの関数}のようなオブジェクトが渡されますので、オブジェクトまるごと受け取ってstプロパティを使うなり、spreadするなりしてください。
yutadd

2022/11/08 06:57 編集

すみません、 オブジェクトとして受け渡しするために、以下のように修正してみたところ、エラーが発生しました 渡し手を export type Props={ st:type; } function App(){ const [left,setLeft]=useState(<></>); var props:Props={st:setTest}; <Left1 value={props} /> 受け取り手を import Props from "../App" function Left1(value:Props){ value.st(<></>); とすると、受け取り手の2行目で'Props' は値を参照していますが、ここでは型として使用されています。'typeof Props' を意図していましたか?ts(2749)とエラーが起き、 受け取り手2行目をfunction Left1(value:any){にすると、コンパイルエラーは起きませんが、ブラウザーで開いた際、st is not a functionと出てきて処理が中断されてしまいます。
maisumakun

2022/11/08 06:59

渡す側では st={setTest}の書き方で問題ありません。オブジェクトに詰めるのはReact内部で行われます。
yutadd

2022/11/08 07:18 編集

大変ありがとうございました! おっしゃる通り、 function App(){ const [XXX,setXXX]=useState(<></>) return(<Left1 setXXX={setXXX} />) } function Left1(value:any){ value.setXXX(<></>) } とすることで解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問