クリック時にReactフックが更新されない

クドラス

ファイル入力によって選択された写真を表示し、それらを状態に保存するNp02という名前のreactフックがあります。ユーザーがファイルを選択すると、それらはグリッドで表示されます。これは機能しますが、選択した画像を削除したい機能がありますが、そうではありません。関数removeImageが実行され、期待する配列が出力されますが、状態は変わりません。setImagesを関数removeImagesまたは別の場所に移動しようとしましたが、状態自体は変化せず、画像にuseEffectを追加すると、画像を選択した場合にのみ変化し、画像を削除したい場合には変化しません。なぜ状態が変わらないのですか?

const MAX_IMAGES = 5;
const blankImage = 'https://static.thenounproject.com/png/187803-200.png';

function fillWithBlanks(arr) {
    const blanks = new Array(MAX_IMAGES - arr.length).fill(blankImage);
    return [...arr, ...blanks];
};

const Np02 = ({setForm}) => {

    const classes = useStyles();
    const fileInput = useRef<HTMLInputElement | null>(null);
    const dispatch = useDispatch();
    const NPData = useSelector(getNPStepData);
    const [values, setValues] = useState(NPData[1]);

    const [images, setImages] = useState<any[]>(fillWithBlanks([]));

    useEffect(() => {
        setTimeout(() => {
            setForm(checkFormValidity);
        }, 200);

    }, [values]);

    const checkFormValidity = (): boolean => {

        dispatch(submitStep(1, values));
        return true;
    };

    const imageInputChanged = (e) => {
        const files = e.target.files;
        const result: any = [];
        let fileCounter = 0;

        for (var i = 0; i < files.length; i++) {

            const file = files.item(i);

            let reader = new FileReader();
            reader.readAsDataURL(file);

            reader.onload = (e) => {

                result.push(reader.result);
                fileCounter++;

                if (fileCounter >= files.length) {
                    let uploadedImg = [...(images.filter((value) => value !== blankImage)), ...result];

                    if (MAX_IMAGES < uploadedImg.length) {
                        uploadedImg = uploadedImg.slice(uploadedImg.length - MAX_IMAGES);
                    }

                    setImages(fillWithBlanks(uploadedImg));

                }
            };
        }
    };

    const removeImage = (id) => {
        let arr = images;

        arr[id] = blankImage;
        console.log(arr); // this outputs right version of array

        return arr;
    };

    return (
        <div>
            <label htmlFor="raised-button-file" className={classes.buttonLabel}>
                <Button variant="contained" color="secondary" component="span">
                    Nahraj fotky
                </Button>
            </label>
            <FormHelperText className={classes.helperText}>Nahraj alespoň dvě různé fotky tvého
                předmětu</FormHelperText>

            <ImagesGrid images={images} imageClicked={(id) => setImages(removeImage(id))}/>

            <TextField
                className={classes.textarea}
                label="Popis"
                variant="filled"
                helperText="Zde popiš předmět, pro případné zájemce"
                multiline
                rows={6}
                value={values.desc}
                onChange={(e) => setValues({desc: e.target.value})}
            />

            <input
                ref={fileInput}
                accept="image/*"
                className={classes.input}
                id="raised-button-file"
                multiple
                type="file"
                onChange={imageInputChanged}
            />
        </div>
    );
};

export default Np02;

これは、画像をグリッドに描画するためのコンポーネントです。

const ImagesGrid = (props: iImagesGrid) => {
    const classes = useStyles();
    const spacing = 0;

    return (
        <div className={classes.root}>
                <Grid className={classes.fullHeight} container spacing={spacing} direction="row"
                      justify="center"
                      alignItems="stretch">
                    <Grid item xs={6} onClick={() => props.imageClicked(0)}>
                        <GridImage url={props.images[0]} title={'teehee'}  />
                    </Grid>

                    <Grid item xs={6} className={classes.fullHeight}>
                        <Grid container className={classes.halfHeight} item xs={12}>
                            <Grid item xs={6}  onClick={() => props.imageClicked(1)}>
                               <GridImage url={props.images[1]} title={'teehee'}/>
                            </Grid>

                            <Grid item xs={6}  onClick={() => props.imageClicked(2)}>
                                <GridImage url={props.images[2]} title={'teehee'}/>
                            </Grid>
                        </Grid>

                        <Grid item className={classes.halfHeight} container xs={12}>
                            <Grid item xs={6}  onClick={() => props.imageClicked(3)}>
                                <GridImage url={props.images[3]} title={'teehee'}/>
                            </Grid>

                            <Grid item xs={6}  onClick={() => props.imageClicked(4)}>
                                <GridImage url={props.images[4]} title={'teehee'}/>
                            </Grid>
                        </Grid>
                    </Grid>
                </Grid>
        </div>
    );
};

export default ImagesGrid;
特定のパフォーマンス

ここで既存の状態を変更しています:

arr[id] = blankImage;

代わりに、現在の状態にあるものを変更しないように、最初に既存のアレイのクローンを作成します。

const newArr = [...images];
newArr[id] = blankImage;
return newArr;

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ReactフックsetStateがすぐに更新されない

分類Dev

ボタンクリック時に折れ線グラフの凡例の色が更新されない(highcharts-angular)

分類Dev

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

分類Dev

setStateフックが更新されない

分類Dev

fancyboxがクリック時に表示されない

分類Dev

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

分類Dev

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

分類Dev

Reactフックとフォーム送信を使用した状態更新時にUIが再レンダリングされない

分類Dev

Reactチェックボックスが更新されない

分類Dev

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

分類Dev

ボタンクリック時にページが更新されないようにする

分類Dev

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

分類Dev

クリック可能なLinearLayoutがクリック時に強調表示されない

分類Dev

onClickイベントがクリック時にトリガーされない-React

分類Dev

クリックしてもD3グラフが更新されない

分類Dev

最初のボタンクリック後にReactコンポーネントが更新されない

分類Dev

d3.js棒グラフがクリックイベントに基づいて更新されない

分類Dev

クリック時に複製された要素が機能しないJavascript

分類Dev

jquery関数がクリック時に呼び出されない

分類Dev

クリック時にネストされたli値が機能しない

分類Dev

送信時に Chrome の推奨ボックスがクリアされない

分類Dev

ボタンクリックでAndroidTextViewが更新されない

分類Dev

JTableセルがEnterクリックで更新されない

分類Dev

クリック時に正しい値が得られない

分類Dev

Angular-クリック後にデータが更新されない

分類Dev

ボタンクリック後にPHP変数が更新されない

分類Dev

コンボボックスインデックスの変更時にリストボックスが更新されない

分類Dev

ボタンクリックイベントの実行中にフォームが更新されない

分類Dev

入力値の変更時にノックアウト監視可能フィールドが更新されない

Related 関連記事

  1. 1

    ReactフックsetStateがすぐに更新されない

  2. 2

    ボタンクリック時に折れ線グラフの凡例の色が更新されない(highcharts-angular)

  3. 3

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

  4. 4

    setStateフックが更新されない

  5. 5

    fancyboxがクリック時に表示されない

  6. 6

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

  7. 7

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

  8. 8

    Reactフックとフォーム送信を使用した状態更新時にUIが再レンダリングされない

  9. 9

    Reactチェックボックスが更新されない

  10. 10

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

  11. 11

    ボタンクリック時にページが更新されないようにする

  12. 12

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

  13. 13

    クリック可能なLinearLayoutがクリック時に強調表示されない

  14. 14

    onClickイベントがクリック時にトリガーされない-React

  15. 15

    クリックしてもD3グラフが更新されない

  16. 16

    最初のボタンクリック後にReactコンポーネントが更新されない

  17. 17

    d3.js棒グラフがクリックイベントに基づいて更新されない

  18. 18

    クリック時に複製された要素が機能しないJavascript

  19. 19

    jquery関数がクリック時に呼び出されない

  20. 20

    クリック時にネストされたli値が機能しない

  21. 21

    送信時に Chrome の推奨ボックスがクリアされない

  22. 22

    ボタンクリックでAndroidTextViewが更新されない

  23. 23

    JTableセルがEnterクリックで更新されない

  24. 24

    クリック時に正しい値が得られない

  25. 25

    Angular-クリック後にデータが更新されない

  26. 26

    ボタンクリック後にPHP変数が更新されない

  27. 27

    コンボボックスインデックスの変更時にリストボックスが更新されない

  28. 28

    ボタンクリックイベントの実行中にフォームが更新されない

  29. 29

    入力値の変更時にノックアウト監視可能フィールドが更新されない

ホットタグ

アーカイブ