javascript - 反应组件中的滑块返回“无法读取未定义的属性样式”
问题描述
我试图为滑块创建一个组件,但由于某种原因它不起作用!
第一次渲染时,出现以下错误:“无法读取未定义的属性样式...”。
当我尝试记录x[slideIndex-1]时,我首先得到 undefined,然后在 onClick 事件侦听器触发后得到正确的值。
同样,当我在单击任何按钮之前记录x.length时,我得到 0,但在 onClick 之后它切换到 4。
这是整个组件文件:
import React from 'react';
export default () => {
var slideIndex = 1;
showDivs(slideIndex);
function plusDivs(n) {
showDivs(slideIndex += n);
}
function showDivs(n) {
var i;
var x = document.getElementsByClassName("slider__img");
if (n > x.length) {slideIndex = 1}
if (n < 1) {slideIndex = x.length}
for (i = 0; i < x.length; i++) {
x[i].style.display = "none";
}
x[slideIndex-1].style.display="block";
}
return (
<div className="content-container">
<img className="slider__img" src="../images/foo.jpg"/>
<img className="slider__img" src="../images/foo2.jpg"/>
<img className="slider__img" src="../images/foo3.jpg"/>
<img className="slider__img" src="../images/foo4.jpg"/>
<button onClick={()=>plusDivs(1)}>Next</button>
<button onClick={()=>plusDivs(-1)}>Previous</button>
</div>
)
}
解决方案
就像评论中指出的那样。使用 React 时直接操作 DOM 元素是不好的做法。React 使用虚拟 DOM。为了最小化 DOM 操作,React 首先计算出必须在虚拟 DOM 中应用的所有更改,然后将其实际渲染到真实 DOM。这就是为什么在使用 React 时自己操作 DOM 元素可以被视为一种反模式。
解决您的问题的一种方法是:
import React, { Component } from 'react';
export class YourComponent extends Component {
constructor() {
super();
this.state = {
slideIndex: 1,
images: [
'../images/foo.jpg',
'../images/foo2.jpg',
'../images/foo3.jpg',
'../images/foo4.jpg'
]
};
}
pludDivs(n) {
const { images } = this.state;
if (n > images.length) {
this.setState({ slideIndex: 1 });
}
if (n < 1) {
this.setState({ slideIndex: images.length - 1 });
}
}
render() {
const { images, sliderIndex } = this.state;
return (
<div className="content-container">
<img className="slider__img" src={images[slideIndex]} />
<button onClick={() => plusDivs(1)}>Next</button>
<button onClick={() => plusDivs(-1)}>Previous</button>
</div>
);
}
}
希望这可以帮助!请让我知道,如果你有任何问题。
推荐阅读
- bash - 在目录中具有特定文件夹名称的所有文件上查找并执行命令
- python - Python:计算数据框中列的减法
- python-3.x - 如何在 BeautifulSoup 创建的列表中提取特定文本
- c++ - 将数字转换为单词
- css - CSS Grid 是否在底层使用了常规 CSS?
- android - Android 分页库 LiveData
> 在 api 调用结束前触发 - elasticsearch - 如何在亚马逊弹性搜索上设置 metricbeat
- sql - 计算边界框内的点/坐标
- java - 如何比较 Java 8 中 Date 对象之间的时间?
- swift - LocalNotifications iOS 11 swift4 - 适用于模拟器而不是设备