Как найти и изменить узлы DOM в React перед рендерингом?

Я не вижу правильного способа найти и изменить узлы 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>
}

Можете ли вы сориентировать меня, пожалуйста?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Перестаньте думать в узлах 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>

Но на самом деле я не мог найти правильный способ рекурсивного поиска <img> в DOM, опубликованном пользователем. Потому что он мог вставить другой DOM в компонент

north.inhale 21.10.2018 14:57

Вам нужно показать больше информации. Обычно пользователь не может вставлять «узлы DOM» в приложение. Вам не нужно искать <img> в DOM. Если вы так думаете, значит, вы думаете в неверном направлении. Думайте о данных и компонентах, а НЕ об узлах DOM

Daniel Hilgarth 21.10.2018 14:57

Пользователь просто вставил его. Тогда я смогу работать только с массивом объектов this.props.children.

north.inhale 21.10.2018 15:02

Смотрите обновление. Пользователи не вставляют теги <img>, они вводят URL-адреса, теги и т. д. Отойдите от узлов DOM!

Daniel Hilgarth 21.10.2018 15:04

Рекурсивный поиск и замена в массиве this.props.children кажется действительно сложной работой = (

north.inhale 21.10.2018 15:05

Прекрати это. Ерунда. Прочтите и понять, что я пишу

Daniel Hilgarth 21.10.2018 15:05

Думаю, я тебя понимаю. Необходимо заставить пользователя использовать ленивую оболочку для изображений, если он хочет добиться эффекта ленивой загрузки. Кажется, это самый простой способ. Спасибо вам!

north.inhale 21.10.2018 15:20

Другие вопросы по теме