javascript - 使用扩展运算符复制数组状态并添加所有匹配的对象

标签 javascript reactjs

我正在尝试将与正则表达式匹配的所有对象排序到一个数组中。 这似乎不适用于展开运算符和 useState,有什么办法可以做到这一点吗? 我现在得到的结果是样本只给我最后一个与其匹配的对象,而没有其他任何东西。 我想要的效果是所有匹配的样本都被插入样本状态。

  const [accessories, setAccessories] = useState([]);
  const [paints, setPaints] = useState([]);
  const [samples, setSamples] = useState([]);

  // Load order into state
  useEffect(() => {
    loadUser();
    getOrderById(match.params.orderId);
  }, []);

  // Load order into state
  useEffect(() => {
    if (!loading) {
      console.log(order.line_items);
      for (let i = 0; i < order.line_items.length; i++) {
        if (order.line_items[i].sku.match(/^(TAC|T.BU.AC)/)) {
          console.log('SKU: ', order.line_items[i].sku);
          //@ts-ignore
          setAccessories([...accessories, order.line_items[i]]);
          console.log(accessories);
        }
        if (order.line_items[i].sku.startsWith('TBA') || order.line_items[i].sku.match(/^TCR(?!0000)/)
          || order.line_items[i].sku.match(/^TCR0000/)) {
          //@ts-ignore
          setPaints([...paints, order.line_items[i]]);
        }
        if (order.line_items[i].sku.match(/^TCR\d+P?\d+SAMP/)) {
          console.log(samples);
          console.log(order.line_items[i]);
          //@ts-ignore
          setSamples([...samples, ...[order.line_items[i]]]);
        }
      }
    }
  }, [loading]);

最佳答案

嗯,你在这里犯了一些错误。

错误1:

使用 for 循环在单个 useEffect block 内多次调用相同的 setStates 方式,这可能会极大地影响 React 的性能。再次强调,这显然违反了 Rules of Hooks 仅在顶层调用 Hook

Only Call Hooks at the Top Level

Don’t call Hooks inside loops, conditions, or nested functions.

错误2:

虽然这没有以前那么严重,但它仍然是一个错误。不使用更好的解决方案,使用内置的 JavaScript 方法,例如 filter,而不是编写自己的 for 循环

useEffect(() => {
  let _accessories;
  let _paints;
  let _samples;

  if (!loading) {
    _accessories = order.line_items.filter(({ sku }) => sku.match(/^(TAC|T.BU.AC)/))

    _paints = order.line_items.filter(({ sku }) => sku.startsWith('TBA') || sku.match(/^TCR(?!0000)|^TCR0000/))

    _samples = order.line_items.filter(({ sku }) => sku.match(/^TCR\d+P?\d+SAMP/))

    // Never use setState inside a for loop
  // of useEffects
  // Also avoid calling same setState multiple times

  // use callback setState if you want to access
  // previous state, but it ain't a compulsory like
  // for class components
  setAccessories(s => [ ...s, ..._accessories ])
  setPaints(s => [ ...s, ..._paints ])  
  setSamples(s => [ ...s, ..._samples ])
  } 

  // return in useEffect has different role
  // than normal functions

}, [loading])


关于javascript - 使用扩展运算符复制数组状态并添加所有匹配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60860148/

相关文章:

reactjs - 类型 'unknown[]' 缺少类型 'InitialState' 的以下属性

javascript - 悬停时停止或暂停自动滚动功能

reactjs - ChartJS不根据x轴数据渲染线条

javascript - 想在 native react 中自动滚动平面列表

javascript - 在 Javascript/Jquery 中将 URL 图像转换为 Base64 或 Blob 的简单方法

reactjs - 如何添加 HubSpot 聊天以响应 js 应用程序?

javascript - 使用 Found router w/React 进行自定义重定向

javascript - 如何使用 angularjs 获取用户所属的安全组列表

javascript - 移除 JavaScript 行为

javascript - 在哪里调用 for 循环来迭代值数组