React и методы карусели

Я смотрю на использование antd Carousel, но я не видел примера, описывающего, как использовать метод goTo(slideNumber, dontAnimate).

Я пытался использовать ответы на этот вопрос React.js и карусель со стрелками, чтобы заставить метод goTo работать для меня, но это не помогло, я всегда получаю ссылку на карусель как null

import * as React from 'react';
import { createPortal } from 'react-dom';
import { Modal, Carousel } from 'antd'

export default class ImagePreviewCarousel extends React.Component<any, any> {

    carousel = React.createRef();

    componentDidMount() {
        console.info(this.carousel);
    }

    render() {
        const { url, imgList } = this.props;
        const orderLayout = document.getElementById('order-layout');
        const applicationLayout = document.getElementById('application');

        return (
            createPortal(<ImageViewer url = {url} onClose = {this.props.onClose} imgList = {imgList} />, orderLayout || applicationLayout)
        )
    }
}

const ImageViewer = (props: IProps) => {
    return (
        <Modal 
            footer = {null} 
            visible = {props.onClose} 
            onCancel = {props.onClose}
            bodyStyle = {{ backgroundColor: '#000' }}
            width = {'800px'}
        >
            <div style = {{
                display: 'flex', 
                flexDirection: 'column', 
                justifyContent: 'center', 
                marginTop: 'auto', 
                marginBottom: 'auto', 
                width: '100%',
                height: '100%', 
                zIndex: 10
            }}>
                <Carousel ref = {node => (this.carousel = node)}>
                    {props.imgList}
                </Carousel>
            </div>
        </Modal>
    );
}

результат console.info(this.carousel) всегда возвращает null, что я делаю не так?

p.s реагировать на версию 16.4.1,

Ваша проблема решена?

Dennis Vash 08.07.2019 16:49

к сожалению нет, есть идеи? @DennisVash

Sasha Chekmareva 08.07.2019 17:17

Проверьте мой ответ, надеюсь, это поможет

Dennis Vash 08.07.2019 19:08
Поведение ключевого слова "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) для оценки ваших знаний,...
8
3
6 005
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно передать ref вашему дочернему компоненту, например,

<ImageViewer url = {url} onClose = {this.props.onClose} imgList = {imgList} onRef = {this.carousel} />

И может получить доступ к дочернему компоненту, например,

<Carousel ref = {props.onRef}>
       {props.imgList}
</Carousel>

При печати в componentDidMount,

componentDidMount() {
   console.info(this.carousel); // If this gives you ref object 
   console.info(this.carousel.current); //This will give you element
   console.info(this.carousel.current.value); //This will give you element's value if element has value.
}

Упрощенный Демо с использованием ввода.

Спасибо, я сделал именно так, как вы мне сказали, но я получил этот странный результат в консоли prntscr.com/oc54gx (первый результат нулевой, но с информацией, что значение было оценено только что), вы не знаете, почему это произошло?

Sasha Chekmareva 08.07.2019 15:52

Вы получите ссылку на карусель, используя this.carousal.current. Вы получаете {current:null}, потому что обычно он возвращает элемент HTML, а Carousal не является элементом HTML.

ravibagul91 08.07.2019 15:59

componentDidMount() { console.info(this.carousel) - возвращает {current: null} (но как сказано выше с информацией, что значение было оценено только что) console.info(this.carousel.current) - возвращает null }

Sasha Chekmareva 08.07.2019 16:11

вместо карусели, вы можете попробовать добавить ссылку на элемент карусели, например <Carousel ><div ref = {props.onRef}>{props.imgList}</div></Carousel> . Также убедитесь, что imgList является массивом, а затем повторите то же самое, используя Array.map.

ravibagul91 08.07.2019 16:22

ref на div (<Carousel ><div ref = {props.onRef}>{props.imgList}</div></Carousel>) по-прежнему возвращает null =(

Sasha Chekmareva 08.07.2019 17:21

Как выглядит props.imgList?

ravibagul91 08.07.2019 17:26
const imageListToCarousel = images.map((image, index) => { return ( <> <Image> <StyledImg src = {image} key = {index} /> </Image> </> ) });
Sasha Chekmareva 08.07.2019 17:34

Вы должны повторять props.imgList лайк, <Carousel >{props.imgList.map(image => <div ref = {props.onRef}>{image}</div>)}</Carousel>

ravibagul91 08.07.2019 17:42

@JANEDOE Я использовал обычную карусель в своей демонстрации, просто посмотрите добавленную мной демонстрацию, она работает сейчас. Нет необходимости перемещать ссылку на дочерний компонент, вы можете <Carousel ref = {props.onRef}> {props.imgList} </Carousel> Посмотреть демо - codeandbox.io/s/react-codesandbox-27rug?fontsize=14

ravibagul91 09.07.2019 03:13

@JANEDOE Вы проверили демо?

ravibagul91 10.07.2019 02:57
Ответ принят как подходящий

и Carousel — это реализация react-slick, вы можете проверьте его пример API.

Вот мой пример с использованием хуков:

import React, { useRef, useState } from 'react';
import { Carousel, Row, InputNumber } from 'antd';


function App() {
  const [slide, setSlide] = useState(0);

  const slider = useRef();

  return (
    <div>
      <Row style = {{ marginBottom: 10 }}>
        <InputNumber
          min = {0}
          max = {3}
          value = {slide}
          onChange = {e => {
            setSlide(e);
            slider.current.goTo(e);
          }}
        />
      </Row>
      <Row>
        <Carousel
          dots = {false}
          ref = {ref => {
            console.info(ref);
            slider.current = ref;
          }}
        >
          <div>
            <h3>0</h3>
          </div>
          <div>
            <h3>1</h3>
          </div>
        </Carousel>
      </Row>
    </div>
  );
}

Edit Q-56935749-Carousel

Хорошо, я принимаю ваше решение, но, к сожалению, в моем рабочем проекте мы не используем хуки (поэтому, если вы найдете лучшее решение без хуков, сообщите мне об этом =)

Sasha Chekmareva 30.07.2019 09:58

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