フックの状態が自動的に更新されない

Kloc2243

Reactでページネーションを作成したかったのです。すべてのデータはストアから取得されます。このコードでは、検索エンジンを実装したいと思いました。今回は持っていませんが、それをシミュレートする検索方法を書きました。OK、動作しますが、[こんにちは]をクリックすると、カテゴリ2のアイテムのみが表示されますが、常に同じページ(私の場合は3)が表示されます。2回以上クリックすると、1ページしか表示されません。このフックは自動的に更新されないため、setCountItemsとsetPagesを検索に追加しました。

import React, { useEffect, useState, useRef } from 'react'
import { connect} from 'react-redux'
import Article from './article'

const ArticlesContainer = ({ articles }) => {
    const [allItems, setAllItems] = useState(articles.list);
    const [pageNumber, setPageNumber] = useState(1);
    const [perSite, setPerSite] = useState(10);
    const [totalItems, setCountItems] = useState(allItems.length);
    const from = (pageNumber - 1) * perSite;
    const to = ((pageNumber - 1) * perSite) + perSite;
    const [pages, setPages] = useState(Math.ceil(totalItems / perSite));

    const handlePageClick = (i) => {
        setPageNumber(i);
    }
    const search = () => {
        setAllItems(allItems.filter(x => x.category=== 2 ));
        setCountItems(allItems.length);
        setPages(Math.ceil(totalItems / perSite));

    }



    const Pagination = ({pages}) => {
        let list = []
        for(let i = 1; i<=pages; i++){
            list.push(<li key={i} onClick={() => handlePageClick(i)}>{i}</li>)
        }
        return list;
    }

    return (
        <React.Fragment>
            <a onClick={search}>Hello</a>
            {allItems.slice(from, to).map(article =>
                <Article key={article.id} article={article} />
            )}
            <div className="row">
                <ul>
                    <Pagination pages={pages} />
                </ul>
            </div>
        </React.Fragment>
    );
}
const mapStateToProps = state => ({
    articles: state.articles
})

export default connect(mapStateToProps, null)(ArticlesContainer);

問題はどこにありますか?

ロビン・ジーモンド

あなたは、ReactでStateがどのように機能するかについての一般的な誤解に苦しんでいるようです。this.setStateクラス内またはuseStateフックによって返される「更新関数」を介して状態を更新しても、関連する状態値が「自動的に」変更されることはありません。クラスコンポーネントでは、これはReactの実装がどのように機能するかsetState(非同期)によるものですが、フックを使用すると、それについて考えるのをやめれば完全に明白になるはずです。setAllItemsは関数allItemsですが、は配列です-そしてそれらは互いに直接関係することは何もありません。呼び出しsetAllItemsてもallItems-の値は変更されませんallItemsは単なる変数であり、新しい値を与える唯一の方法は、直接変更または再割り当てすることです。明らかに別の関数を呼び出します。setAllItems、そうではない引数を使用するとallItems、おそらくそれを行うことはできません。

代わりに、コンポーネントの再レンダリングをスケジュールします。つまり、コンポーネントを表す関数の後続の呼び出しをスケジュールし、にuseState対応する呼び出しallItemsが設定した値を返すようにします。しかし、これは必然的にかなり間接的なプロセスです。特に、コンポーネントの次のレンダリングでallItems必要な値が得られますが、その関数は呼び出されないため(ユーザーがボタンをもう一度クリックするまで)、呼び出しは「正しい」長さで自動的にトリガーされません(フィルタリング後に更新された長さ)。searchsetCountItems(allItems.length);

あなたの場合、問題の解決策は非常に簡単です。非常に多くの状態変数を導入することにより、コンポーネントを複雑にしすぎています。そのほとんどは相互に依存しています。の代わりにconst [totalItems, setCountItems] = useState(allItems.length);、単にconst totalItems = allItems.length;-を置くだけこれはすべてのレンダリングで正しい値に自動的に再計算されます。setCountItems関数は常に等しいことがわかっているので関数は必要ありallItems.lengthません。独立して変化することはありません。

同様に、このコンポーネントでは他の多くのことを大幅に簡略化できます。これは、独立して変化する可能性があり、したがって状態の一部である必要があるのは、記事リストとページ番号だけだからです。これは私があなたのコンポーネントを書き直す方法です:

const perSite = 10;

const ArticlesContainer = ({ articles }) => {
    const [allItems, setAllItems] = useState(articles.list);
    const [pageNumber, setPageNumber] = useState(1);

    const totalItems = allItems.length;
    const from = (pageNumber - 1) * perSite;
    const to = ((pageNumber - 1) * perSite) + perSite;
    const pages = Math.ceil(totalItems / perSite);

    const handlePageClick = (i) => {
        setPageNumber(i);
    }
    const search = () => {
        setAllItems(allItems.filter(x => x.category=== 2 ));
    }

    const Pagination = ({pages}) => {
        let list = []
        for(let i = 1; i<=pages; i++){
            list.push(<li key={i} onClick={() => handlePageClick(i)}>{i}</li>)
        }
        return list;
    }

    return (
        <React.Fragment>
            <a onClick={search}>Hello</a>
            {allItems.slice(from, to).map(article =>
                <Article key={article.id} article={article} />
            )}
            <div className="row">
                <ul>
                    <Pagination pages={pages} />
                </ul>
            </div>
        </React.Fragment>
    );
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

React:クラスの状態が変化したときに自動更新されないようにする

分類Dev

Reactフックでreduxの状態が変化したときに小道具が更新されない

分類Dev

Reactフックでreduxの状態が変化したときに小道具が更新されない

分類Dev

Reactフックの状態が更新されていません

分類Dev

更新時にReactフックの状態が定義されていません

分類Dev

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

分類Dev

Reactフックの状態変数が再レンダリング後に更新されない

分類Dev

チェックボックスの状態が更新されない

分類Dev

Redux状態の更新時にローカル状態が更新されない

分類Dev

フックの状態が正しく更新されないのはなぜですか?

分類Dev

Reactjsの状態が更新されない

分類Dev

SPIの状態が更新されない

分類Dev

ReactHookの状態が更新されない

分類Dev

setInterval内でReact状態フックを使用すると状態が更新されない

分類Dev

フォームのフック管理状態が親コンポーネントで更新されない

分類Dev

状態フックが正しく更新されないのはなぜですか?

分類Dev

反応:最初のクリックで状態が更新されない

分類Dev

フラッターブロックの状態が正しく更新されない

分類Dev

ReactJS:setStateとコールバック後に状態が更新されない

分類Dev

JQuery: デタッチとappendToの後にDOMの状態が更新されない

分類Dev

useEffectが呼び出されず、APIがフェッチされたときに状態が更新されない

分類Dev

状態変更後にuseEffectフックが起動しない

分類Dev

要素の削除中に状態が更新されない

分類Dev

React-状態が更新されていないか、古い状態にリセットされています

分類Dev

状態が初めて更新されたときにcomponentWillReceivePropsが起動しない

分類Dev

動的な命名で状態を適切に更新しないReactフック

分類Dev

アクションが起動してもreduxの状態が更新されない

分類Dev

クリックしても状態が変わらないフラッターで動的に作成されたチェックボックス

分類Dev

Angularobservableが自動的に更新されない

Related 関連記事

  1. 1

    React:クラスの状態が変化したときに自動更新されないようにする

  2. 2

    Reactフックでreduxの状態が変化したときに小道具が更新されない

  3. 3

    Reactフックでreduxの状態が変化したときに小道具が更新されない

  4. 4

    Reactフックの状態が更新されていません

  5. 5

    更新時にReactフックの状態が定義されていません

  6. 6

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

  7. 7

    Reactフックの状態変数が再レンダリング後に更新されない

  8. 8

    チェックボックスの状態が更新されない

  9. 9

    Redux状態の更新時にローカル状態が更新されない

  10. 10

    フックの状態が正しく更新されないのはなぜですか?

  11. 11

    Reactjsの状態が更新されない

  12. 12

    SPIの状態が更新されない

  13. 13

    ReactHookの状態が更新されない

  14. 14

    setInterval内でReact状態フックを使用すると状態が更新されない

  15. 15

    フォームのフック管理状態が親コンポーネントで更新されない

  16. 16

    状態フックが正しく更新されないのはなぜですか?

  17. 17

    反応:最初のクリックで状態が更新されない

  18. 18

    フラッターブロックの状態が正しく更新されない

  19. 19

    ReactJS:setStateとコールバック後に状態が更新されない

  20. 20

    JQuery: デタッチとappendToの後にDOMの状態が更新されない

  21. 21

    useEffectが呼び出されず、APIがフェッチされたときに状態が更新されない

  22. 22

    状態変更後にuseEffectフックが起動しない

  23. 23

    要素の削除中に状態が更新されない

  24. 24

    React-状態が更新されていないか、古い状態にリセットされています

  25. 25

    状態が初めて更新されたときにcomponentWillReceivePropsが起動しない

  26. 26

    動的な命名で状態を適切に更新しないReactフック

  27. 27

    アクションが起動してもreduxの状態が更新されない

  28. 28

    クリックしても状態が変わらないフラッターで動的に作成されたチェックボックス

  29. 29

    Angularobservableが自動的に更新されない

ホットタグ

アーカイブ