React突变状态,更新数据(对象或者数组),页面数据不刷新的问题

这篇具有很好参考价值的文章主要介绍了React突变状态,更新数据(对象或者数组),页面数据不刷新的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

React 突变状态

​ 刚开始开发时,我们可能会遇到这样的问题,使用useState创建对象或者数组时,setState时,页面未进行更新。这里其实是一个突变状态的问题

  • 什么是突变状态?

    ​ 当我们给setState一个基本数据类型时,state值将会是一个不可变的值

    ​ 更新时,state原始值也不会被更改,而是重新创建一个不可变的的基本数据类型,以触发重新渲染

  • 为什么React不推荐突变状态?

    • 调试:如果你使用console.log 并且不改变状态,你过去的日志将不会被最近的状态破坏修改,你可以清楚的看到渲染之间的状态变化

    • 优化:如果之前的propsstate和下一个状态相同,常见的react优化策略将会跳过本次渲染,如果你从不改变状态,检查变化就会非常的快,如果prevProps === props,react就可以确定它内部并没有发生变化

    • 新功能:react正在构建的新功能依赖将状态视为快照,如果你正在更新过去的状态版本,这会导致无法使用新功能

    • 需求变更:一些需要撤销/重做和显示历史记录的值,在没有突变的情况下更容易执行,这是因为你可以将过去的值保存在副本中,并在适用的情况下重做他们

    • 更简单的实现:因为react不依赖突变,所以它不需要对你的对象做任何处理,不需要劫持你的对象。总是将它们包装到代理中,或者在初始化时像许多“反应式”解决方案那样做其他工作。这也是为什么 react 允许您将任何对象置于状态(无论有多大)而没有额外的性能或正确性陷阱。

  • 如何更合理的更新对象或者数组

    看这样一段代码:

    import React from "react";
    import ShoppingList from './ShoppingList';
    import NewItemForm from './NewItemForm';
    function App({
        const [items,setItems] = React.usestateC['apple','banana']);
        function handleAddItem(value) {
            items.push(value);
        	setItems(items);
        }
        return (
            <div>
            	{items.length > 0 && <ShoppingList items={items}/>}
                <NewItemForm handleAddItem={handleAddItem}/>
            </div>
        )
    }
    export default App;
    

    ​ 每当增加一个新项目时,handleAddItem 函数就会被调用。但是,它并不起作用!当我们输入一个项目并提交表单时,该项目没有被添加到购物清单中

    ​ 问题就在于我们违反了 React 中最核心的原则 —— 不可变状态React依靠一个状态变量的地址来判断状态是否发生了变化。当我们把一个项目推入一个数组时,我们并没有改变该数组的地址,所以 React 无法判断该值已经改变。从技术上讲可以改变对象或者数组本身的内容,我们将其称之为突变,然而,react的状态在技术上是可变的,但react仍然推荐使用不可变的方式去改变react的状态。像基本数据类型一样,去始终替换他们,而不是去改变他们

    正确的做法:

    function handleAddItem(value) {
      const nextItems = [...items, value];
      setItems(nextItems);
    }
    

    ​ 不建议修改一个现有的数组,而是从头开始创建一个新的数组。这里的区别在于编辑一个现有的数组和创建一个新的数组之间的区别。

    ​ 同样的,对于对象类型的数据也是:文章来源地址https://www.toymoban.com/news/detail-502373.html

    // ❌ 不建议
    function handleChangeEmail(nextEmail) {
      user.email = nextEmail;
      setUser(user);
    }
    
    // ✅ 推荐
    function handleChangeEmail(email) {
      const nextUser = { ...user, email: nextEmail };
      setUser(nextUser);
    }
    

到了这里,关于React突变状态,更新数据(对象或者数组),页面数据不刷新的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React 18 state 状态更新函数

    参考文章 设置组件 state 会把一次重新渲染加入队列。但有时可能会希望在下次渲染加入队列之前对 state 的值执行多次操作。为此,了解 React 如何批量更新 state 会很有帮助。 在下面的示例中,可能会认为点击 “+3” 按钮会使计数器递增三次,因为它调用了 setNumber(number +

    2024年02月13日
    浏览(39)
  • 解决刷新或者重新点击导航栏,对应的侧边栏选中状态丢失或TAB页面与选中状态不符合

     一:解决刷新时,侧边栏选中状态丢失或者选中状态与TAB页面不符合。 select 菜单激活回调 index: 选中菜单项的 index, indexPath: 选中菜单项的 index path default-active 当前激活菜单的 index string — — 1.给菜单绑定一个属性为activeMenu 2.在data中定义一个activeMenu的初始值为第一个选项或

    2024年02月12日
    浏览(56)
  • React中使用react-router-cache-route缓存页面状态

    在开发中,从A页面跳转到other页面,再返回A页面时react-router会直接刷新页面,导致A页面中已加载的海量数据状态丢失,需要重新加载,用户体验不佳,所以必须将海量数据状态进行缓存。 (在小编的实际场景中,A页面是一堆模型业务数据标注点,由于模型永远不会更改,但

    2023年04月13日
    浏览(43)
  • react 实现页面状态缓存(keep-alive)

    因为 react、vue都是单页面应用,路由跳转时,就会销毁上一个页面的组件。但是有些项目不想被销毁,想保存状态。 比如:h5项目跳转其他页面返回时,页面状态不丢失。设想一个 页面我滑倒了中间,然后跳转到 详情页然后 返回,之前的页面刷新了,回到顶部了肯定不行(

    2024年01月23日
    浏览(45)
  • React 18 更新 state 中的数组

    参考文章 数组是另外一种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可变。同对象一样,当想要更新存储于 state 中的数组时,需要创建一个新的数组(或者创建一份已有数组的拷贝值),并使用新数组设置 state。 在 JavaScript 中,数组只是另一

    2024年02月12日
    浏览(36)
  • React 18 更新 state 中的对象

    参考文章 state 中可以保存任意类型的 JavaScript 值,包括对象。但是,不应该直接修改存放在 React state 中的对象。相反,当想要更新一个对象时,需要创建一个新的对象(或者将其拷贝一份),然后将 state 更新为此对象。 可以在 state 中存放任意类型的 JavaScript 值。 在 state

    2024年02月13日
    浏览(52)
  • React 状态管理:安全高效地修改对象属性的 3 种方法

    在 React 应用程序中,状态(state)是驱动整个应用程序的核心。当应用程序的状态发生变化时,React 会自动重新渲染相应的组件,以确保用户界面的更新。 与数组状态一样,对象状态在 React 中也需要特别处理。直接修改对象属性是不被允许的,因为 React 的不可变性原则要求我们创建一

    2024年04月10日
    浏览(39)
  • MongoDB 更新文档(更新数组对象中的元素)

    之前我们介绍了如何更新文档,并简单的介绍了更新文档时可以使用选项进行指定当更新内容不存在时,可以进行新增文档。具体可以参考: MongoDB 更新文档(更新一条文档) https://blog.csdn.net/m1729339749/article/details/129983304 最近遇到了一个需求,文档中包含了一个数组对象, 需要

    2024年02月13日
    浏览(41)
  • 微信小程序 - 最新超详细 watch 侦听器功能,支持监听对象、数组及各种复杂对象数据,可在任意页面或组件中使用(绝非网上千篇一律的 “setWatcher“ 不能监听对象的垃圾方法,方案开箱即用)

    网上的教程全都是一摸一样的 setWatcher(this) 方案,重要的是这种方案不能监听对象,可以说一无是处。 本文 在微信小程序中实现 watch 监听器监听数据的功能,让小程序拥有 watch 监听对象、数组等复杂数据变化的能力, 您按照教程几分钟就能搞定,保证 100% 好用且使用方法

    2024年02月11日
    浏览(125)
  • 【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及数据 基于

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包