如何使用 REACT 渲染/更新我的表?

2023-11-24

当我点击时,我无法进行多重交叉过滤Apply(应用我从下拉列表中选择的所有选项)或Cancel按钮(重置所选选项)。例如过滤条件taste and availability(请看图片)。但我无法呈现过滤后的行/更新的表。

export default function MenuDisplay() {
  const { menuId } = useParams();
  const { match } = JsonData;
  const [selected, setSelected] = useState({});
  const [hidden, setHidden] = useState({});
  const [taste, setTaste] = useState([
    { label: "Good", value: "Good", name: "Good", selected: false },
    { label: "Medium", value: "Medium", name: "Medium", selected: false },
    { label: "Bad", value: "Bad", name: "Bad", selected: false }
  ]);

  const [comments, setComments] = useState([
    { label: "0", value: "0", name: "0", selected: false },
    { label: "1", value: "1", name: "1", selected: false },
    { label: "2", value: "2", name: "2", selected: false },
    { label: "3", value: "3", name: "3", selected: false },
    { label: "4", value: "4", name: "4", selected: false },
    { label: "5", value: "5", name: "5", selected: false }
  ]);

  const [availability, setAvailability] = useState([
    {
      label: "availability",
      value: "availability",
      name: "Availability",
      selected: false
    },
    { label: "trust", value: "trust", name: "Trust", selected: false }
  ]);

  function selectionOpt(setItems) {
    return (selection) => {
      setItems(selection);
    };
  }

  const impact = (value) => {
    if (value === 1) {
      return (
        <div>
          <TaskAltIcon />
        </div>
      );
    } else {
      return (
        <div>
          <CancelIcon />
        </div>
      );
    }
  };

  // If any row is selected, the button should be in the Apply state
  // else it should be in the Cancel state
  const buttonMode = Object.values(selected).some((isSelected) => isSelected)
    ? "apply"
    : "cancel";

  const rowSelectHandler = (id) => (checked) => {
    setSelected((selected) => ({
      ...selected,
      [id]: checked
    }));
  };

  const handleClick = () => {
    if (buttonMode === "apply") {
      // Hide currently selected items
      const currentlySelected = {};
      Object.entries(selected).forEach(([id, isSelected]) => {
        if (isSelected) {
          currentlySelected[id] = isSelected;
        }
      });
      setHidden({ ...hidden, ...currentlySelected });

      // Clear all selection
      const newSelected = {};
      Object.keys(selected).forEach((id) => {
        newSelected[id] = false;
      });
      setSelected(newSelected);
    } else {
      // Select all currently hidden items
      const currentlyHidden = {};
      Object.entries(hidden).forEach(([id, isHidden]) => {
        if (isHidden) {
          currentlyHidden[id] = isHidden;
        }
      });
      setSelected({ ...selected, ...currentlyHidden });

      // Clear all hidden items
      const newHidden = {};
      Object.keys(hidden).forEach((id) => {
        newHidden[id] = false;
      });
      setHidden(newHidden);
    }
  };

  const matchData = (
    match.find((el) => el._id_menu === menuId)?._ids ?? []
  ).filter(({ _id }) => {
    return !hidden[_id];
  });

  const getRowProps = (row) => {
    return {
      style: {
        backgroundColor: selected[row.values.id] ? "lightgrey" : "white"
      }
    };
  };

  const data = [
    {
      Header: "id",
      accessor: (row) => row._id
    },
    {
      Header: "Name",
      accessor: (row) => (
        <Link to={{ pathname: `/menu/${menuId}/${row._id}` }}>{row.name}</Link>
      )
    },
    {
      Header: "Taste",
      accessor: (row) => row.taste
    },
    {
      Header: "Comments",
      //check current row is in hidden rows or not
      accessor: (row) => {
        const comments = parseInt(row.comments, 10);

        return <Counter count={comments} />;
      }
    },
    {
      Header: "Price",
      accessor: (row) => row.price,
      id: "price"
    },
    {
      Header: "Status",
      accessor: (row) => row.status
    },
    {
      Header: "Availability",
      accessor: (row) => row.availability,
      id: "availability",
      Cell: (props) => impact(props.value)
    },
    {
      Header: "Trust",
      accessor: (row) => row.trust,
      id: "trust",
      Cell: (props) => impact(props.value)
    },
    {
      Header: "Show",
      accessor: (row) => (
        <Toggle
          value={selected[row._id]}
          onChange={rowSelectHandler(row._id)}
        />
      )
    }
  ];

  const initialState = {
    sortBy: [
      { desc: false, id: "id" },
      { desc: false, id: "description" }
    ],
    hiddenColumns: ["dishes", "id"]
  };

  return (
    <div>
      <button type="button" onClick={handleClick}>
        {buttonMode === "cancel" ? "Cancel" : "Apply"}
      </button>
      <div className="flex justify-end gap-4 ">
        <div>
          <Button>Apply</Button>
        </div>
        <div>
          <Button>Cancel</Button>
        </div>
      </div>
      Taste
      <ListDrop
        placeholder={"Select"}
        items={taste}
        onSelect={selectionOpt(setTaste)}
        hasAll
      />
      Comments
      <ListDrop
        placeholder={"Select"}
        items={comments}
        onSelect={selectionOpt(setComments)}
        hasAll
      />
      <p>Availability & Trust </p>
      {/* I would like to have in my dropdown Availability and Trust as 
           options in my dropdown and it refers to the cross where availaibility: 1 and trust:1 ) */}
      <ListDrop
        placeholder={"Select"}
        items={availability}
        onSelect={selectionOpt(setAvailability)}
        hasAll
      />
      <Table
        data={matchData}
        columns={data}
        initialState={initialState}
        withCellBorder
        withRowBorder
        withSorting
        withPagination
        rowProps={getRowProps}
      />
    </div>
  );
}

请检查我的代码沙箱

请检查图片以获得想法:

enter image description here


我选择一些字段并为您创建一个简单的应用程序,如果您仔细阅读代码,您会弄清楚它是如何工作的,然后您可以类似地更改您的代码:

table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td,
th {
  border: 1px solid #dddddd;
  text-align: left;
  padding: 8px;
}

tr:nth-child(even) {
  background-color: #dddddd;
}

import React, { useEffect } from "react";
import "./styles.css";

const soupsData = [
  {
    name: "Pea Soup",
    taste: "Good",
    trust: 1,
    availability: 0
  },
  {
    name: "Potato Soup ",
    taste: "Medium",
    trust: 1,
    availability: 1
  },
  {
    name: "Cucumber Soup ",
    taste: "Medium",
    trust: 1,
    availability: 1
  }
];

const tasteOptions = [
  { label: "Good", name: "Good" },
  { label: "Medium", name: "Medium" },
  { label: "Bad", name: "Bad" }
];

const availabilityAndTrustOptions = [
  {
    name: "all",
    label: "all"
  },
  {
    name: "availability",
    label: "availability"
  },
  {
    name: "trust",
    label: "trust"
  }
];

function App() {
  const [soups, setSoups] = React.useState([]);
  const [tastes, setTastes] = React.useState([]);
  const [availabilityAndTrust, setAvailabilityAndTrust] = React.useState({
    trust: 0,
    availability: 0
  });

  useEffect(() => {

    const filteredSoups = soupsData.filter((soup) => {
      const availability = availabilityAndTrust.availability;
      const trust = availabilityAndTrust.trust;

      if (availability) {
        if (!soup.availability) return false;
      }

      if (trust) {
        if (!soup.trust) return false;
      }

      if (tastes.length > 0) {
        if (!tastes.includes(soup.taste)) return false;
      }

      return true;
    });

    setSoups(() => filteredSoups);
  }, [tastes, availabilityAndTrust]);

  const handleTasteChange = (e) => {
    const targetTaste = e.target.name;
    if (tastes.includes(targetTaste)) {
      setTastes(() => tastes.filter((taste) => taste !== targetTaste));
    } else setTastes((prevData) => [...prevData, targetTaste]);
  };

  const handleAvailabilityAndTrustChange = (e) => {
    const targetName = e.target.name;
    switch (targetName) {
      case "all":
        setAvailabilityAndTrust((prevData) => {
          if (prevData.trust && prevData.availability) {
            return {
              trust: 0,
              availability: 0
            };
          }
          if (prevData.trust || prevData.availability) {
            return {
              trust: 1,
              availability: 1
            };
          }
          return {
            trust: 1,
            availability: 1
          };
        });
        break;
      case "availability":
        setAvailabilityAndTrust((prevData) => {
          return {
            trust: prevData.trust,
            availability: prevData.availability ? 0 : 1
          };
        });
        break;
      case "trust":
        setAvailabilityAndTrust((prevData) => {
          return {
            trust: prevData.trust ? 0 : 1,
            availability: prevData.availability
          };
        });
        break;
      default:
    }
  };

  return (
    <div>
      <div>
        <div>Taste</div>
        {tasteOptions.map((taste) => {
          return (
            <div>
              <label for={taste.label}>{taste.label}</label>
              <input
                name={taste.name}
                onChange={handleTasteChange}
                id={taste.label}
                type="checkbox"
              />
            </div>
          );
        })}
      </div>
      <br />
      <div>
        <div>Availability & Trust</div>
        {availabilityAndTrustOptions.map((option) => {
          return (
            <div>
              <label for={option.label}>{option.label}</label>
              <input
                name={option.name}
                checked={(() => {
                  switch (option.label) {
                    case "all":
                      return (
                        availabilityAndTrust.availability &&
                        availabilityAndTrust.trust
                      );
                    case "availability":
                      return availabilityAndTrust.availability;
                    case "trust":
                      return availabilityAndTrust.trust;
                    default:
                      return false;
                  }
                })()}
                onChange={handleAvailabilityAndTrustChange}
                id={option.label}
                type="checkbox"
              />
            </div>
          );
        })}
      </div>
      <br />
      <table>
        <tr>
          <th>Name</th>
          <th>Taste</th>
          <th>Trust</th>
          <th>Availability</th>
        </tr>
        {soups.map((soup) => {
          return (
            <tr>
              <td>{soup.name}</td>
              <td>{soup.taste}</td>
              <td>{soup.trust}</td>
              <td>{soup.availability}</td>
            </tr>
          );
        })}
      </table>
    </div>
  );
}

您应该使用 useState 来存储在运行时可能会发生变化并具有渲染效果的数据。

我使用 useEffect 根据选项更改来过滤表的内容。

代码沙箱:https://codesandbox.io/s/serene-shamir-lns51i

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 REACT 渲染/更新我的表? 的相关文章

随机推荐

  • 为什么我的主机 (softsyshosting.com) 不能支持 BeginRequest 和 EndRequest 事件处理程序?

    我听说了 Softsys Hosting 的一些优点 因此我决定将我的 ASP NET MVC 解决方案转移给他们 但它不会在他们身上运行 我能够将问题查明到我的 BeginRequest 事件处理程序 如果我有它们 我会得到一个错误 这是
  • 寻找数据库版本控制的解决方案

    问题描述 在我们的项目中 我们有一个 生产数据库 和许多 开发人员 我们想知道如何管理和安装这些更改 我们已经有了一些程序 但需要花费大量时间 有时还会出现错误 我们不能丢失数据 所以我们不能使用 删除表 我们只能使用 alter tabl
  • 如何在 PHP 中对数字进行四舍五入?

    我需要将所有非整数四舍五入到最接近的整数 无论 小数点后的数字是否 gt 5 您可以使用ceil value PHP 中的四舍五入函数 同样你可以利用floor 用于向下舍入
  • 如何为包含 List> 的类实现 Parcelable?

    我有一个工作Parcelable我的 Parcelable 类中的所有字段的实现 除了List
  • 从“mysqli->prepare”导出“query”

    是否可以导出格式化的查询mysqli prepare and bind param Example
  • 我的应用程序自行重新启动,日志显示 ChimeraModuleLdr:模块配置已更改,由于模块而强制重新启动

    我正在测试我的应用程序 我看到它自行重启 这真的很奇怪 我看了又看日志 除了这一行之外我找不到任何奇怪的东西ChimeraModuleLdr Module config changed forcing restart due to modu
  • 如何手动重启Jenkins?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我刚刚开始与詹金斯合作 遇到了一个问题 安装几个插件后 它说需要重新启动并进入 关闭 模式 但从未重新启动 如何手动重启 要手动重新启动 Jenkins 您可以
  • MSIL - 如何从 MSIL 调用私有方法?

    我正在编写一个 弱事件工厂 代码将任何委托转换为具有相同签名的新委托 但在目标上实现 WeakReference 我使用 MSIL 来避免调用 Delegate CreateDelegate 其性能已显示很慢 弱引用代表完美工作只要底层方法
  • SQL - COALESCE 和 ISNULL 之间的区别? [复制]

    这个问题在这里已经有答案了 COALESCE 和 ISNULL 之间有什么实际区别 在 SQL 连接中避免 NULL 值时 最好使用哪一个 Thanks 比较 COALESCE 和 ISNULL ISNULL 函数和 COALESCE 表达
  • R中求对称差(交集相反)的函数?

    问题 我有两个不同长度的字符串向量 每个向量都有一组不同的字符串 我想找到一个向量中但不在两个向量中的字符串 那就是对称差异 Analysis 我看了一下函数setdiff 但其输出取决于向量的考虑顺序 我找到了自定义函数外门 但该函数要求
  • 从四元数到欧拉角以及反向转换不正确

    我正在将角度轴表示转换为欧拉角 我决定检查并确保从转换中获得的欧拉角将返回到原始轴角 我打印出这些值 但它们不匹配 我读过了http forum onlineconversion com showthread php t 5408 and
  • Spark.read.csv() 是一个关于转换的操作吗

    Bill在 Spark权威指南 一书中说 阅读是一种转变 而且是一种狭义的转变 现在 如果我运行下面的 Spark 代码并尝试查看 Spark UI 我会看到创建的作业df spark read csv path to file 现在根据我
  • 如何防止打字时使用空格?

    我有一个文本字段用于输入一些序列号代码 我想设置此代码在有人使用 spase 时显示警报 这意味着不允许使用空格 只允许使用减号来分隔此代码 您有解决这个问题的想法吗 我可以使用jquery验证吗 the correct typing 13
  • 哪个 IOC 容器以中等信任度运行

    您好 我正在尝试运行一个使用 Mosso 运行的网站 该网站将温莎城堡作为我的 IOC 但是我收到以下错误 SecurityException That assembly does not allow partially trusted c
  • 如何增加 R 箱线图中箱线的粗细?

    如何使用基本 R 图或箱线图函数增加箱线图 箱 部分轮廓线的粗细 也就是说 如何加粗定义分位数的框线 对于这样的情节 boxplot rnorm 100 50 10 horizontal TRUE notch TRUE 我想我需要包括一个p
  • Python 2 和 Python 3 中 zip() 函数的区别[重复]

    这个问题在这里已经有答案了 我想知道两者之间有什么区别zip python 2和python 3中的函数是 我在使用时注意到timeit这两个函数的模块表明 python 3 函数要快得多 预先非常感谢 Python 2 和 Python
  • SQLite 查询从多个表中删除

    我使用查询来检索具有特定列名称的表列表 select name from sqlite master where type table and sql like unique col id 因此 它返回一个表名称列表 例如 table 1
  • 如何获取应用程序快捷方式的当前目录路径

    我想获取当前目录路径 但不是应用程序位置的路径 而是其快捷方式位置的路径 我尝试了这些 但它们返回了应用程序的位置 Directory GetCurrentDirectory Path GetDirectoryName System Ref
  • 如何在 Django Admin 中覆盖 css?

    我想更改管理 django 中的某些 css 例如base css 直接在django库里改是不是更好 我怎样才能以最好的方式覆盖它 这在很大程度上取决于你想做什么 首先 不要直接在 Django 管理中覆盖它 我认为你有两个合理的选择 如
  • 如何使用 REACT 渲染/更新我的表?

    当我点击时 我无法进行多重交叉过滤Apply 应用我从下拉列表中选择的所有选项 或Cancel按钮 重置所选选项 例如过滤条件taste and availability 请看图片 但我无法呈现过滤后的行 更新的表 export defau