Как заменить компонент React другим при изменении его состояния - PullRequest
0 голосов
/ 08 января 2020

Я довольно новичок в React, и это то, что я пытаюсь выполнить sh:

Я хочу показать большое изображение, которое загружается через 3-4 секунды, поэтому я хочу показать пользователю загрузчик, который можно получить с помощью ReactImage из https://www.npmjs.com/package/react-image

Затем я хочу добавить параметр масштабирования, но функция масштабирования должна быть доступна только после успешной загрузки изображения так что я планирую использовать https://www.npmjs.com/package/react-image-magnify

Однако нет событий или возможного способа заставить 2 сообщать друг другу свои состояния, чтобы в моей функции render() я мог выберите использование ReactImage или ReactImageMagnify.

Любая помощь будет принята.

Вот некоторый псевдокод, у меня есть компонент реагирования, называемый Preview, и он имеет функцию render(), которая возвращает либо ReactImage, либо ReactImageMagnify

export class Preview extends React.Component {
    ...
    render() {
        ...
        // if image is not yet loaded then return ReactImage
        return(
                <ReactImage
                    src={this.getPreviewUrl()}
                    className=""
                    style={{ zIndex: 1 }}
                    alt=""
                    loader={<LoadingImage />}
                />
        )

        //if not, return ReactImageMagnify
        return(
                <ReactImageMagnify {...{
                    smallImage: {
                        alt: 'Chef Works',
                        isFluidWidth: true,
                        src: 'smallimage.png'
                    },
                    bigImage: {
                        alt: 'Chef Works',
                        isFluidWidth: true,
                        src: 'bigimage.png'
                    }
                }}/>

        )
    }
}

Ответы [ 2 ]

1 голос
/ 08 января 2020

Добавьте значение состояния loading, которое вы обновляете на основе результата вызова извлечения изображений:

const ImageComponent = ({imageResult}) => {
    const [loading, setLoading] = useState(true)

    useEffect(() => {
       if(imageResult !== null) {
            setLoading(false)
       }
    },[imageResult])

    return {
       {loading ? <Loader /> : <Image src={imageResult} />
    }
}
0 голосов
/ 13 января 2020

Я понял, что все, что мне нужно от ReactImage, это просто значок загрузки, когда изображение еще не загружено, поэтому я реализовал то же поведение на основе ответа Трэвиса Джеймса и вместо этого получил условное свойство отображения для ReactImageMagnify. Код выглядит следующим образом:

import React, {useState} from "react";
import ReactImageMagnify from 'react-image-magnify';
import { LoadingImage } from 'ui/component/loading-image';

import styles from './style.css';

export const PreviewWithZoom = ({imageLink, zoomImageLink}) => {
    const [loaded, setLoaded] = useState(false);
    const [loadedZoom, setLoadedZoom] = useState(false);

    return(<>
        {loaded ? null : <LoadingImage />}
        <img
            style={loaded && !loadedZoom ? {} : {display: 'none'}}
            src={imageLink}
            onLoad={() => setLoaded(true)}
            alt=''
        />
        <img
            style={{display: 'none'}}
            src={zoomImageLink}
            onLoad={() => setLoadedZoom(true)}
            alt=''
            />

        <div style={loaded && loadedZoom ? {} : {display: 'none'}}>
            <ReactImageMagnify {...{
                className: styles.previewZoom,
                smallImage: {
                    src: imageLink,
                    width: 670,
                    height: 670
                },
                largeImage: {
                    src: zoomImageLink,
                    width: 1500,
                    height: 1500,
                }
            }}/>
        </div>
    </>);
};
...