React响应式数据更新踩坑-Table表头不刷新

React响应式数据更新踩坑

背景

在用户流程结束之后,需要一个类似可编辑表格的界面填写用户评价,用于收集用户使用感受和意见。

但在编写代码的时候发现,UI界面数据更新,响应式数据也随之更新之后,界面并没有重新渲染,导致用户没办法输入任何东西,但是devTool上log输出却是正确的。

主要功能

可编辑表格

使用技术栈

React:17.0.2 - 类组件

antd:4.16.13

解决

当响应式数据为对象数组的时候,浅层拷贝没办法触发React更新,需要深拷贝。

代码实现

仅仅贴出主要代码

DOM

jsx 复制代码
...
<Table
  dataSource={this.state.replyDataTable}    
  columns={this.replyColumns}
  ...
/>
...

JS

  • 表头配置
jsx 复制代码
replyColumns = [
    ...
    {
        title: "满意度评价,
        dataIndex: "MATCH_CASE",
        render:(text,row,index) => (
    	<Rate
            onChange={val => this.handleRateChange(val,index)}
            value={this.state.replyDataTable[index].MATCH_CASE}
        />
    )
    }
]
  • 当用户编辑时,触发更新
jsx 复制代码
handleRateChange = (val, index) => {
    const {replyDataTable} = this.state;
    // 错误做法:浅拷贝, 无法触发render
    // const _replyDataTable = [...replyDataTable]
    // 正确做法:深拷贝
    const _replyDataTable = JSON.parse(JSON.stringify(replyDataTable));
    _replyDataTable[index].MATCH_CASE = val;
    this.setState({
        replyDataTable: _replyDataTable,
    })
    
}

反思

  1. 在进行更新响应式数据时,要重新拷贝一份引用
  2. 让我想起了vue2的$set

Vue.js 的响应式系统在初始化时会对数据对象进行递归遍历并设置 getter 和 setter,以便在属性被访问和修改时触发更新。但是,对于已经存在的属性和索引,Vue.js 在初始化时已经设置了 getter 和 setter,因此能够追踪它们的变化。然而,对于新增的属性或索引,初始化时并没有设置相应的 getter 和 setter,导致 Vue.js 无法自动追踪这些变化。

相关推荐
试图让你心动1 分钟前
【无标题】
前端·javascript·vue.js
Hilaku4 分钟前
为什么每个前端都应该拥有一个自己的独立博客?
前端·javascript·程序员
燕落南枝7 分钟前
CSS 后代选择器与子代选择器:从入门到实战
前端·css
Amos_Web10 分钟前
Rspack 源码解析(二十八):HtmlRspackPlugin 如何把模板变成带资源标签的最终产物
前端
马可家的菠萝13 分钟前
个人知识库怎么建?从一个正在学的技术主题开始
前端·笔记·知识管理·个人知识库
几何心凉13 分钟前
端到端具身交互智能正式上线:让 AI 通过屏幕和机器人,真正走进现实世界
前端·人工智能·实时互动·机器人·交互
tryCbest1 小时前
Vue3——第 6 篇:事件处理与表单绑定——v-on 与 v-model
前端·javascript·vue.js
恋猫de小郭1 小时前
Flutter 的文字为什么比 SwiftUI 更细?问题主要在 Skia 的 256 项查找表里
android·前端·flutter
lexiangqicheng1 小时前
前端高阶面试核心通关指南:深入解析Vue3与React18底层原理及性能优化
前端·面试·性能优化
怕浪猫1 小时前
前端对接聊天 API:我用 React 做了一个比 ChatGPT 还好看的界面
前端·后端·面试