这是否意味着我做错了什么?

我以为严格模式是为了帮助你发现副作用.

如果我关闭严格模式,我会正确更新数量(每次点击一次).在严格模式下,每次点击都会更新两次.在本例1中,它说明了在updateItem中使用Class方法更新数量时,在打开严格模式时每次单击两次的行为:

class ItemModel {
  id: number
  quantity: number
  name: string

  constructor(name: string) {
    this.id = Math.random()
    this.quantity = 1
    this.name = name
  }

  increaseQuantity = () => {
    this.quantity = this.quantity + 1
    return this
  }
  decreaseQuantity = () => {
    this.quantity = this.quantity >= 2 ? this.quantity - 1 : 1
    return this
  }
}

....

  const [items, setItems] = useState<ItemProps[]>([])

....

  const updateItem = (id: number) => {
    setItems(items => items.map(item => (item.id === id ? { ...item.increaseQuantity() } : item)))
  }

....

<button type="button" onClick={() => updateItem(id)}>+ 1</button>

updateItem个中的例2中,使用严格模式,我得到了正确的行为(每次点击更新一次数量):

  const updateItem = (id: number) => {
    setItems(items => items.map(item => (item.id === id ? { ...item, quantity: item.quantity + 1 } : item)))
  }

在这两个示例中,即打开严格模式的示例1和示例2,我向数组返回一个新的更新、非Mutations 对象,那么为什么当我在示例1中使用类方法更新数量时,与在示例2中手动更新数量时,我会得到不同的行为.

推荐答案

Inbox Mode在示例1中发现了不纯的重新渲染,其原因是:

...item.increaseQuantity()

您认为这会创建一个数量增加的新对象.

这实际上是创建一个数量增加的新对象100

我正在向数组返回一个新的已更新、未Mutations 的对象

不,你已经变异了item个.

你的ItemModel是一种糟糕的react 方式--尽可能使用普通物体.

Reactjs相关问答推荐

InfiniteScroll持续获取数据,直到超过最大更新深度

ReferenceError:未在Redux组件中定义窗口

使用Overpass API Endpoint计算 map 上的面积

后端关闭时如何在REACTION AXIOS拦截器中模拟数据?

以下代码是否存在安全问题?

下拉Tailwind CSS菜单与怪异beviour

如何使Reaction Select 选项菜单从选项数组的特定索引开始

Reaction上下文值无法传递给其他组件

错误:操作必须是普通对象.使用自定义中间件进行异步操作. Redux/工具包

如何使用服务器中的数据自动填充表单字段?

React Context API 在 Next.js 中更改路由时获取默认数据

提前输入错误:选项类型上不存在属性名称

如何将 DocuSign 控制台界面嵌入到 React 应用中

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

如何在 React 过滤器中包含价格过滤器逻辑?

React Native 背景动画反转

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

react 事件顺序

在 Reactjs 中状态发生变化时渲染一个新组件而不替换旧组件

将 set statehook 函数传递给子路由组件.解构错误