Я создал карусель в 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.
Ваш код обновляет реальную DOM, React обновляет только реальную DOM, если изменения сделаны внутри виртуальной DOM, и React не хочет \ ожидать от вас этого. Таким образом, подход к этому по своей сути отличается от кода, который вы показываете. Начните с create-react-app, потому что мне не хватает кода React.
Привет, я обновил запрос кодом реакции.
Я не вижу ничего похожего на totalElements[i].style.display = "none"; в опубликованном вами коде компонента React. Возможно, ваше приложение использует код jQuery React и? Я настоятельно рекомендую вместо этого перенести ваш код jQuery на логику компонентов React.
Да, я комбинирую jQuery и React. Результат, которого я добился в HTML, CSS и JS, как раз тот, который мне нужен. Я не уверен, как перенести jQuery на логику компонента React. Вот где мне нужна помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для 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 Живая демонстрация здесь
<h2>Prototype Carousel with pagination in ReactJS</h2>
<div id = "app"></div>
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'));
какой код реакции вы написали?