【问题标题】:Why forEach if returns []?为什么 forEach 如果返回 []?
【发布时间】:2020-05-13 09:21:10
【问题描述】:

我有一个包含一些订单的数组,该数组的名称是 getOrdersBySalesman。订单有一些属性:id、client、stage。我想按阶段过滤订单,但它不起作用, 例如,当我选择“PENDENT”时,为什么 console.log 是 [] 我需要将 filterOrders 的结果发送到另一个组件,但我没有结果。怎么了????

const Comandes = () => {
  const [orderStage, setOrderStage] = useState('')

  useEffect(() => {
    setOrderStage(orderStage)
  }, [orderStage])

  let filterOrders = []

  const filterStage = newStage => {
    getOrdersBySalesman.forEach(order => {
       if (order.stage === newStage) {
        filterOrders.push(order)
      }
    });
    setOrderStage(newStage)
  }
  console.log(filterOrders) = > IS []

  return (
    <div>
      <Layout>
        <select
          value={orderStage}
          onChange={e => filterStage(e.target.value)}
        >
          <option value="TOTS ELS ESTATS">TOTS ELS ESTATS</option>
          <option value="ACABADA">ACABADA</option>
          <option value="PENDENT">PENDENT</option>
          <option value="CANCELADA">CANCELADA</option>
        </select>
      {filterOrders.length === 0 ? (
          <p className="mt-5 text-center text-2xl">Encara no hi ha comandes </p>
        ) : (filterOrders.map(order => (
          <Order key={order.id} order={order} />
        ))
          )}
      </Layout>
    </div >
  )
}
export default Comandes

【问题讨论】:

  • filterOrders 将在&lt;select&gt;onChange 事件上更改,直到那时它是您定义的[]

标签: reactjs if-statement foreach react-hooks


【解决方案1】:

实际上Array#forEach 不会返回任何内容,它只会在selectonChange 事件上运行。所以你应该等待更改select。此外,为了获得更好的性能,您应该使用Array#filteruseState 挂钩,而不是声明变量并使用Array#forEach

所以你的最终代码应该是这样的:

const [filterOrders , setFilterOrders ] = useState([])

const filterStage = (newStage) => {
  setFilterOrders(getOrdersBySalesman.filter(
    (order) => order.stage === newStage
  ));
  setOrderStage(newStage);
};

useEffect(()=> {
  console.log(filterOrders);
}, [filterOrders]);

【讨论】:

  • 我不工作,当我选择例如:“PENDENT” filterOrders return []。但是如果我将 console.log(filterOrders) 放在 setOrderStage(newStage) 之后,我就会得到结果......: setOrderStage(newStage); console.log(filterOrders) };
  • @ccnat 首先,最好使用useState 挂钩而不是声明一个变量,然后将console.log 放在useEffect 挂钩上。第二件事是,它可能在几件事上有所不同,如果您使用codesandbox.io 提供现场演示,我们可能更容易告诉您问题所在。请检查更新。
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多