只需更改状态对象属性,是否可以触发ReactJs组件重新渲染?

Cheng Xu

我正在学习ReactJs,尝试使用useStateand useContexthook时遇到了一些问题似乎仅在存在参考更改而不是值更改的情况下才会进行重新渲染。以下面的代码为例:

https://stackblitz.com/edit/react-ts-4gw3h1

class Counter {
   count: number;
   constructor(count: number) {
     this.count = count;
   }
   
   increase() {
     this.count += 1;
   }
}

export const CountComponent : FC = (props) => {
   //const [count, setCount] = useState(0); // work
   //const [count, setCount] = useState({0}); // work
   const [counter] = useState(new Counter(0)); // not work

   const doAdd = () => {
      counter.increase();
      console.log(counter.count);
   }
    
   // this will not actually re-render 
   return (<div>{counter.count}<button onClick={doAdd}>+</button></div>);
}

单击按钮时,计数增加了,但是呈现的值没有更新。我在那里错过了什么吗?有没有一种方法可以让组件监视状态对象属性的变化?

编辑

我想我已经将人们与这个问题的意图混淆了。考虑一个更复杂的用例,其中我有一个复杂的状态对象。请原谅我的伪代码:

class Cargo {
    orders: Map<string, Products[]>;
    totalValue: number;
    totalNumber: number;

    addProduct(product: Product) {
      // ignore the null check here.
      this.orders.get(product.owner).push(product);
      this.totalValue += product.value;
      this.totalNumber ++;
    }
}

class Product {
   owner: string;
   name: string;
   value: number;
}

const CargoContext = createContext(new Cargo());

const CargoContext = createContext({... new Cargo(), setTotalValue, setTotalNumber});

// lost the OO
const {orders, totalValue, totalNumber, setTotalValue, setTotalNumber} = useContext(CargoContext);

const doAdd = (product: Product) => {
   orders.get(product.owner); 
   setTotalValue(product.value);
   setTotalNumber(totalNumber + 1);
}

以这种方式创建上下文时,我将无法实际更新状态。根据我的阅读,使之起作用的唯一方法是解构Cargo对象并传递属性和调度程序。但这失去了面向对象CargoaddProduct接口。如何更优雅地处理此案?

破裂的

当处理这种复杂状态时,最好使用useReducer与您的货物示例一起,它会像

interface CargoState {
    orders: Map<string, Products[]>;
    totalValue: number;
    totalNumber: number;
}

const cargoReducer = (state: CargoState, action): CargoState => {
   switch (action.type) {
       case 'add-product': {
           const newOrders = state.orders;
           newOrders.get(action.product.name).push(action.product);

           return {
               ...state,
               orders: newOrders,
               totalValue: state.totalValue + product.value,
               totalNumber: state.totalNumber++,
           }
       }
       default: return state;
    }
}



const [state, dispatch] = useReducer(cargoReducer, [some initial state here]);


dispatch({ type: 'add-product', product });

可以正确键入操作,因此您不会丢失任何键入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改对象属性时触发组件重新渲染

来自分类Dev

reactjs-更改状态不会重新渲染组件

来自分类Dev

当状态是对象的对象时组件重新渲染

来自分类Dev

状态更改后从子组件重新渲染

来自分类Dev

更改存储状态后重新渲染组件

来自分类Dev

状态更改不重新渲染组件

来自分类Dev

由于父级重新渲染,ReactJS计算组件道具更改时的状态

来自分类Dev

React / react钩子:状态更改后子组件是否未重新渲染?

来自分类Dev

路由更改时,是否可以避免重新渲染父路由处理程序组件?

来自分类Dev

在ReactJS中将子对象重新渲染3次是否可以接受?

来自分类Dev

在ReactJS中将子对象重新渲染3次是否可以接受?

来自分类Dev

如何在ReactJS中触发模型更改的重新渲染?

来自分类Dev

如何在ReactJS中触发模型更改的重新渲染?

来自分类Dev

在React中重新渲染子组件或更改子状态

来自分类Dev

状态更改后,Redux反应不重新渲染组件

来自分类Dev

当 prop 更改时,无状态组件不会重新渲染

来自分类Dev

数组属性更改时,React子组件不会重新渲染

来自分类Dev

reactjs表示组件在redux状态更改时未重新呈现

来自分类Dev

组件不重新渲染-ReactJS

来自分类Dev

在数组中,在 React 组件的状态中渲染对象的属性

来自分类Dev

React组件道具的更改是否会导致重新渲染?

来自分类Dev

ReactJs / Typescript:使组件状态对象和属性为只读

来自分类Dev

当RN 0.61中的状态更改时,如何从主组件中重新渲染子组件?

来自分类Dev

当父组件状态更改时,React路由组件会重新渲染

来自分类Dev

反应组件不会在父组件 firebase 的状态更改时重新渲染

来自分类Dev

更新减速器中的状态如何触发组件的重新渲染?

来自分类Dev

只需更改.SQL属性,为什么还要删除并重新创建querydef对象?

来自分类Dev

当状态改变时,是否反应不依赖状态的重新渲染组件?

来自分类Dev

强制反应功能组件触发重新渲染

Related 相关文章

  1. 1

    更改对象属性时触发组件重新渲染

  2. 2

    reactjs-更改状态不会重新渲染组件

  3. 3

    当状态是对象的对象时组件重新渲染

  4. 4

    状态更改后从子组件重新渲染

  5. 5

    更改存储状态后重新渲染组件

  6. 6

    状态更改不重新渲染组件

  7. 7

    由于父级重新渲染,ReactJS计算组件道具更改时的状态

  8. 8

    React / react钩子:状态更改后子组件是否未重新渲染?

  9. 9

    路由更改时,是否可以避免重新渲染父路由处理程序组件?

  10. 10

    在ReactJS中将子对象重新渲染3次是否可以接受?

  11. 11

    在ReactJS中将子对象重新渲染3次是否可以接受?

  12. 12

    如何在ReactJS中触发模型更改的重新渲染?

  13. 13

    如何在ReactJS中触发模型更改的重新渲染?

  14. 14

    在React中重新渲染子组件或更改子状态

  15. 15

    状态更改后,Redux反应不重新渲染组件

  16. 16

    当 prop 更改时,无状态组件不会重新渲染

  17. 17

    数组属性更改时,React子组件不会重新渲染

  18. 18

    reactjs表示组件在redux状态更改时未重新呈现

  19. 19

    组件不重新渲染-ReactJS

  20. 20

    在数组中,在 React 组件的状态中渲染对象的属性

  21. 21

    React组件道具的更改是否会导致重新渲染?

  22. 22

    ReactJs / Typescript:使组件状态对象和属性为只读

  23. 23

    当RN 0.61中的状态更改时,如何从主组件中重新渲染子组件?

  24. 24

    当父组件状态更改时,React路由组件会重新渲染

  25. 25

    反应组件不会在父组件 firebase 的状态更改时重新渲染

  26. 26

    更新减速器中的状态如何触发组件的重新渲染?

  27. 27

    只需更改.SQL属性,为什么还要删除并重新创建querydef对象?

  28. 28

    当状态改变时,是否反应不依赖状态的重新渲染组件?

  29. 29

    强制反应功能组件触发重新渲染

热门标签

归档