Ошибка неперехваченного типа: не удается прочитать свойство, сохраняющее значение undefined, с каруселью с реактивной загрузкой

Я реализую карусель react-bootsrap с response-redux, и я получаю сообщение об ошибке в заголовке.

Я использую управляемую карусель, и сообщение об ошибке появляется, когда карусель автоматически меняет слайд.

Когда пользователь щелкает пред. следующие кнопки и меняет его вручную, все в порядке.

Я не понимаю, следует ли добавлять персист в качестве реквизита или опций для реквизита или чего-то подобного?

Вот мой код:

контейнер:

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { Link } from 'react-router'
import store from 'store/configureStore'
import Slides from 'components/SlideShow'
import { getInitalSlides, handleSelect } from 'actions/SlidesActions'

class Home extends Component {

constructor(props) {
    super(props)
    this.state = {
        index: null,
        direction: null
    }
    this.handleSelect = this.handleSelect.bind(this)    

static fetchData({ store }) {
        return store.dispatch(getInitalSlides())
    }

    componentDidMount() {
        this.props.getInitalSlides()
    }

handleSelect(selectedIndex, e) {
        //alert(e)
        this.props.handleSelect(selectedIndex, e)
    }

  render() {
    return (
      <div className="Home">
        <h1>Home Page</h1>
        <Slides 
        slides={this.props.slides}   
        getInitialState={this.state.index} 
        getInitialStateD={this.state.direction}
        slidesControl={this.handleSelect}
        />
        <div><Link to="/question">to question</Link></div>
        <div><Link to="/posts">to posts</Link></div>
      </div>
    )
  }
}

function mapStateToProps (state) {
  const { slides, handleSelect } = state

  return { slides: state.slides, onSelect: state.handleSelect } 
}

export { Home }
export default connect(mapStateToProps { getInitalSlides, handleSelect})(Home)

и вот соответствующий бит в компоненте:

    render() {

    return (
      <Carousel 
      activeIndex={this.props.getInitialState} 
      direction={this.props.getInitialStateD} 
      onSelect={(selectedIndex,e)=>this.props.slidesControl(selectedIndex,e)}
      >
      {

      this.props.slides.map((s)=>{
              let id = s.get('id')
              let title = s.get('title')
              let image = s.get('image')
              let alt = s.get('alt')
              let caption = s.get('caption')
              return(

                    <Carousel.Item key={id} >
                    <img width={900} height={500} alt={s.get('alt')} src={image} alt={alt}/>
                    <Carousel.Caption>
                      <h3>{title}</h3>
                      <p>{caption}</p>
                    </Carousel.Caption>
                  </Carousel.Item>

              )
      }) 



    }
    </Carousel>)
  }
}

Изменить: вот соответствующий код карусели реакции-начальной загрузки (где возникает ошибка)

  var onSelect = this.props.onSelect;

  if (onSelect) {
    if (onSelect.length > 1) {
      // React SyntheticEvents are pooled, so we need to remove this event
      // from the pool to add a custom property. To avoid unnecessarily
      // removing objects from the pool, only do this when the listener
      // actually wants the event.
      e.persist();
      e.direction = direction;

      onSelect(index, e);
    } else {
      onSelect(index);
    }
  }

person S. Schenk    schedule 06.07.2016    source источник
comment
Используете ли вы параметр события e в своем handleSelect методе?   -  person luboskrnac    schedule 06.07.2016
comment
ты имеешь ввиду в создателе действий?   -  person S. Schenk    schedule 06.07.2016
comment
export const HANDLE_SELECT = Symbol ('HANDLE_SELECT') функция экспорта handleSelect (selectedIndex, e) {return {index: selectedIndex, direction: e.direction, // persist: e.persist, type: HANDLE_SELECT}}   -  person S. Schenk    schedule 06.07.2016
comment
да, в функции, которая передается Carousel как обратный вызов onSelect.   -  person luboskrnac    schedule 06.07.2016
comment
Да, как вы можете видеть выше в моем создателе действий, который передается моему onSelect, я использую его для установки направления (e.direction). Не уверен, как использовать e.persist, если это действительно решение.   -  person S. Schenk    schedule 06.07.2016


Ответы (2)


Я проанализировал Carousel.js код react-bootstrap и подозреваю, что проблема в самой react-bootstrap библиотеке.

Эта строка вызывает изменение в коде Carousel.js:

this.timeout = setTimeout(this.next, this.props.interval);

this.next метод ожидает параметр типа SynteticEvent, но при вызове setTimeout ничего не передается. Это объясняет ваше сообщение об ошибке: ...persist of undefined....

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

Поэтому я рекомендую создать проблему с реактивной загрузкой Github и тем временем перейти на версию, которая не содержит упомянутого коммита.

person luboskrnac    schedule 06.07.2016
comment
Спасибо, что нашли время и усилия. Я постараюсь опубликовать проблему на github. - person S. Schenk; 06.07.2016
comment
Я думаю, что это связывает стрелочная функция - person S. Schenk; 06.07.2016
comment
Я удалил боковую заметку - person luboskrnac; 06.07.2016

Вот ссылка на проблему на странице проекта на github. Кажется, скоро будет исправление:

https://github.com/react-bootstrap/react-bootstrap/issues/2029

person S. Schenk    schedule 06.07.2016