useStateフックの更新時にコンポーネントが再レンダリングされない

タムコットン
export default function SearchPage() {
    const [searchString, setSearchString] = React.useState("");
    const [apiCall, setApiCall] = React.useState<() => Promise<Collection>>();
    const {isIdle, isLoading, isError, error, data} = useApi(apiCall);
    const api = useContext(ApiContext);

    useEffect(()=>console.log("APICall changed to", apiCall), [apiCall]);

    const doSearch = (event: React.FormEvent) => {
        event.preventDefault();
        setApiCall(() => () => api.search(searchString));
    };

    const doNext = () => {
        var next = api.next;
        if (next) {
            setApiCall(()=>(() => next)());
        }
        window.scrollTo(0, 0);
    }

    const doPrev = () => {
        if (api.prev) {
            setApiCall(() => api.prev);
        }
        window.scrollTo(0, 0);
    }

    return (
        <>
            <form className={"searchBoxContainer"} onSubmit={doSearch}>
                <TextField
                    label={"Search"}
                    variant={"filled"}
                    value={searchString}
                    onChange={handleChange}
                    className={"searchBox"}
                    InputProps={{
                        endAdornment: (
                            <IconButton onClick={() => setSearchString("")}>
                                <ClearIcon/>
                            </IconButton>
                        )
                    }}
                />
                <Button type={"submit"} variant={"contained"} className={"searchButton"}>Go</Button>
            </form>

            {
                (isIdle) ? (
                    <span/>
                ) : isLoading ? (
                    <span>Loading...</span>
                ) : isError ? (
                    <span>Error: {error}</span>
                ) : (
                    <Paper className={"searchResultsContainer"}>
                        <Box className={"navButtonContainer"}>
                            <Button variant={"contained"}
                                    disabled={!api.prev}
                                    onClick={doPrev}
                                    className={"navButton"}>
                                {"< Prev"}
                            </Button>
                            <Button variant={"contained"}
                                    disabled={!api.next}
                                    onClick={doNext}
                                    className={"navButton"}>
                                {"Next >"}
                            </Button>
                        </Box>
                        <Box className={"searchResults"}>
                            {
                                data && data.items().all().map(item => (
                                    <span className={"thumbnailWrapper"}>
                                    <img className={"thumbnail"}
                                         src={item.link("preview")?.href}
                                         alt={(Array.from(item.allData())[0].object as SearchResponseDataModel).title}/>
                                </span>
                                ))
                            }
                        </Box>
                        <Box className={"navButtonContainer"}>
                            <Button variant={"contained"}
                                    disabled={!api.prev}
                                    onClick={doPrev}
                                    className={"navButton"}>
                                {"< Prev"}
                            </Button>
                            <Button variant={"contained"}
                                    disabled={!api.next}
                                    onClick={doNext}
                                    className={"navButton"}>
                                {"Next >"}
                            </Button>
                        </Box>
                    </Paper>
                )
            }
        </>
    )
}

さまざまな理由で、自分の状態に関数が保存されています(react-queryライブラリで使用するためのものです)。ただし、更新しようとすると、非常に奇妙な動作が見られます。いずれかの場合にはdoSearchdoNext、またはをdoPrev呼ばれて、それが成功した状態を更新-useEffectフックが適切に発射され、私は、コンソールにメッセージを見ることができます-しかし、ウィンドウが失われ、フォーカスを取り戻すまでには再レンダリングトリガではないです。

この問題で私が見た他のほとんどの人は、配列をその状態で格納し、新しい配列を作成するのではなく配列を更新しているので、フックはそれを新しいオブジェクトとして扱わず、再レンダリングします起こりません。配列は使用していませんが、関数を使用しており、さまざまな関数オブジェクトを渡しています。私は絶対に困惑していて、何が起こっているのか分かりません。

編集:レンダリングが起動に失敗したのではないようですが、クエリフックは入力が変更されたことに気づいていませんか?上記のコードを編集して関数全体を表示しました。カスタムフックは以下のとおりです。

function useApi(func?: () => Promise<Collection>) {
    return useQuery(
        ["doApiCall", func],
        func || (async () => await undefined),
        {
            enabled: !!func,
            keepPreviousData: true
        }
    )
}
TkDodo

queryKeyに関数を入れることはできません。キーはシリアル化可能である必要があります。参照:https//react-query.tanstack.com/guides/query-keys#array-keys

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

useState()フックはコンポーネントの再レンダリングを引き起こさないため、子も更新されません

分類Dev

React + Redux:状態の変化時にコンポーネントが再レンダリングされない

分類Dev

状態の変更時に兄弟コンポーネントが再レンダリングされない(useEffect、useState、およびContextを使用)

分類Dev

Reactフック:親コンポーネントが再レンダリングされない

分類Dev

ReactJS-コンポーネントの再レンダリング時にインラインスタイルが更新されない

分類Dev

FramerPreviewの更新時に機能コンポーネントデータが再レンダリングされない

分類Dev

Reactコンポーネントが状態変更時に再レンダリングされない

分類Dev

状態変化時にReact / Reduxコンポーネントが再レンダリングされない

分類Dev

子コンポーネントの再レンダリングをトリガーしないuseStateフックを反応させる

分類Dev

reduxストアが更新されず、コンポーネントが再レンダリングされない

分類Dev

useStateフックが状態を変更したときにReact.jsコンポーネントが子を再レンダリングしない

分類Dev

redux状態の変更時にreactjsプレゼンテーションコンポーネントが再レンダリングされない

分類Dev

更新時にOmrefカーソルがコンポーネントを再レンダリングしない

分類Dev

ボタンのクリック時にコンポーネントがレンダリングされない - ReactJS

分類Dev

コンポーネントは状態の更新時に再レンダリングされません

分類Dev

Reduxストアを更新した後、コンポーネントが再レンダリングされない

分類Dev

コンストラクターで作成された要素は、コンポーネントの再レンダリング時に更新されません

分類Dev

useStateフックを使用して小道具が変更されても、コンポーネントは再レンダリングされません

分類Dev

ラップされたコンポーネントがHOCで再レンダリングされない

分類Dev

Reactjs:子コンポーネントがデータの変更時に再レンダリングされないのはなぜですか?

分類Dev

onChangeイベント後にコンポーネントが再レンダリングされない

分類Dev

状態が更新されたときにコンポーネントの再レンダリングに反応しないのはなぜですか?

分類Dev

状態の変化時にReactNativeコンポーネントが再レンダリングされないのはなぜですか

分類Dev

Vue-メソッドでデータを更新するときにコンポーネントが再レンダリングされない

分類Dev

React Native-状態フックが更新され、コンポーネントが再レンダリングされますが、何も表示されません

分類Dev

ネストされた監視可能な変更時にコンポーネントが再レンダリングされない

分類Dev

React Native:Array.map()ベースのレンダリングされたコンポーネントが状態の変化時に更新されない

分類Dev

再レンダリング時にカスタムフックの状態が更新されない反応

分類Dev

Reactのコンポーネントクリックメソッドがレンダリング時にトリガーされるのはなぜですか?

Related 関連記事

  1. 1

    useState()フックはコンポーネントの再レンダリングを引き起こさないため、子も更新されません

  2. 2

    React + Redux:状態の変化時にコンポーネントが再レンダリングされない

  3. 3

    状態の変更時に兄弟コンポーネントが再レンダリングされない(useEffect、useState、およびContextを使用)

  4. 4

    Reactフック:親コンポーネントが再レンダリングされない

  5. 5

    ReactJS-コンポーネントの再レンダリング時にインラインスタイルが更新されない

  6. 6

    FramerPreviewの更新時に機能コンポーネントデータが再レンダリングされない

  7. 7

    Reactコンポーネントが状態変更時に再レンダリングされない

  8. 8

    状態変化時にReact / Reduxコンポーネントが再レンダリングされない

  9. 9

    子コンポーネントの再レンダリングをトリガーしないuseStateフックを反応させる

  10. 10

    reduxストアが更新されず、コンポーネントが再レンダリングされない

  11. 11

    useStateフックが状態を変更したときにReact.jsコンポーネントが子を再レンダリングしない

  12. 12

    redux状態の変更時にreactjsプレゼンテーションコンポーネントが再レンダリングされない

  13. 13

    更新時にOmrefカーソルがコンポーネントを再レンダリングしない

  14. 14

    ボタンのクリック時にコンポーネントがレンダリングされない - ReactJS

  15. 15

    コンポーネントは状態の更新時に再レンダリングされません

  16. 16

    Reduxストアを更新した後、コンポーネントが再レンダリングされない

  17. 17

    コンストラクターで作成された要素は、コンポーネントの再レンダリング時に更新されません

  18. 18

    useStateフックを使用して小道具が変更されても、コンポーネントは再レンダリングされません

  19. 19

    ラップされたコンポーネントがHOCで再レンダリングされない

  20. 20

    Reactjs:子コンポーネントがデータの変更時に再レンダリングされないのはなぜですか?

  21. 21

    onChangeイベント後にコンポーネントが再レンダリングされない

  22. 22

    状態が更新されたときにコンポーネントの再レンダリングに反応しないのはなぜですか?

  23. 23

    状態の変化時にReactNativeコンポーネントが再レンダリングされないのはなぜですか

  24. 24

    Vue-メソッドでデータを更新するときにコンポーネントが再レンダリングされない

  25. 25

    React Native-状態フックが更新され、コンポーネントが再レンダリングされますが、何も表示されません

  26. 26

    ネストされた監視可能な変更時にコンポーネントが再レンダリングされない

  27. 27

    React Native:Array.map()ベースのレンダリングされたコンポーネントが状態の変化時に更新されない

  28. 28

    再レンダリング時にカスタムフックの状態が更新されない反応

  29. 29

    Reactのコンポーネントクリックメソッドがレンダリング時にトリガーされるのはなぜですか?

ホットタグ

アーカイブ