上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

【提问】关于React的setState的可变性问题

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5187

    回帖

    6069

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6069

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-10-30 07:50:08 | 显示全部楼层 | 阅读模式
    悬赏20油猫币已解决

    最近刚开始学习react
    关于setstate网上资料说不要直接改变状态
    但是根据网上的一些例子以及资料来看
    是否是【不允许在不改变state对象的顶层属性的情况下修改属性内的数据】
    如现在有一个state为

    a:{
        b:{
                c:{
                        d"1                
                   }
            }
    }

    a必须是不可变的,我们需要重新赋值一份
    但是b,c,d应该都是可以直接设置改变的吧
    看资料PureComponet和memo也都是做了一个浅层的比较来做渲染优化
    那理论来说我直接拷贝一下a对象内的属性
    然后copy_a.b.c.d=1
    这样顶层的引用出现变化,触发了浅比较来做渲染
    但是内部的属性没有进行重新拷贝
    也是符合react开发规范的对吗

    最佳答案

    查看完整内容

    要看你是浅拷贝还是深拷贝吧,如果是类似这样的写法: 这种属于浅拷贝,即copy_a.b与a.b指向同一引用,那你对其下属性的修改就会影响双方,这种应该就不符合规范。
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1360

    积分

    荣誉开发者

    积分
    1360

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-10-30 07:50:09 | 显示全部楼层
    要看你是浅拷贝还是深拷贝吧,如果是类似这样的写法:
    1. const copy_a = {...a};
    复制代码

    这种属于浅拷贝,即copy_a.b与a.b指向同一引用,那你对其下属性的修改就会影响双方,这种应该就不符合规范。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    112

    主题

    447

    回帖

    964

    积分

    荣誉开发者

    积分
    964

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2022-10-30 11:04:07 | 显示全部楼层
    嘿嘿,感觉道哥应该说的是改变对象的状态吧,对象的状态要{...obj}好像是,useMeno,useCallback这种优化阶段的一不用就忘记了。
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5187

    回帖

    6069

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6069

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-10-30 11:53:48 | 显示全部楼层
    wwwwwllllk 发表于 2022-10-30 11:04
    嘿嘿,感觉道哥应该说的是改变对象的状态吧,对象的状态要{...obj}好像是,useMeno,useCallback这种优化阶 ...


    想表达的意思是我知道state的第一层是必须要改变的
    但是他的子属性是不是只需要改状态,不用重新拷贝也是符合开发规范
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    112

    主题

    447

    回帖

    964

    积分

    荣誉开发者

    积分
    964

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2022-10-30 12:59:59 | 显示全部楼层
    李恒道 发表于 2022-10-30 11:53

    想表达的意思是我知道state的第一层是必须要改变的
    但是他的子属性是不是只需要改状态,不用重新拷贝 ...

    感觉这种情况不用考虑吧,如果是一些对象嵌套多层的情况。要不然就是前端写死不经常改变的数据。如果是后端返回。setState绝对是一个新的对象,页面肯定会重新渲染。只有出现定义一个对象 ,然后setState的是这个对象名,这个时候就要考虑是否监听到对象里面的属性发生变化了。
    道哥可以去读下源码,然后分享一下,我学习一下。
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5187

    回帖

    6069

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6069

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-10-30 14:26:23 | 显示全部楼层
    wwwwwllllk 发表于 2022-10-30 12:59
    感觉这种情况不用考虑吧,如果是一些对象嵌套多层的情况。要不然就是前端写死不经常改变的数据。如果是后 ...

    我也想
    呜呜呜
    react语法都没摸清
    有点看不懂源码
    感觉vue调试更简单一点
    顺着入口一路看就7788
    react看一眼就恐惧
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5187

    回帖

    6069

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6069

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-10-31 05:22:55 | 显示全部楼层
    cxxjackie 发表于 2022-10-30 20:37
    要看你是浅拷贝还是深拷贝吧,如果是类似这样的写法:

    这种属于浅拷贝,即copy_a.b与a.b指向同一引用,那 ...

    懂了...
    国内国外好多人都直接尝试修改state再用setstate设置回去...
    不过如果state是完全不可变的
    那比较深层的变量的修改不是火葬场了....
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    59

    回帖

    88

    积分

    初级工程师

    积分
    88
    发表于 2022-10-31 10:04:02 | 显示全部楼层
    李恒道 发表于 2022-10-31 05:22
    懂了...
    国内国外好多人都直接尝试修改state再用setstate设置回去...
    不过如果state是完全不可变的

    https://github.com/immerjs/immer
    已有1人评分油猫币 理由
    李恒道 + 20 ggnb!

    查看全部评分 总评分:油猫币 +20 

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    636

    主题

    5187

    回帖

    6069

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6069

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2022-10-31 10:36:02 | 显示全部楼层

    我草
    牛逼!
    我说为啥我感觉手动改那么费劲
    原来有库啊...

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1360

    积分

    荣誉开发者

    积分
    1360

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-10-31 20:28:54 | 显示全部楼层
    李恒道 发表于 2022-10-31 05:22
    懂了...
    国内国外好多人都直接尝试修改state再用setstate设置回去...
    不过如果state是完全不可变的

    简单点可以JSON.stringify再JSON.parse实现深拷贝,或者优化一下结构,尽量不要套太深。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表