React如何根据p元素内容动态匹配已导入图片设置img的src属性
img标签src随p元素内容动态变化的正确实现
之前两套方案失效的核心原因
- 绕开React数据驱动的逻辑、直接手动操作DOM的思路本身就不适用。React的更新机制会在组件重渲染时自动覆盖所有手动修改的DOM属性,哪怕你第一次改成功了,后续列表数据更新、组件重渲染的时候,之前改的src值会被直接冲掉,根本留不住。
- 第二版自定义
images方法本身就存在多处可直接导致代码失效的错误:document.querySelectorAll('img')返回的是类数组结构的NodeList,没有jQuery风格的.attr()方法,这段代码实际运行时会直接抛错,根本执行不到后续的判断分支- 普通DOM操作的赋值逻辑里误用了JSX的大括号语法,
image.src = {food}实际赋值的是普通JS对象转成的字符串,根本不是导入的本地图片路径 - 只在
componentDidMount执行一次的选择器逻辑,根本覆盖不到后续列表循环动态渲染出来的img节点 - 列表里多个循环生成的元素共用同一个
id='guide',本身不符合HTML规范,哪怕选择器跑通,抓到的也不是目标元素
具体实现步骤
1. 建立文本值和本地图片的映射关系
你已经通过ES模块导入了food、travel等本地图片资源,不需要写一堆零散的if/else判断,直接提前把图片和p标签要展示的文本值做绑定:
// 键值和p标签渲染的guide_type文本完全对应 const guideTypeImageMap = { Food: food, Travel: travel, // 其他类型的图片按照同样格式补充即可 }
2. 直接在JSX渲染时绑定src值,完全不需要手动操作DOM
你原来循环渲染块里的img直接把guide.guide_type(也就是p标签展示的文本内容)当src使用,浏览器无法识别这个文本对应的本地图片路径,直接改成从映射表取值即可:
return ( <GuideDiv> <div className='top'> <h1>Guides</h1> <NewGuide to='/GuideForm'> <h2> Add <img src={travel} alt='travel'/> Guide </h2> </NewGuide> </div> {guided.map(guide => <GuidePost key={guide.id}> <div> <UserIcon> {/* src值直接和p标签渲染的guide_type绑定,p显示什么,这里就自动匹配对应图片 */} <img alt='type' src={guideTypeImageMap[guide.guide_type]} /> </UserIcon> <label className='under'>Guide Type</label> <br/> <p>{guide.guide_type}</p> <br/> </div> </GuidePost> )} </GuideDiv> )
- 这种写法完全遵循React的渲染逻辑:img的src值从一开始就和p标签展示的内容绑定,后续只要
guided列表的数据更新,src会自动跟着p的内容同步变化,不需要额外加生命周期钩子、不需要手动写DOM选择器。 - 可以额外加个兜底逻辑,避免出现映射表没匹配到的类型导致图片破损:给src赋值的时候加默认值,比如
src={guideTypeImageMap[guide.guide_type] || 兜底默认图片}
内容的提问来源于stack exchange,提问作者Lili Fuentes
相关产品推荐
相关产品推荐

