热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

React钩子替换旧状态

如何解决《React钩子替换旧状态》经验,为你挑选了1个好方法。

我正在学习有关在反应钩子和我正在经历的例子由academind,

那里的作者提到过这样的事情

当您使用React Hooks设置新状态时(即在我们的示例中通过setCart),旧状态将始终被替换!

与以下示例:

import React, { useState } from 'react'

const Shop = props => {
  const [cart, setCart] = useState([])
  const cartHandler = () => {
    setCart(['A Book'])
  }
  return 
}

我无法理解这一点。

在带有状态的类中,如果执行setState,它也会替换旧的状态,因此作者在这里试图表示什么?

在本文的后面,是这样的

如果它是一个对象,请记住,React在设置它时不会将您的旧状态与新状态合并。您将始终覆盖旧状态,因此可能需要您进行任何合并!

这听起来与我们在类baed组件中执行的setState非常相似



1> SuleymanSah..:

当您调用setState()时,React将您提供的对象合并到当前状态。

使用useState更新时,状态变量总是替换它而不是合并它。

我将尝试用一个示例来解释:

state = {
    name: "Michael",
    surname: "Jackson"
}

this.setState({
    name: "Bill"
})

在这里,在setState之后,姓氏不会丢失其值(因为setState合并了),所以state如下所示:

{
   name: "Bill",
   surname: "Jackson"
}

但是如果我们用钩子来做:

setUser({
  name: "Bill"
})

姓氏丢失了,所以状态是这样的:

{
  name: "Bill"
}

为了保留姓氏,我们可以使用传播运算符复制旧状态。

setUser({
  ...user,
  name: "Bill"
});

一个完整的例子:

function App() {
  const initialState = { name: "Michael", surname: "Jackson" };

  const [user, setUser] = useState(initialState);

  const handleClickWrOng= () => {
    setUser({
      name: "Bill"
    });
  };

  const handleClickCorrect = () => {
    setUser({
      ...user,
      name: "Bill"
    });
  };

  const handleClickReset = () => {
    setUser(initialState);
  };

  return (
    

{JSON.stringify(user)}
); }

代码框:

https://codesandbox.io/s/hook-not-merging-state-cqj2g


推荐阅读
author-avatar
独坤2602884605
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有