reactjs - 渲染前如何在 React 中查找和修改 DOM 节点?
问题描述
我看不到如何在渲染之前找到和修改 React DOM 节点的正确方法。例如,我需要将组件内的所有已创建图像设置为延迟加载。但问题是我不知道用户会插入哪些节点。因此,我需要在用户将节点放置在组件中之后,通过使用componentWillMount
或者constructor
我认为......
实际上在 jQuery 中,在用户插入它之后替换真正的 src。我会做这样的事情:
jQuery('.wrapper img').each(element => {
let realSrc = element.attr('src')
element
.attr('data-real-src', realSrc)
.attr('src', './fakeimage.png')
})
所以在 React 中,我认为我必须做这样的事情......
const modifiedChildren = children.reduce((arr, next) => {
let modified = {
...next,
src: './fakeimage.png',
'data-real-src': next.src
}
return [
...arr,
modified
]
}, [])
render {
<div className="wrapper">{ modifiedChildren }</div>
}
你能给我导航吗?
解决方案
停止思考 DOM 节点。开始思考组件。
您需要一个新组件LazyLoadedImage
,它可以获取真实的 URL 并在某些触发后显示它。像这样的东西:
import fakeImage from 'assets/fakeimage.png';
const LazyLoadedImage = ({url, displayActualImage, ...props}) => {
if(displayActualImage) return <img {...props} src={url}>;
else return <img {...props} src={fakeImage}>;
}
使用示例:
<Slider>
{images.map((obj, index) =>
<LazyLoadedImage className='slider__img' url={obj.largeImageURL}
alt={obj.tags || 'cap'} key={index}/>)}
</Slider>
推荐阅读
- react-native - 在 React Native 的最新版本中无法解析模块 `@babel/runtime/helpers/interopRequireDefault`
- automl - Azure 机器学习服务 - 数据集 API 问题
- docker - Dockerize 'at' 调度程序
- c - 考虑到循环内的变量定义,循环内嵌套函数的性能如何?
- jquery - 在 Fabric JS 中取消选择对象
- php - 根据其他 URL 在 XML 中查找 URL 并重定向
- react-native - 无法编译 react-native-expo 项目
- php - 访问子域 URL 之前的用户身份验证检查 - Laravel
- algorithm - 一条路径中最多有十个负边的 dijkstra
- swift - UITableViewCell 内的 UICollectionView 只显示一个单元格