当前位置: 首页 > 知识库问答 >
问题:

更新React应用程序中的状态,将旧数组替换为新的已排序对象数组

许焕
2023-03-14

我是个新手,刚刚开始学习。我试图根据产品的价格对对象进行排序。但是当我尝试更新状态时,它不会改变,尽管当我更新控制台时。log()我可以看到分类后的产品,但它根本不会在屏幕上更新。我在下面附上代码。任何帮助都将不胜感激。

当我打开应用程序时。我看到了我所有的产品。但是,当我使用选择框对产品进行排序时,它只会显示相同的产品,而不进行排序。事件被触发。但我怀疑我更新状态的方式是错误的。


import './main.css'
import Filters from './components/Filters'
import Products from './components/Products'
import { useState } from 'react';


function App() {
  const [products,setProducts]=useState([
    {product_id:'1',product_name:"Razer Deathadder expert ergonomic mousepad",product_price:"20",product_path:"img/razer-deathadder-expert-ergonomic-original-imaf2z3xngbchfaz.jpeg"},
    {product_id:'2',product_name:"Zotac gtx 1080 graphics card",product_price:"320",product_path:"img/grap.jpg"},
    {product_id:'3',product_name:"Kingston 250 gb SSD ",product_price:"90",product_path:"img/ssd.jpg"},
    {product_id:'4',product_name:"Ryzen Processor",product_price:"250",product_path:"img/ry.jpg"}
    ]);


   let sortedProducts=[]
    const sortProducts=(e)=>{
      const sortBy=String(e.target.value);
      switch(sortBy){
      case 'plh': // sorting based on price low to high
      sortedProducts=products.sort((x,y)=>{
      return Number(x.product_price)-Number(y.product_price);
      });
      setProducts(sortedProducts); // I'm chaning the state here with my newly sorted array but its not rendering on screen
      break;
      case 'phl':
      sortedProducts=products.sort((x,y)=>{
      return Number(y.product_price)-Number(x.product_price);
      });
      setProducts(sortedProducts); // I'm chaning the state here with my newly sorted array but its not rendering on screen
      break;
      }
    }
   
  return (
    <div className="App">
      <div className="container">
      <Filters sortProducts={sortProducts}/>
      <Products products={products} />
      </div>
    </div>
  );
}

export default App;

这是产品组件

import Product from './Product'

function Products({products}) {
    return (
        <div className="product-container">
         {products.map(element => (
         <Product product={element}/>
    ))}
        </div>  
    );
  }
  
  export default Products;
  

共有1个答案

卓嘉良
2023-03-14

您需要使用点差运算符设置排序产品的状态

尝试:-

setProducts([...sortedProducts]);

请参阅演示

 类似资料:
  • 问题内容: 我处于状态的对象数组: 我需要能够基于id属性搜索items数组,然后更新对象属性。 我可以使用id参数通过数组或在数组上获取对象。 我遇到的麻烦是更新数组,然后更新状态而不会发生突变。 此时,我有一个匹配的对象,可以使用对象传播来更新它的属性: 我的问题是我该如何更新状态,以使其覆盖初始查找操作返回的对象? 问题答案: 您的更新功能如下所示 你这样使用它 毛吧? 如果您继续以这种方式

  • 问题内容: 我有一个称为状态的对象数组。 说我有功能 这里的问题是,每次调用时,整个数组都会更新,因此整个DOM都将重新呈现。在我的情况下,这导致浏览器冻结,因为我几乎每秒都要调用此函数,并且有很多对象。但是,在每次通话中,实际上仅更新其中一个或两个设备。 我有什么选择? 编辑 在我的确切情况下,a 是一个定义如下的对象: 因此,数组中的每个项目都是this的特定瞬间,即我所拥有的某个地方: 我更

  • 问题内容: 我已经检索了使用useState存储在对象数组中的数据,然后将这些数据输出到表单字段中。现在,我希望能够在键入时更新字段(状态)。 我看过一些例子,说明人们在更新数组中属性的状态,但是从不更新对象数组中的状态,所以我不知道该怎么做。我已经将对象的索引传递给了回调函数,但是我不知道如何使用它来更新状态。 问题答案: 这是您的操作方式:

  • 我正在尝试学习React(使用redux),所以我正在制作一个应用程序,在其中我可以创建训练计划,将训练添加到计划中,然后将训练添加到训练中。 PlanListComponent 我的PlansList组件为每个计划呈现一张卡片。在这张卡片中,它为该计划中的每个训练呈现一个训练列表。将训练添加到计划后,“计划列表”组件不会重新渲染。添加的训练仅在我刷新页面后显示。我之所以选择这种情况,是因为我必须

  • 我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?

  • 问题内容: 我正在尝试仅更新数组状态中的一个元素,但不确定如何执行此操作。 State 设定状态 如果我想更改标记的第四个元素中的键,该怎么做? 谢谢 问题答案: 重要的一点是,我们不应该直接更改状态数组,而要始终在新数组中进行更改,然后使用setState更新状态值。 如 Doc 建议: 切勿直接更改this.state,将this.state视为不可变。 更新状态数组的基本流程是: 1- 首先