Карусель с js и css в REACT

Я создал карусель в html, css и js. Ниже приведены соответствующие коды.

HTML:

<div class = "doorHardwareTile" id = "dh">
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/1.jpg?" alt = "" />
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/2.jpg?" alt = "" />
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/3.jpg?" alt = "" />
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/4.jpg?" alt = "" />
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/5.jpg?" alt = "" />
  <img class = "mySlidesDH slide-to-right" src = "images/Folder1/6.jpg?" alt = "" />

<div class = "overlayDH">
    <img src = "images/Folder1/0.png?" alt = "" />
</div>

</div>

CSS:

 .slide-to-right {
  position: relative;
  animation: animateright 0.5s;
  }

  @keyframes animateright {
  from {
    right: -300px;
    opacity: 0;
   }
  to {
    right: 0;
    opacity: 1;
   }
  }

 .doorHardwareTile {
  display: flex;
  overflow: hidden;
  width: 560px;
  height: 373px;
  min-width: auto;
  min-height: auto;
  margin-bottom: 16px;
 }

.mySlidesDH {
 display: none;
 }

.overlayDH {
  position: absolute;
  width: 560px;
  height: 373px;

  z-index: 800;
  opacity: 0;
  transition: 0.5s ease;
 }

 .overlayDH img {
  object-fit: cover;
  width: 100%;
  height: 100%;

  align-content: center;
}

.doorHardwareTile:hover .overlayDH {
  opacity: 1;
}

JS:

$(function doorHardwareSS() {
  var myIndex = 0;
  carouselDH();

  function carouselDH() {
    var i;
    var totalElements = document.getElementsByClassName("mySlidesDH");
    for (i = 0; i < totalElements.length; i++) {
      totalElements[i].style.display = "none";
    }
    myIndex++;
    if (myIndex > totalElements.length) {
      myIndex = 1;
    }
    totalElements[myIndex - 1].style.display = "block";
    setTimeout(carouselDH, 5000);
  }
});

Это отлично работало в html, css и js.

Однако, когда я попытался воспроизвести то же самое в REACT. Выдает ошибку в следующей строке

totalElements[i].style.display = "none";

Ошибка: «Uncaught TypeError: Невозможно прочесть свойство 'style', равное undefined».

Изображения, которые мне нужны в карусели, извлекаются из базы данных в компоненте на основе классов.

Я просто новичок в REACT. Буду благодарен за любую помощь в достижении того же результата.

Ниже приведен код REACT, который вызывается в компоненте на основе классов.

import React from "react";

const ImageSlide = props => {
  if (
    props.imagePath === undefined ||
    props.imagePath === null ||
    props.imagePath.length === 0
  )
    return null;

  return (
    <div className = {props.styles}>
      {props.imagePath.map(image => {
        const path = props.svgsArray.find(str => str.indexOf(image.hash) > 1);
        // console.info(path);
        return (
          <img
            className = "mySlidesDH slide-to-right"
            key = {image.id}
            src = {path}
            alt = {props.styles}
          />
        );
      })}
      <div className = {props.styles2}>
          <img src = {require("./images/1_Door_hardware/0.png?")} alt = "" />
      </div>
    </div>
  );
};

export default ImageSlide;

Обратите внимание, что значение doorHardwareTile передается через props.styles, а значение overlayDH передается через props.styles2.

какой код реакции вы написали?

Nishant 02.09.2018 20:21

Ваш код обновляет реальную DOM, React обновляет только реальную DOM, если изменения сделаны внутри виртуальной DOM, и React не хочет \ ожидать от вас этого. Таким образом, подход к этому по своей сути отличается от кода, который вы показываете. Начните с create-react-app, потому что мне не хватает кода React.

Xorifelse 02.09.2018 20:24

Привет, я обновил запрос кодом реакции.

Ishaq Sheik Mohamed 02.09.2018 20:33

Я не вижу ничего похожего на totalElements[i].style.display = "none"; в опубликованном вами коде компонента React. Возможно, ваше приложение использует код jQuery React и? Я настоятельно рекомендую вместо этого перенести ваш код jQuery на логику компонентов React.

Jacob 02.09.2018 20:40

Да, я комбинирую jQuery и React. Результат, которого я добился в HTML, CSS и JS, как раз тот, который мне нужен. Я не уверен, как перенести jQuery на логику компонента React. Вот где мне нужна помощь.

Ishaq Sheik Mohamed 02.09.2018 20:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
748
2

Ответы 2

Для React попробуйте следующий пакет:

https://github.com/FormidableLabs/react-animations

Для React Native:

https://facebook.github.io/react-native/docs/animations

Вот пример, но для нативной реакции он может иметь такое же представление о том, как вы можете сделать простой правый слайд, но все же вам нужна функция для исчезновения или установки непрозрачности на ноль контейнера, когда он сдвигается вправо и есть еще одна функция, чтобы установить его в исходное положение с заменой изображения внутри контейнера.

Сначала установите положение контейнера внутри this.state:

this.state = {
   containerRightSlideAnim: new Animated.ValueXY({x: 0, y: 0})
}

И внутри установленной позиции конструктор вы хотели бы для Икс:

this.containerRightSlide = Animated.timing(this.state.containerRightSlideAnim, {
      toValue: {x: 200, y: 0},
      duration: 10000,
      //speed: 0.1,
      easing: Easing.in(Easing.ease)
})

Сделайте функцию, которая запускает правильную анимацию слайдов:

triggerRightSlide(){
 this.containerRightSlide.start();
}

Добавьте внутренний рендер:

render() {
    const animatableRightSlideStyle = this.state.containerSlideAnim.getTranslateTransform()

    return (<View>
        <Animated.View style = {[animatableRightSlideStyle]}></Animated.View>
    </View>)
}

Вот рабочий прототип карусели с разбивкой на страницы в ReactJS Живая демонстрация здесь

HTML

<h2>Prototype Carousel with pagination in ReactJS</h2>
<div id = "app"></div>

JS React

    import React from 'react'
    import ReactDOM from 'react-dom'

    class Pagination extends React.Component {
        constructor( props ){
            super( props );
        }

        paginationRender = ( source, activeItem, handleEvent ) => {

            const items = source.map(( item, i ) => {
                let itemClass = 'page-item';
                if ( item.id === activeItem ){
                    itemClass += ' active';
                }
                return <li key = {i} className = { itemClass }>
                    <a className = "page-link" href = "#"
                    onClick = { e => handleEvent( e, 'clickItem', item )}>
                        { i + 1 }</a>
                </li>;
            });

            return <ul className = "pagination pagination-sm justify-content-center">
                <li className = "page-item">
                    <a className = "page-link" href = "#" 
                        onClick = {e => handleEvent( e, 'prevItem', {}, items )}>Prev</a>
                </li>
                {items}
                <li className = "page-item">
                    <a className = "page-link" href = "#"
                        onClick = {e => handleEvent( e, 'nextItem', {}, items )}>Next</a>
                </li>
            </ul>;
        };

        render() {
            const { itemsSrc, activeItem, handleEvent } = this.props;
            //console.info('MenuContent->render()', { source });

            return <div>{this.paginationRender( itemsSrc, activeItem, handleEvent ) }</div>;
        }
    }


    class Carousel extends React.Component {
        constructor( props ){
            super( props );
        }

        carouselRender = (  source, activeItem, handleEvent ) => {
            //console.info('Carousel->carouselRender [0]', { source, state: this.state });

             const indicators = source.map(( item, i ) => {
                let itemClass = '';
                if ( item.id === activeItem ){
                    itemClass += ' active';
                }
                //console.info('Carousel->carouselRender [3]', { id: item.id, item, pageItemClass, activeItem: activeItem });
                return <li key = {i} data-target = "#demo" data-slide-to = "1" className = { itemClass }
                                 onClick = { e => handleEvent( e, 'clickItem', item )}>></li>;
            });   

            const imgs = source.map(( item, i ) => {
                let itemClass = 'carousel-item';
                if ( item.id === activeItem ){
                    itemClass += ' active';
                }
                //console.info('Carousel->carouselRender [5]', { id: item.id, item, pageItemClass, activeItem: activeItem });
                return <div key = {i} className = { itemClass }>
                    <img src = {item.src} className = "img-fluid" alt = "New York" />
                </div>;
            });

            //console.info('Carousel->carouselRender [7]', { });
            return <div id = "demo" className = "carousel slide" data-ride = "carousel">
                                <ul className = "carousel-indicators">
                                    { indicators }
                                </ul>
                                <div className = "carousel-inner">
                                    { imgs }
                                </div>
                                <a className = "carousel-control-prev" href = "#demo" data-slide = "prev">
                                    <span className = "carousel-control-prev-icon"
                                        onClick = {e => handleEvent( e, 'prevItem', {}, source )}>
                                    </span>
                                </a>
                                <a className = "carousel-control-next" href = "#demo" data-slide = "next">
                                    <span className = "carousel-control-next-icon"
                                        onClick = {e => handleEvent( e, 'nextItem', {}, source )}>
                                    </span>
                                </a>
                            </div>;
        };

        render() {
            const { itemsSrc, activeItem, handleEvent } = this.props;
            //console.info('MenuContent->render()', { source });

            return <div>{this.carouselRender( itemsSrc, activeItem, handleEvent ) }</div>;    
        }
    }

    const inputProps = {
        itemsSrc: [
                { id: 0,
                    name: 'Los Angeles',
                    level: 'basic',
                    src: 'https://www.w3schools.com/bootstrap4/la.jpg'
             },
                {
                    id: 1,
                    name: 'Chicago',
                    level: 'basic',
                    src: 'https://www.w3schools.com/bootstrap4/chicago.jpg'
                },
                {
                    id: 2,
                    name: 'New York',
                    level: 'advanced',
                    src: 'https://www.w3schools.com/bootstrap4/ny.jpg'
                },           
            ],
    };

    class Wrapper extends React.Component {
        constructor( props ){
            super( props );
            this.state = {
                activeItem: 0,
            };
        }

        handleEvent = ( e, actionType, item, items ) => {
            e.preventDefault();
            let itemsLength, activeItem;

            switch( actionType ){
                case 'clickItem':
                    //console.info('MenuContent->paginationRender', { actionType, id: item.id, item });
                    this.setState({ activeItem: item.id });
                break;
                case 'prevItem':
                    activeItem = this.state.activeItem;
                    if ( activeItem === 0  ){
                        break;
                    }
                    activeItem -= 1;
                    this.setState({ activeItem });
                break;
                case 'nextItem':
                    itemsLength = items.length;
                    activeItem = this.state.activeItem;
                    if (activeItem === itemsLength -1) {
                        break;
                    }
                    activeItem += 1;
                    this.setState({ activeItem });
                break;
            }
            //console.info('MenuContent->handleEvent()', { actionType, item, items });

        }

        render(){
            let props = this.props;
            const { activeItem } = this.state;
            props = { ...props, handleEvent: this.handleEvent, activeItem };

            return <div className = "App">

                <div className = "container-fluid">
                    <div className = "row">
                        <div className = "col-1">
                        </div>
                        <div className = "col-10">

                            <Pagination { ...props }/>
                            <Carousel { ...props }/>
                        </div>
                        <div className = "col-1">
                        </div>
                    </div>
                </div>
            </div>;
        }
    }

    ReactDOM.render(<Wrapper {  ...inputProps }/>, document.getElementById('app'));

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