javascript - React - useState 和 Firebase 的问题

标签 javascript reactjs firebase functional-programming react-hooks

我试图解决这个问题,但我没有运气......

我正在使用 React 和“react-bootstrap”。使用 useState 从 firebase 获取数据,如下面的代码所示。而且我还将模态作为组件调用,并且该模态使用 useState 来显示和隐藏模态。

export const Models = () => {

    const [models, setModels] = useState(null);

    useEffect(() => {
        firebase.database().ref('Models').on('value', (snapshot) => {
            setModels(snapshot.val())
        });

    }, []);
    return models;
}

当我单击 url 访问模式时,问题结果会显示,主要组件会转到 firebase 并尝试再次获取数据。因此,如果我在模式上点击 3 次,我将从 Firebase 获取数据 3 次。

我该如何解决这个问题?无论您打开模式窗口多少次,都只从 Firebase 获取一次数据?

其他部分代码

const Gallery = () => {

    const [fireBaseDate, setFireBaseDate] = useState(null);
    axios.post('https://us-central1-models-gallery-puq.cloudfunctions.net/date',{format:'DD/MM/YYYY'})
    .then((response) => {
        setFireBaseDate(response.data)
    });

    let content = Models();
    let models = [];

    const [imageModalShow, setImageModalShow] = useState(false);
    const [selectedModel, setSelectedModel] = useState('');


    if(content){
        Object.keys(content).map((key, index) => 
        models[index] = content[key]
        );

        models = shuffleArray(models);
        console.log(models)

        return(
            <div className="appContentBody">
                <Jumbo />
                <Promotion models={models}/>
                <div className="Gallery">
                <h1>Galería - Under Patagonia</h1>

                <Filter />

                <div className="img-area">
                    {models.map((model, key) =>{
                        let myDate = new Date(model.creationDate);
                        let modelEndDate = new Date(myDate.setDate(myDate.getDate() + 30)).toLocaleDateString('en-GB')
                        if(fireBaseDate !== modelEndDate && model.active === true){
                            return (
                                <div className="img-card filterCard" key={key}>
                                    <div className="flip-img">
                                        <div className="flip-img-inner">
                                            <div className="flip-img-front">
                                                <img className="single-img card-img-top" src={model.thumbnail} alt="Model"/>
                                            </div>
                                            <div className="flip-img-back">
                                                <h2>{model.certified ? 'Verificada!' : 'No Verificada'}</h2>
                                                <p>Número: {model.contact_number}</p>
                                                <p>Ciudad: {model.city}</p>
                                                <p>Servicios: {model.services}</p>
                                            </div>
                                        </div>
                                    </div>
                                    <h5>{model.name}</h5>

                                    <Button variant="danger" onClick={() => {
                                                setImageModalShow(true)
                                                setSelectedModel(model)}
                                                }>
                                        Ver
                                    </Button>
                                </div>  
                            );
                        }
                    return 0})}                
                </div>
                    <Image
                        show={imageModalShow}
                        onHide={() => setImageModalShow(false)}
                        model={selectedModel}
                    />
                </div>
            <Footer />
            </div>
    )} else {
        return (
            <div className="loading">
                <h1>Loading...</h1>
            </div>
    )}
}


export default Gallery;

感谢您的宝贵时间!

最佳答案

Models 是一个常规的 javascript 函数,而不是一个函数组件。所以这不是钩子(Hook)的有效使用,并且不会按预期工作。请参阅 rules of hooks 上的文档.

功能组件接收 props 并返回 JSX 或另一个 React 元素。

因为它没有,所以它基本上是在每次被父级调用时重新启动并调用您的效果。

查看您的编辑,您可能应该删除 Models 函数并将逻辑放入 Gallery 组件中。

关于javascript - React - useState 和 Firebase 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58664920/

相关文章:

java - 如何从 Firebase 获取特定的子值?

javascript - jQuery 中的非法字符错误 - 无论函数内容如何

javascript - Sequelize - 如何比较日期之间的相等性

javascript - 如何倒序运行CSS3动画的某部分

javascript - 如何将本地存储添加到我的React.js应用程序?

javascript - ReactJs 中的内联 CSS 样式

reactjs - 静态服务时,来自不同组件的 React + Material-UI 样式类发生冲突

javascript - Three.js 获取可见区域中心的粒子

ios - Swift 从数据库检索 Firebase 数据

android - Flutter Firebase Error Null fundtion(FirebaseUser)无法分配给参数,仪表类型 FutureOr <dynamic>