react-native-snap-carousel中「React keys必须直接传递给JSX,不能使用扩展运算符」警告无法消除的原因咨询
嘿,太懂这种明明按要求调整了,但警告还阴魂不散的烦躁感了!结合你用的版本(react-native-snap-carousel 4.0.0-beta.6、React 18.3.1、RN 0.76.7),我帮你捋捋可能的原因:
测试版本身的兼容性bug:你用的是beta测试版本,这类未完全稳定的版本很可能没做好React 18的适配。React 18对key的校验逻辑比旧版本更严格,而这个beta版的轮播组件可能在内部渲染item时,要么重复添加了key,要么错误地误判你用了扩展运算符传key——哪怕你根本没这么做。
key的传递方式不符合组件要求:警告明确说不能用spread语法传key,必须直接写key属性。哪怕你配置了keyExtractor,说不定这个beta版的组件没正确识别它的返回值,还是要求你在
renderItem返回的根JSX上明确直接写key,比如:
const renderItem = ({ item }: any) => { return <View key={item.uniqueId}>{/* 你的组件内容 */}</View>; };
千万别用<View {...{ key: item.uniqueId }}>这种spread写法,哪怕逻辑上等价,组件的校验逻辑也会触发警告。
React 18严格模式的影响:React 18的严格模式会触发组件双重渲染,这个beta版的轮播组件可能在这种场景下的key处理逻辑出了问题,导致误报警告。你可以暂时把包裹App的
<StrictMode>标签去掉试试,如果警告消失了,基本就能确定是版本兼容的锅。keyExtractor的返回值不唯一:再检查下你的keyExtractor是不是返回了重复的值?比如如果用了item的index当key,当列表数据有增删时就会出现重复,这也可能让警告一直出现——哪怕你觉得自己没写错,也确认下返回的每个key都是唯一的吧。
如果以上方法都试过还是不行,要么试试升级到这个组件的最新beta版(说不定已经修复了这个bug),要么看看这个组件的代码仓库里的issue区,说不定有其他开发者遇到过一样的问题,已经找到临时的解决办法了。
备注:内容来源于stack exchange,提问作者Юлия Бойко

