修改数组对象属性后如何保留对象原有的NewClass类名?
问题根因
你代码中对匹配到的元素使用对象展开语法{ ...x }创建了一个全新的普通Object对象,这个新对象没有继承原NewClass的原型链,和原来的类实例没有任何继承关系,自然会丢失原有的类名标识。简单说:你不是在修改原类实例,而是直接创建了一个新的普通对象替换了数组里的原实例。
修复方案
结合代码特征判断你是在做Leaflet图层相关开发,推荐两种可落地的方案:
- 直接修改原实例属性(最推荐,适配Leaflet使用逻辑)
不需要用map返回全新对象,直接遍历找到匹配的图层实例,在原实例上修改属性即可,不会破坏原型链。如果用Leaflet官方API修改样式还能自动触发视图更新,代码示例:
useEffect(() => { console.log(layers); if (selectedLayerIndex && layers.length > 0) { const updatedLayers = layers.map(layer => { if (layer.feature.properties.editLayerId === selectedLayerIndex) { // 直接调用Leaflet内置setStyle方法,自动触发视图重绘,符合框架使用规范 layer.setStyle({ color: 'cyan', fillColor: 'cyan' }) } return layer }) console.log('x', updatedLayers); } }, [selectedLayerIndex]);
- 如果需要遵守React状态不可变规则、不能直接修改原对象
不要用对象字面量生成新对象,而是先实例化一个NewClass实例,再把原属性和新属性合并到这个实例上,保证返回的还是NewClass类型的实例。注意这种方式需要你确认NewClass的构造函数支持传入属性初始化,否则不要使用。
避坑提醒:你原代码里
return (x = { ...x, options: { ...x.options, color: 'cyan', fillColor: 'cyan' } })的写法完全没必要给x重新赋值,这个操作本身就是把x替换成了普通对象,是导致类名丢失的直接原因。


内容的提问来源于stack exchange,提问作者Hamist1001
相关产品推荐
相关产品推荐

