Прежде всего, он ломается, потому что массив components
содержит объекты, и React не может их иметь.
Допустимым элементом React является либо узел (HTMLElement, React Component, текст или число)или массив узлов.
Если вы просто хотите сохранить компоненты React в коллекции и выбрать, какие из них отображаются, сначала необходимо удалить фигурные скобки в массиве components
, например:
let components = [TicTacToe, AnotherComponent];
И вам также нужно будет исправить обработчики backRotate
и forwardRotate
.Они не могут быть строковыми, как в html (обратите внимание на фигурные скобки вместо кавычек):
<button onClick={this.backRotate}>Back</button>
<button onClick={this.forwardRotate}>Next</button>
... и должны быть привязаны к экземпляру вашего компонента.Чтобы связать их, используйте метод Function.prototype.bind .Это должно быть сделано в конструкторе:
constructor(props) {
super(props);
this.backRotate = this.backRotate.bind(this);
this.forwardRotate= this.forwardRotate.bind(this);
}
Без привязки this
не будет ссылкой на экземпляр вашего компонента, и вызов этого в обработчиках определенно завершится неудачей.
TicTacToe
и AnotherComponent
должны быть классами, расширяющими React.Component
или React.PureComponent
, или должны быть чисто функциональными компонентами реквизита.
Кроме того, он более понятен и может быть лучше поддержан для объявления заглавной переменной, содержащей компонент:
render() {
const Comp = this.state.component;
return (
<div>
<button onClick={this.backRotate}>Back</button>
<div class='carousel-container'>
<Comp />
</div>
<button onClick={this.forwardRotate}>Next</button>
</div>
);
}
Наконец, вы должны установить index
состояние вашего компонента (оно изменяется с помощью элементов управления компонента) и components
опору (оно не изменяется внутри компонента).
Вместо установки текущего компонента в состояние вы установите индекс текущего компонента:
import React from 'react':
import PropTypes from 'prop-types';
import { TicTacToe, AnotherComponent } from 'path/to/named/imports/TicTacToeAndAnotherComponent';
export default class Projects extends React.Component {
static propTypes = {
components: PropTypes.any,
}
static defaultProps = {
components: [TicTacToe, AnotherComponent],
}
constructor(props) {
super(props);
this.state = {
index: 0,
};
this.backRotate = this.backRotate.bind(this);
this.forwardRotate= this.forwardRotate.bind(this);
}
backRotate() {
const { components } = this.props;
const { index } = this.state;
if(index - 1 < 0) {
this.setState(() => ({ index: components.length - 1 }));
} else {
this.setState(() => ({ index: index - 1 }));
}
}
forwardRotate() {
const { components } = this.props;
const { index } = this.state;
if(index >= components.length) {
this.setState(() => ({ index: 0 }));
} else {
this.setState(() => ({ index: index + 1 }));
}
}
render() {
const Comp = this.props.components[this.state.index];
return (
<div>
<button onClick={this.backRotate}>Back</button>
<div class='carousel-container'>
<Comp />
</div>
<button onClick={this.forwardRotate}>Next</button>
</div>
);
}
}
В любом случае Redux вам не поможет.
Цель Redux -главным образом для предоставления единого источника данных (единственного источника правды), обеспечения действий и редукторов для изменения этих данных и уведомления компонентов, зарегистрированных для прослушивания обновлений хранилища.Независимо от того, подключаете ли вы свою карусель к магазину, или нет, это не имеет отношения к решению вашей проблемы.