React项目中如何移除jQuery DataTables顶部的“No data available in table”提示?
解决jQuery DataTables显示"No data available in table"但实际有数据的问题
这个问题的核心原因很明确:DataTables在你的React组件还没拿到USGS API的地震数据时就已经初始化了。此时表格的tbody是空的,所以DataTables自动显示了"No data available in table"的提示;等API数据加载完成后,React渲染了表格行,但DataTables没有感知到DOM的变化,导致提示和真实数据同时显示。
下面给你几个针对性的解决方案,按推荐程度排序:
方案1:在数据加载完成后初始化DataTables
把DataTables的初始化逻辑放在setState的回调函数里,确保只有当数据已经更新到state并准备好渲染后,才让DataTables接管表格:
constructor(props) { super(props); // 初始化state时把posts设为空数组,避免undefined报错 this.state = { posts: [], error: '' }; } componentDidMount(){ axios.get('https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&starttime=2014-01-01&endtime=2014-01-02') .then(response =>{ console.log(response) this.setState({ posts : response.data.features },()=>{ // 数据加载完成后再初始化DataTables $('#earthquakes').DataTable({ // 可以在这里添加你的DataTables配置,比如分页、排序等 }); }) }) .catch(error =>{ console.log(error) this.setState({ error : 'Error retrieving data' }) }) }
方案2:数据更新时刷新DataTables(应对组件重新渲染场景)
如果你的组件会因为其他原因重新渲染,或者需要更新数据后刷新表格,可以在componentDidUpdate钩子中处理DataTables的销毁和重新初始化:
componentDidUpdate(prevProps, prevState) { // 仅当posts数据发生变化时执行 if (prevState.posts !== this.state.posts) { // 先销毁已有的DataTables实例,避免冲突 const table = $('#earthquakes').DataTable(); if (table) table.destroy(); // 重新初始化表格 $('#earthquakes').DataTable(); } }
额外的小修复:修正图片标签的属性错误
你在QuakeShow组件里的img标签用了url属性,这是不正确的,应该用src。另外,本地绝对路径在React项目里可能无法正常加载,建议把图片放在项目的public文件夹下,用相对路径:
// 假设图片放在public/resources/earthquake.png <td><img src="/resources/earthquake.png" alt="Earthquake icon" /></td>
这样处理后,DataTables就会在有真实数据的情况下初始化,不会再显示错误的无数据提示了。
内容的提问来源于stack exchange,提问作者Bharat Singh
相关产品推荐
相关产品推荐

