使用useEffect钩子

时间:2020-06-12 16:50:20

标签: javascript reactjs react-hooks array.prototype.map

我正在useEffect回调中创建一个类别数组,当我进行console.log记录时,它工作正常。

但是当我.map()时,结果数组为空。

import React, { useEffect } from 'react';

export const Categories = (props) => {
    let categories = [];

    useEffect(() => {
        props.films.forEach((film) => {
            if (categories.findIndex(item => item === film.category) === -1)
            {
                categories.push(film.category);
                console.log(categories);
            }

        })
    }, [props.films, categories])

    return (
        <div>
            {categories.map((category) => {
                return (
                    <div>
                        {category}
                    </div>
                )
            })}
        </div>
    );
}

有人有主意吗?

3 个答案:

答案 0 :(得分:2)

您应将状态值用于类别:

const [categories, setCategories] = React.useState([])

useEffect(() => {
    let categories = []
    props.films.forEach((film) => {
        if (categories.findIndex(item => item === film.category) === -1)
        {
            categories.push(film.category);
            console.log(categories);
        }

    })
    setCategories(categories)
}, [props.films])

答案 1 :(得分:0)

更改categories中的数据时,不会重新渲染组件。为了呈现categories,您需要使用useState存储数据。

import React, { useEffect, useState } from 'react';

export const Categories = (props) => {
    const [categories, setCategories] = useState([]);

    useEffect(() => {
        let filmCategories = []
        props.films.forEach((film) => {
            if (categories.findIndex(item => item === film.category) === -1)
            {
                filmCategories.push(film.category);
                console.log(filmCategories);
            }
        })
        setCategories(filmCategories)
    }, [props.films])

    return (
        <div>
            {categories.map((category) => {
                return (
                    <div>
                        {category}
                    </div>
                )
            })}
        </div>
    );
}

希望这会有所帮助。

答案 2 :(得分:0)

我认为您可能是新来的人。我建议您看看React State and Lifecycle

您正在使用反应挂钩useEfect,该组件在DOM中呈现后将被调用

我可以想到两种解决方案

1)使用react钩子useState

import React, { useEffect } from 'react';

export const Categories = (props) => {
    //Make the local variable into a variable representing state
    let [categories, setCategories] = useState([]);

    useEffect(() => {
        const result = [...categories];
        props.films.forEach((film) => {
            if (result.findIndex(item => item === film.category) === -1)
            {
                result.push(film.category);
                console.log(result);
            }

        })
        //Set the state value to trigger a re-render of your component
        if(result.length !== categories.length)
            setCategories(result);
    }, [props.films, categories])

    return (
        <div>
            {categories.map((category) => {
                return (
                    <div>
                        {category}
                    </div>
                )
            })}
        </div>
    );
}

2)如果不需要重新渲染,请移除useEffect钩子

import React, { useEffect } from 'react';

export const Categories = (props) => {
    let categories = props.films.map(film => {
            if (categories.findIndex(item => item === film.category) === -1)
            {
                categories.push(film.category);
                console.log(categories);
            }
     }


    return (
        <div>
            {categories.map((category) => {
                return (
                    <div>
                        {category}
                    </div>
                )
            })}
        </div>
    );
}

如果需要useEffect react钩子,则解决方案1更好

如果不需要重新渲染反应组件,则解决方案2更好