在 ReactJs 中使用 map 函数时出现错误 "Cannot read property 'map' of undefined"
Getting error "Cannot read property 'map' of undefined" while using map function in ReactJs
我刚刚开始探索 React,我正在尝试在我的 React 项目中添加滑块,但它不起作用我不知道为什么,所以请有人指导我找到问题并解决它。
并且下面的代码出现了类似“TypeError: Cannot read 属性 'map' of undefined”的问题
这是代码:
class Slider extends React.Component {
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
componentWillUnmount() {
window.clearTimeout(this.changeTO);
}
componentDidMount() {
this.runAutochangeTO();
setTimeout(() => {
this.setState({ activeSlide: 0, sliderReady: true });
}, 0);
}
runAutochangeTO() {
this.changeTO = setTimeout(() => {
this.changeSlides(1);
this.runAutochangeTO();
}, this.AUTOCHANGE_TIME);
}
changeSlides(change) {
window.clearTimeout(this.changeTO);
const { length } = this.props.slides;
const prevSlide = this.state.activeSlide;
let activeSlide = prevSlide + change;
if (activeSlide < 0) activeSlide = length - 1;
if (activeSlide >= length) activeSlide = 0;
this.setState({ activeSlide, prevSlide });
}
render() {
const { activeSlide, prevSlide, sliderReady } = this.state;
return (
<div className={classNames('slider', { 's--ready': sliderReady })}>
<p className="slider__top-heading">Travelers</p>
<div className="slider__slides">
{this.props.slides.map((slide, index) => (
<div
className={classNames('slider__slide', { 's--active': activeSlide === index, 's--prev': prevSlide === index })}
key={slide.city}
>
<div className="slider__slide-content">
<h3 className="slider__slide-subheading">{slide.country || slide.city}</h3>
<h2 className="slider__slide-heading">
{slide.city.split('').map(l => <span>{l}</span>)}
</h2>
<p className="slider__slide-readmore">read more</p>
</div>
<div className="slider__slide-parts">
{[...Array(this.IMAGE_PARTS).fill()].map((x, i) => (
<div className="slider__slide-part" key={i}>
<div className="slider__slide-part-inner" style={{ backgroundImage: `url(${slide.img})` }} />
</div>
))}
</div>
</div>
))}
</div>
<div className="slider__control" onClick={() => this.changeSlides(-1)} />
<div className="slider__control slider__control--right" onClick={() => this.changeSlides(1)} />
</div>
);
}
}
const slides = [
{
city: 'Paris',
country: 'France',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/paris.jpg',
},
{
city: 'Singapore',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/singapore.jpg',
},
{
city: 'Prague',
country: 'Czech Republic',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/prague.jpg',
},
{
city: 'Amsterdam',
country: 'Netherlands',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/amsterdam.jpg',
},
{
city: 'Moscow',
country: 'Russia',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/moscow.jpg',
},
];
export default Slider
我收到了这个错误:
伙计们,我该如何解决这个问题?有什么办法可以解决这个问题吗?
您的 slides
是全局定义的,而不是在 props
中,但您尝试通过 this.props.slides
访问它,而 this.props.slides
不存在。直接使用它或在构造函数中添加幻灯片:
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.slides = slides;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
这个错误有几种可能。
this.props.slides // might be not an array, getting undefined or incorrrect value
首先控制这个 this.props.slides
并检查它是否满足上述条件并且数据结构正确,如果是则 add ?
检查以便它像这样异步收听它:
{this.props?.slides.map((slide, index) => ( //add the check here
您的 class 组件中有 slides
,因此您不需要从 props
获取幻灯片。
您无需任何媒体即可访问幻灯片。像这样:
{this.slides.map((slide, index) => (<TheSLiderElement/>)}
您的幻灯片数组不是 属性。你必须在你的组件状态中设置一个幻灯片数组,或者你必须在道具中发送这个数组。我在此代码块中使用幻灯片作为状态中的数组。
class Slider extends React.Component {
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.slides =slides;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
componentWillUnmount() {
window.clearTimeout(this.changeTO);
}
componentDidMount() {
this.runAutochangeTO();
setTimeout(() => {
this.setState({ activeSlide: 0, sliderReady: true });
}, 0);
}
runAutochangeTO() {
this.changeTO = setTimeout(() => {
this.changeSlides(1);
this.runAutochangeTO();
}, this.AUTOCHANGE_TIME);
}
changeSlides(change) {
window.clearTimeout(this.changeTO);
const { length } = this.slides;
const prevSlide = this.state.activeSlide;
let activeSlide = prevSlide + change;
if (activeSlide < 0) activeSlide = length - 1;
if (activeSlide >= length) activeSlide = 0;
this.setState({ activeSlide, prevSlide });
}
render() {
const { activeSlide, prevSlide, sliderReady } = this.state;
return (
<div className={classNames('slider', { 's--ready': sliderReady })}>
<p className="slider__top-heading">Travelers</p>
<div className="slider__slides">
{this.slides.map((slide, index) => (
<div
className={classNames('slider__slide', { 's--active': activeSlide === index, 's--prev': prevSlide === index })}
key={slide.city}
>
<div className="slider__slide-content">
<h3 className="slider__slide-subheading">{slide.country || slide.city}</h3>
<h2 className="slider__slide-heading">
{slide.city.split('').map(l => <span>{l}</span>)}
</h2>
<p className="slider__slide-readmore">read more</p>
</div>
<div className="slider__slide-parts">
{[...Array(this.IMAGE_PARTS).fill()].map((x, i) => (
<div className="slider__slide-part" key={i}>
<div className="slider__slide-part-inner" style={{ backgroundImage: `url(${slide.img})` }} />
</div>
))}
</div>
</div>
))}
</div>
<div className="slider__control" onClick={() => this.changeSlides(-1)} />
<div className="slider__control slider__control--right" onClick={() => this.changeSlides(1)} />
</div>
);
}
}
const slides = [
{
city: 'Paris',
country: 'France',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/paris.jpg',
},
{
city: 'Singapore',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/singapore.jpg',
},
{
city: 'Prague',
country: 'Czech Republic',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/prague.jpg',
},
{
city: 'Amsterdam',
country: 'Netherlands',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/amsterdam.jpg',
},
{
city: 'Moscow',
country: 'Russia',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/moscow.jpg',
},
];
export default Slider
我刚刚开始探索 React,我正在尝试在我的 React 项目中添加滑块,但它不起作用我不知道为什么,所以请有人指导我找到问题并解决它。 并且下面的代码出现了类似“TypeError: Cannot read 属性 'map' of undefined”的问题
这是代码:
class Slider extends React.Component {
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
componentWillUnmount() {
window.clearTimeout(this.changeTO);
}
componentDidMount() {
this.runAutochangeTO();
setTimeout(() => {
this.setState({ activeSlide: 0, sliderReady: true });
}, 0);
}
runAutochangeTO() {
this.changeTO = setTimeout(() => {
this.changeSlides(1);
this.runAutochangeTO();
}, this.AUTOCHANGE_TIME);
}
changeSlides(change) {
window.clearTimeout(this.changeTO);
const { length } = this.props.slides;
const prevSlide = this.state.activeSlide;
let activeSlide = prevSlide + change;
if (activeSlide < 0) activeSlide = length - 1;
if (activeSlide >= length) activeSlide = 0;
this.setState({ activeSlide, prevSlide });
}
render() {
const { activeSlide, prevSlide, sliderReady } = this.state;
return (
<div className={classNames('slider', { 's--ready': sliderReady })}>
<p className="slider__top-heading">Travelers</p>
<div className="slider__slides">
{this.props.slides.map((slide, index) => (
<div
className={classNames('slider__slide', { 's--active': activeSlide === index, 's--prev': prevSlide === index })}
key={slide.city}
>
<div className="slider__slide-content">
<h3 className="slider__slide-subheading">{slide.country || slide.city}</h3>
<h2 className="slider__slide-heading">
{slide.city.split('').map(l => <span>{l}</span>)}
</h2>
<p className="slider__slide-readmore">read more</p>
</div>
<div className="slider__slide-parts">
{[...Array(this.IMAGE_PARTS).fill()].map((x, i) => (
<div className="slider__slide-part" key={i}>
<div className="slider__slide-part-inner" style={{ backgroundImage: `url(${slide.img})` }} />
</div>
))}
</div>
</div>
))}
</div>
<div className="slider__control" onClick={() => this.changeSlides(-1)} />
<div className="slider__control slider__control--right" onClick={() => this.changeSlides(1)} />
</div>
);
}
}
const slides = [
{
city: 'Paris',
country: 'France',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/paris.jpg',
},
{
city: 'Singapore',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/singapore.jpg',
},
{
city: 'Prague',
country: 'Czech Republic',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/prague.jpg',
},
{
city: 'Amsterdam',
country: 'Netherlands',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/amsterdam.jpg',
},
{
city: 'Moscow',
country: 'Russia',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/moscow.jpg',
},
];
export default Slider
我收到了这个错误:
伙计们,我该如何解决这个问题?有什么办法可以解决这个问题吗?
您的 slides
是全局定义的,而不是在 props
中,但您尝试通过 this.props.slides
访问它,而 this.props.slides
不存在。直接使用它或在构造函数中添加幻灯片:
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.slides = slides;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
这个错误有几种可能。
this.props.slides // might be not an array, getting undefined or incorrrect value
首先控制这个 this.props.slides
并检查它是否满足上述条件并且数据结构正确,如果是则 add ?
检查以便它像这样异步收听它:
{this.props?.slides.map((slide, index) => ( //add the check here
您的 class 组件中有 slides
,因此您不需要从 props
获取幻灯片。
您无需任何媒体即可访问幻灯片。像这样:
{this.slides.map((slide, index) => (<TheSLiderElement/>)}
您的幻灯片数组不是 属性。你必须在你的组件状态中设置一个幻灯片数组,或者你必须在道具中发送这个数组。我在此代码块中使用幻灯片作为状态中的数组。
class Slider extends React.Component {
constructor(props) {
super(props);
this.IMAGE_PARTS = 4;
this.slides =slides;
this.changeTO = null;
this.AUTOCHANGE_TIME = 4000;
this.state = { activeSlide: -1, prevSlide: -1, sliderReady: false };
}
componentWillUnmount() {
window.clearTimeout(this.changeTO);
}
componentDidMount() {
this.runAutochangeTO();
setTimeout(() => {
this.setState({ activeSlide: 0, sliderReady: true });
}, 0);
}
runAutochangeTO() {
this.changeTO = setTimeout(() => {
this.changeSlides(1);
this.runAutochangeTO();
}, this.AUTOCHANGE_TIME);
}
changeSlides(change) {
window.clearTimeout(this.changeTO);
const { length } = this.slides;
const prevSlide = this.state.activeSlide;
let activeSlide = prevSlide + change;
if (activeSlide < 0) activeSlide = length - 1;
if (activeSlide >= length) activeSlide = 0;
this.setState({ activeSlide, prevSlide });
}
render() {
const { activeSlide, prevSlide, sliderReady } = this.state;
return (
<div className={classNames('slider', { 's--ready': sliderReady })}>
<p className="slider__top-heading">Travelers</p>
<div className="slider__slides">
{this.slides.map((slide, index) => (
<div
className={classNames('slider__slide', { 's--active': activeSlide === index, 's--prev': prevSlide === index })}
key={slide.city}
>
<div className="slider__slide-content">
<h3 className="slider__slide-subheading">{slide.country || slide.city}</h3>
<h2 className="slider__slide-heading">
{slide.city.split('').map(l => <span>{l}</span>)}
</h2>
<p className="slider__slide-readmore">read more</p>
</div>
<div className="slider__slide-parts">
{[...Array(this.IMAGE_PARTS).fill()].map((x, i) => (
<div className="slider__slide-part" key={i}>
<div className="slider__slide-part-inner" style={{ backgroundImage: `url(${slide.img})` }} />
</div>
))}
</div>
</div>
))}
</div>
<div className="slider__control" onClick={() => this.changeSlides(-1)} />
<div className="slider__control slider__control--right" onClick={() => this.changeSlides(1)} />
</div>
);
}
}
const slides = [
{
city: 'Paris',
country: 'France',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/paris.jpg',
},
{
city: 'Singapore',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/singapore.jpg',
},
{
city: 'Prague',
country: 'Czech Republic',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/prague.jpg',
},
{
city: 'Amsterdam',
country: 'Netherlands',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/amsterdam.jpg',
},
{
city: 'Moscow',
country: 'Russia',
img: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/moscow.jpg',
},
];
export default Slider