【问题标题】:React Js Data Table "No data available in table"React Js 数据表“表中没有可用数据”
【发布时间】:2020-05-12 06:10:39
【问题描述】:

我在使用 React Js 时遇到了问题。 我的数据表已成功填充,但第一行仍显示“表中没有可用数据” https://imgur.com/ApQPoO9

这是显示的html截图 https://imgur.com/Zk25ksS

另外,当我使用排序和搜索时,我的所有数据都将消失,只显示“表中没有可用数据”

网络结果:https://imgur.com/k5VqJIB 我的代码显示来自数据库的数据

class Uptime extends Component {
    constructor(props) {
        super(props);
        this.state = {
            error: null,
            isLoaded: false,
            data: []
        }
    }

    componentDidMount() {
        fetch('/uptime')
            .then(res => res.json())
            // .then(res => res.text())          // convert to plain text
            // .then(text => console.log(text))
            .then(
                (result) => {
                    this.setState({
                        isLoaded: true,
                        data: result.data
                    })
                },
                (error) => {
                    this.setState({
                        isLoaded: true,
                        error
                    })
                }
            )
    }

    render() {
        const {error, isLoaded, data} = this.state;
        // if (error) {
        //     return <div>Error: {error.message}</div>;
        // } else if (!isLoaded) {
        //     return (
        //         <div className="spinner-border text-primary" role="status">
        //             <span className="sr-only">Loading...</span>
        //         </div>
        //     )
        // } else {    WHEN I ADD THIS CODE, THE SEARCH FUNCTION AND SORT FUNCtION IS GONE , SO I JUST REMOVE IT
        return (
            <div id="content-wrapper" className="d-flex flex-column">
                <div id="content">
                    <div className="container-fluid">
                        <div className="card shadow mb-4 mt-5">
                            <div className="card-header py-3 text-center">
                                <h6 className="m-0 font-weight-bold text-primary">DataTables Example</h6>
                            </div>
                            <div className="card-body">
                                <div className="table-responsive">
                                    <table className="table table-bordered" id="dataTable" width="100%"
                                           cellSpacing="0">

                                        <thead>
                                        <tr>
                                            <th width="10%">Name</th>
                                            <th width="40%">Url</th>
                                            <th width="10%">Downtime</th>
                                            <th width="20%">date</th>
                                            <th width="10%">Status Code</th>
                                        </tr>
                                        </thead>
                                        <tbody>
                                          {data.map(item => (
                                                        <tr key={item[0]}>
                                                        <td>{item[1]}</td>
                                                        <td>{item[2]}</td>
                                                        <td>{item[5]}</td>
                                                        <td>{item[4]}</td>
                                                        <td>{item[3]}</td>
                                                        </tr>
                                                      ))}
                                        </tbody>
                                    </table>
                                </div>
                            </div>
                        </div>

                    </div>

                </div>
                <footer className="sticky-footer bg-white">
                    <div className="container my-auto">
                        <div className="copyright text-center my-auto">
                            <span>Copyright &copy; Your Website 2019</span>
                        </div>
                    </div>
                </footer>

            </div>

        )

    }
}

【问题讨论】:

  • 您好,请提供Minimal, Complete, and Reproducible代码示例,即获取、处理和呈现数据的组件代码。
  • 请分享完整代码,以便我们在这里为您提供帮助。
  • 我更新了我的代码,请检查
  • 看起来“表中没有可用数据”是映射到 DOM 的数据的一部分。您还可以提供来自网络的回复吗?不太可能,但我想知道这是否是一个反应关键问题。
  • @DrewReese,不,“表中没有可用数据”不是我的数据的一部分

标签: reactjs


【解决方案1】:

问题:

数据表在数据到来之前被初始化,所以它会显示 “表中没有可用数据”,一旦表被初始化然后之后 您正在对该表进行更改,因此您的数据会在之后追加 “表中没有可用数据”行,您可以通过以下方式检查该问题 在 sn-p 下运行。

const { useState , useEffect } = React;

const App = () => {

  const [users,setUsers] = useState([]);

  useEffect(() => {
    setTimeout(() => {
      setUsers([[0,"Vivek"],[1,"Darshita"]]);
    },2000);
  },[]);

  return (
    <table className="table table-bordered" id="dataTable" width="100%" cellSpacing="0">
    <thead>
        <tr>
            <th width="10%">Name</th>
        </tr>
    </thead>
    <tbody>
        {
            users.map(item => (
                    <tr key={item[0]}>
                        <td>{item[1]}</td>
                    </tr>))
        }
    </tbody>
    </table>
  );
}

ReactDOM.render(<App />, document.getElementById('react-root'));

$(document).ready(function() {
    $('#dataTable').DataTable();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script>
<div id="react-root"></div>

解决方案:

datatable 正在自动初始化,你必须销毁 它在设置状态之前,并在数据完成后重新初始化它 可用,正如您在下面的 sn-p 中看到的一样

const { useState , useEffect } = React;

const App = () => {

  const [users,setUsers] = useState([]);

  useEffect(() => {
    setTimeout(() => {
      $('#dataTable').DataTable().destroy();
      setUsers([[0,"Vivek"],[1,"Darshita"]]);
    },2000);
  },[]);

  useEffect(() => {
      $('#dataTable').DataTable();
  },[users]);

  return (
    <table className="table table-bordered" id="dataTable" width="100%" cellSpacing="0">
    <thead>
        <tr>
            <th width="10%">Name</th>
        </tr>
    </thead>
    <tbody>
        {
            users.map(item => (
                    <tr key={item[0]}>
                        <td>{item[1]}</td>
                    </tr>))
        }
    </tbody>
    </table>
  );
}

ReactDOM.render(<App />, document.getElementById('react-root'));

$(document).ready(function() {
    $('#dataTable').DataTable();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script>
<div id="react-root"></div>

【讨论】:

  • 让我试试这个,结果会回来的:)
  • “错误:无效的钩子调用。只能在函数组件的主体内部调用钩子。这可能由于以下原因之一发生:”我仍然不了解 useEffects,所以我似乎无法使这项工作:),虽然我明白你的逻辑如何解决它
  • 你必须把它放在componentDidMount,在获取数据之前把$('#dataTable').DataTable().destroy();和$('#dataTable').DataTable();放在你获取数据之后
  • @Yan,现在检查
  • 我在代码链接上添加了一个错误,我认为这已经和jquery有关了
猜你喜欢
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2020-02-19
  • 2021-10-08
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多