Bootstrap-table 使用 Firebase 实时数据库显示“No matching records found”和 bootstrap-table 中的记录

Posted

技术标签:

【中文标题】Bootstrap-table 使用 Firebase 实时数据库显示“No matching records found”和 bootstrap-table 中的记录【英文标题】:Bootstrap-table displays both "No matching records found" and Records in bootstrap-table with Firebase realtime database 【发布时间】:2021-07-30 10:55:01 【问题描述】:

我正在使用 bootstrap-table 并尝试显示一个包含来自 firebase 实时数据库的数据的表。

数据库的内容正确呈现,但是我在我的表中看到“未找到匹配的记录”消息。

使用搜索和排序功能还可以完全清除表格,并且需要刷新才能恢复数据。

import React,  useState, useEffect  from "react";
import firebaseDb from "../firebase";

const StarTrekTable = () => 
  var [contactObjects, setObjects] = useState();

  useEffect(() => 
    firebaseDb.child("unwatched").on("value", (snapshot) => 
      if (snapshot.val() != null)
        setObjects(
          ...snapshot.val(),
        );
    );
  , []);

  return (
    <>
      <div class="jumbotron jumbotron-fluid">
        <div class="container">
          <h1 class="display -4 text-center">Star trek series</h1>
        </div>
      </div>
      <div>
        <div className="col-md-12">
          <table data-toggle="table" data-pagination="true" data-search="true">
            <thead className="thread-light">
              <tr>
                <th>Title</th>
                <th>Series</th>
                <th>Season</th>
                <th>Episode</th>
                <th>Stardate</th>
                <th>Air Date</th>
              </tr>
            </thead>
            <tbody>
              Object.keys(contactObjects).map((id) => 
                return (
                  <tr>
                    <td>contactObjects[id].title</td>
                    <td>contactObjects[id].series</td>
                    <td>contactObjects[id].season</td>
                    <td>contactObjects[id].episode</td>
                    <td>contactObjects[id].stardate</td>
                    <td>contactObjects[id].airdate</td>
                  </tr>
                );
              )
            </tbody>
          </table>
        </div>
      </div>
    </>
  );
;

export default StarTrekTable;

非常感谢任何帮助。

Table shows both records as expected and "No matching records found"

Image of my Firebase realtime database setup

【问题讨论】:

【参考方案1】:

在您的组件第一次渲染时,您的contactsObject,这导致&lt;tbody&gt; 在第一次渲染时为空。在代码的其他地方,可能在引导程序的某个地方,“未找到匹配的记录”被添加到源代码中。一旦您的听众找到未观看的剧集,下载、解析并将它们添加到 &lt;tbody&gt; 反应中,然后删除它添加的条目(无),然后插入新条目。因为“没有找到匹配的记录”是在 React 之外添加的,所以它不知道它在那里并且没有被删除。不要让任何其他代码添加此行,而是在您仍在加载数据或表为空时自行定义。

如果你还没有使用 react-bootstrap,你应该使用它,这样与 Bootstrap 捆绑的原始 javascript 就不会像你在这里看到的那样与 React 争夺控制权。

注意:在 React 中渲染数据数组时,请确保为每个条目指定 key,以便 React 可以在新渲染时有效地操作条目。

清理一些其他的东西,这给出了:

import React,  useState, useEffect  from "react";
import firebaseDb from "../firebase";

const StarTrekTable = () => 
  // - renamed variables to reflect content
  // - used array instead of object
  // - used const instead of var
  const [episodeData, setEpisodeData] = useState([]);
  const [episodesLoaded, setEpisodesLoaded] = useState(false);

  useEffect(() => 
    // store Reference for attaching and detaching listeners
    const unwatchedRef = firebaseDb.child("unwatched");
  
    // because you use a `.on` listener, don't forget to store
    // the listener so we can detach it
    const listener = unwatchedRef
      .on("value", (snapshot) => 
        if (!snapshot.exists()) 
          // no data to show and/or unwatched is empty
          // update state variables
          setEpisodeData([]);
          setEpisodesLoaded(true);
          return;
        
        
        // Use forEach to maintain the order of the query, using `...snapshot.val()`
        // for the whole result will often lead to unexpected results.
        const freshEpisodeData = [];
        snapshot.forEach((childSnapshot) => 
          freshEpisodeData.push( ...childSnapshot.val(), key: childSnapshot.key );
        );

        // update state variables
        setEpisodeData(freshEpisodeData);
        setEpisodesLoaded(true);
      );
      
    // when component is detached, remove the listener
    return () => unwatchedRef.off("value", listener);
  , []);

  return (
    <>
      <div class="jumbotron jumbotron-fluid">
        <div class="container">
          <h1 class="display -4 text-center">Star trek series</h1>
        </div>
      </div>
      <div>
        <div className="col-md-12">
          <table data-toggle="table" data-pagination="true" data-search="true">
            <thead className="thread-light">
              <tr>
                <th>Title</th>
                <th>Series</th>
                <th>Season</th>
                <th>Episode</th>
                <th>Stardate</th>
                <th>Air Date</th>
              </tr>
            </thead>
            <tbody>
               !episodesLoaded
                ? (
                  <tr key="data-loading">
                    <td colspan="6"><i>Loading...</i></td>
                  </tr>
                )
                : (episodeData.length === 0
                  ? (
                    <tr key="data-empty">
                      <td colspan="6">No unwatched episodes available. You're all caught up!</td>
                    </tr>
                  )
                  : episodeData.map(( key, title, series, season, episode, stardate, airdate ) => (
                    <tr key=key>
                      <td>title</td>
                      <td>series</td>
                      <td>season</td>
                      <td>episode</td>
                      <td>stardate</td>
                      <td>airdate</td>
                    </tr>
                  )))
              
            </tbody>
          </table>
        </div>
      </div>
    </>
  );
;

export default StarTrekTable;

注意:对于不太可能更改的静态数组,您的数据库结构很好,但我强烈建议您不要对数据使用数字键(02 等。 ) 而是使用其他东西,例如(S01E01-02S01E03 等)或 Firebase 推送 ID。考虑这个(但仍然有效)blog post 进行推理。

【讨论】:

以上是关于Bootstrap-table 使用 Firebase 实时数据库显示“No matching records found”和 bootstrap-table 中的记录的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap-table的使用

Bootstrap-table 过滤器控制扩展使用完整的选项列表填充选择

bootstrap-table 如何使用搜索和过滤?

如何使用bootstrap-table进行后端排序

Bootstrap-table : 中文文本

bootstrap-table - 如何设置表格行背景颜色