【问题标题】:Functions within the loop do not work with data from the database循环中的函数不适用于数据库中的数据
【发布时间】:2021-11-26 11:32:41
【问题描述】:

我有一个问题,当我在本地填充变量时,我的代码工作正常。但是,一旦我开始数据库调用,循环内的函数就不再起作用。该功能确保卡片可以打开或关闭。 (见例子)

如何通过数据库调用使用循环内的函数?

示例:https://codepen.io/CreativeBulma/pen/YbQqoQ

如果我将数据存储在一个变量中,这个函数也可以循环工作,如下 const

[trainingData, setTrainingData] = useState([
    {
        ...
    },
    {
       ...
    }
]);

但是,一旦我进行数据库调用并以这种方式写入数据,就没有任何效果了 setTrainingData(res.data);也就是说,当我使用函数 getTrainingData() 调用数据时。

所以只要我用数据库填满const trainingData,就没有任何效果了。

没用

//database call
const [trainingData, setTrainingData] = useState([]);

    const getTrainingData = () => {
        axios
            .get(`${process.env.REACT_APP_API_URL}/team/team_training-${teamid}`,
        )
            .then((res) => {
                if (res.status === 200) {
                    if (typeof res.data !== 'undefined' && res.data.length > 0) {
                        // the array is defined and has at least one element
                        setIsTrainingExisting(true)
                        setTrainingData(res.data); // The data is the same as the working code
                        console.log(res.data)

                    }
                    else {
                        setIsTrainingExisting(false)
                    }


                }
            })
            .catch((error) => {
                //console.log(error);

            });

    }

// Console.log(res.data) give me the following output
/*
[
    {
        "von": "17:00",
        "bis": "18:00",
        "tag": "Mittwoch",
        "trainingsid": 46
    },
    {
        "von": "15:00",
        "bis": "19:00",
        "tag": "Donnerstag",
        "trainingsid": 47
    }
]
*/

作品

// without database call
const [trainingData, setTrainingData] = useState([
    {
        "von": "17:00",
        "bis": "18:00",
        "tag": "Mittwoch",
        "trainingsid": 46
    },
    {
        "von": "15:00",
        "bis": "19:00",
        "tag": "Donnerstag",
        "trainingsid": 47
    }
]);

代码

 import React, { useEffect, useRef, useState } from 'react'
import bulmaCollapsible from '@creativebulma/bulma-collapsible';
import axios from 'axios'

const teamid = (window.location.pathname).split("-")[1];

function Training() {

    let collapsiblesRef = useRef(null);


    useEffect(() => {
        bulmaCollapsible.attach(".is-collapsible", {
            container: collapsiblesRef.current
        });
    }, [])

    useEffect(() => {
        getTrainingData();
    }, []);

    const [isTrainingExisting, setIsTrainingExisting] = useState(false);
    const [trainingData, setTrainingData] = useState([]);
    

/*const [trainingData, setTrainingData] = useState([
    {
        "von": "17:00",
        "bis": "18:00",
        "tag": "Mittwoch",
        "trainingsid": 46
    },
    {
        "von": "15:00",
        "bis": "19:00",
        "tag": "Donnerstag",
        "trainingsid": 47
    }
]);*/

    const getTrainingData = () => {
        axios
            .get(`${process.env.REACT_APP_API_URL}/team/team_training-${teamid}`,
        )
            .then((res) => {
                if (res.status === 200) {
                    if (typeof res.data !== 'undefined' && res.data.length > 0) {
                        // the array is defined and has at least one element
                        setIsTrainingExisting(true)
                        setTrainingData(res.data);
                        console.log(res.data)

                    }
                    else {
                        setIsTrainingExisting(false)
                    }


                }
            })
            .catch((error) => {
                //console.log(error);

            });

    }





    return (
        <div>
            <div className="card">
                <div className="card-content">
                    <div ref={collapsiblesRef} id="accordion_first">

                        {trainingData.map((d, i) =>

                        (
                            <div className="card" key={i}>
                                <header className="card-header">
                                    <p className="card-header-title">
                                        {d.tag}
                                    </p>
                                    <a href={"#collapsible-message-accordion-" + i.toString()} data-action="collapse" className="card-header-icon is-hidden-fullscreen" aria-label="more options">
                                        <span className="icon">
                                            <i className="fas fa-angle-down" aria-hidden="true"></i>
                                        </span>
                                    </a>
                                </header>
                                <div id={"collapsible-message-accordion-" + i.toString()} className="is-collapsible" data-parent="accordion_first">
                                    <div className="card-content">
                                        <p className="is-small has-text-primary has-text-weight-semibold">Tag</p>

                                        <input className="input mb-5" style={{ width: "33%" }} type="text" placeholder="Wochentag" />
                                        <p className="is-small has-text-primary has-text-weight-semibold">Uhrzeit von</p>
                                        <input className="input mb-5" style={{ width: "33%" }} type="text" placeholder="Uhrzeit von" />

                                        <p className="is-small has-text-primary has-text-weight-semibold">Uhrzeit bis</p>
                                        <input className="input mb-5" style={{ width: "33%" }} type="text" placeholder="Uhrzeit bis" />

  

                                    </div>
                                </div>
                            </div>


                        ))}
                    </div>


                </div>
            </div>

            <br />

            <div>
                <button className="button is-light"> <i class="fas fa-plus-circle"></i>&nbsp; Neu</button>
            </div>


        </div>
    )
}

export default Training

【问题讨论】:

  • 你指的是什么循环?问题/问题不清楚。
  • 最后一段代码有一个循环。此循环适用于两种数据。但是,不起作用的是功能。展开或关闭。请参阅那里给出的示例以查看功能。
  • 这只是映射您的状态数组。您的 codepen 中的代码也与您在问题中的代码 sn-ps 中询问的内容不匹配。什么不工作?能说的具体点吗?
  • 显示您的所有代码文件,否则我们无法对您的错误做任何事情,对于给定的信息,这很不清楚。如果我不看 cmets,我就不会知道你的问题是什么
  • 所以 CodePen 中的代码显示了函数应该是什么样子。地图应该能够折叠/展开,它与扩展 bulmaCollapsible 一起使用。如果我将数据存储在一个变量中,此函数也可以循环工作,如下所示 const [trainingData, setTrainingData] = useState([ { ... }, { ... } ]); 但是,一旦我进行数据库调用并像这样写入数据,就没有任何作用了setTrainingData(res.data);

标签: reactjs api object


【解决方案1】:

为什么它不起作用:

您在未渲染子项时附加了 ref,因此当您的组件从 api 获取数据时,bulma 不知道如何折叠您的项目(因为调用是异步的,组件首先渲染数据而不可折叠元素)。

你可以做些什么来让它工作:

  useEffect(() => {
        bulmaCollapsible.attach(".is-collapsible", {
            container: collapsiblesRef.current
        });
    }, [trainingData]) // <== will update bulma ref at every training data change

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多