如何取回被过滤的数据(React Context API)

2024-04-18

我正在使用reactjs、ReactContextAPI、apexChart 创建一个仪表板应用程序,其中 1000 长度的 JSON 数据将在 7-8 个不同的图表上可视化,并且包含 6-7 个变量过滤器。

关于应用程序结构的基本想法:

  • DefaultContext 将有 1000 个对象数组
  • 数据将同步到整个组件树。

两个主要子组件是:

  • 过滤器组件 (它过滤 DefaultContext 数据)
  • 图表组件 (它消耗 DefaultContext 数据)

树的例子:

面临的问题:假设过滤器组件添加了一个过滤器,并从过滤器中删除了一些数据默认上下文数据以便可以同步到图表组件.

现在我很困惑,如果我们删除过滤器,我将如何取回数据(之前已从 DefaultContext 中删除)。

我有多少种方法可以更好地实现它?


解决方案很简单not首先过滤你的真相来源。这意味着不过滤存储在 Context 提供程序中的原始状态,而是在下游渲染时内联过滤它。

状态应该是您的状态的最小表示,不包括派生状态。什么是派生状态?将过滤后的结果视为源自actual state and一些过滤标准。您已经将状态存储在上下文中,因此您现在还需要将过滤存储在状态中(某个地方,其实并不重要)。当您想要“恢复”原始状态时,您可以清除过滤条件,以便不再过滤数据源。

Example:

在这个例子中data位于对其进行过滤的组件外部。这是为了表示“状态”与过滤器状态的分离以及导出的过滤结果。

const data = [
  {
    id: "1",
    color: "red",
    shape: "round"
  },
  {
    id: "2",
    color: "green",
    shape: "round"
  },
  {
    id: "3",
    color: "red",
    shape: "square"
  },
  {
    id: "4",
    color: "green",
    shape: "square"
  },
  {
    id: "5",
    color: "blue",
    shape: "square"
  }
];


function App() {
  const [color, setColor] = React.useState("");
  const [shape, setShape] = React.useState("");

  return (
    <div className="App">
      <div className="container">
        {data
          .filter((el) => {
            if (color && shape) {
              return color === el.color && shape === el.shape;
            }
            if (color || shape) {
              return color === el.color || shape === el.shape;
            }
            return true;
          })
          .map((el) => (
            <div
              key={el.id}
              className={clsx("item", {
                red: el.color === "red",
                green: el.color === "green",
                blue: el.color === "blue",
                round: el.shape === "round"
              })}
            >
              <p>{el.color}</p>
              <p>{el.shape}</p>
            </div>
          ))}
      </div>
      <div>
        <label>
          Shape
          <select value={shape} onChange={(e) => setShape(e.target.value)}>
            <option value="">All</option>
            <option value="square">Square</option>
            <option value="round">Round</option>
          </select>
        </label>
        <label>
          Color
          <select value={color} onChange={(e) => setColor(e.target.value)}>
            <option value="">All</option>
            <option value="red">Red</option>
            <option value="green">Green</option>
            <option value="blue">Blue</option>
          </select>
        </label>
        <button
          type="button"
          onClick={() => {
            setColor("");
            setShape("");
          }}
        >
          Reset
        </button>
      </div>
    </div>
  );
}

const rootElement = document.getElementById("root");
const root = ReactDOM.createRoot(rootElement);

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
.App {
  font-family: sans-serif;
  text-align: center;
}

.container {
  display: flex;
  gap: 1rem;
  padding: 1rem;
  justify-content: center;
}

.item {
  border: 1px solid;
  height: 6rem;
  width: 6rem;
}

.round {
  border-radius: 50%;
}

.red {
  background-color: red;
}

.green {
  background-color: green;
}

.blue {
  background-color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/clsx.min.js"></script>
<div id="root" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取回被过滤的数据(React Context API) 的相关文章

随机推荐