将 Carousel Item 移动到另一个 class 不起作用 [React]
Moving Carousel Item to a different class doesn't work [React]
编辑:
CodeSandBox link - https://codesandbox.io/s/lucid-boyd-9tqhg?file=/src/HomeCarousels.js
以下代码工作正常:
<Carousel>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/2019-black-fantasy-sky.jpg"
alt="Second slide"
/>
<Carousel.Caption>
<h3>Second slide label</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</Carousel.Caption>
</Carousel.Item>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/black-circles-2018.jpg"
alt="Third slide"
/>
<Carousel.Caption>
<h3>Third slide label</h3>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
</Carousel.Caption>
</Carousel.Item>
</Carousel>
但是,当我尝试通过将单个 Carousel.Item 移动到它自己的 React 组件中来重构它时,我 运行 遇到了问题。
SingleCarousel.js
class SingleCarousel extends React.Component {
render() {
return (
<Carousel.Item>
<img
className="d-block w-100"
src={this.props.imgPath}
alt={this.props.header}
/>
<Carousel.Caption>
<h3>{this.props.header}</h3>
<p>{this.props.content}</p>
</Carousel.Caption>
</Carousel.Item>
);
}
}
Main.js(目前只是用 class 的实例替换一个轮播):
<Carousel>
<SingleCarousel
imgPath="https://www.fg-a.com/wallpapers/2019-black-fantasy-sky.jpg"
header="Second slide label"
content="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/black-circles-2018.jpg"
alt="Third slide"
/>
<Carousel.Caption>
<h3>Third slide label</h3>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
</Carousel.Caption>
</Carousel.Item>
</Carousel>
在第二种情况下,第一个轮播项目不会呈现在页面上。但是,我可以在 DOM 树中看到 DOM 元素。在 chrome 中检查时,问题是第一个项目的“carousel-item”div 永远不会更改为“active carousel-item”。我实际上有两个以上的元素,所以我可以看到它正在循环遍历所有项目,但无法将组件项目转换为活动状态,因此它不会呈现。为什么我会遇到这种行为?这两段代码不是等价的,应该产生相同的行为吗?
我认为这两个代码是等价的,但事实并非如此,所以答案之一是将 SingleCarousel
中的 Carousel.Item
替换为 Fragment
并将其命名为
<Carousel.Item>
<SingleCarousel
imgPath="https://www.fg-a.com/wallpapers/black-with-stars.jpg"
header="First slide label"
content="Placeholder text"
/>
</Carousel.Item>
Carousel.Item
是转换所必需的,因此您需要在调用某些东西之前添加它
Codesandbox:https://codesandbox.io/s/purple-wave-3300o?file=/src/HomeCarousels.js
编辑: CodeSandBox link - https://codesandbox.io/s/lucid-boyd-9tqhg?file=/src/HomeCarousels.js
以下代码工作正常:
<Carousel>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/2019-black-fantasy-sky.jpg"
alt="Second slide"
/>
<Carousel.Caption>
<h3>Second slide label</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</Carousel.Caption>
</Carousel.Item>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/black-circles-2018.jpg"
alt="Third slide"
/>
<Carousel.Caption>
<h3>Third slide label</h3>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
</Carousel.Caption>
</Carousel.Item>
</Carousel>
但是,当我尝试通过将单个 Carousel.Item 移动到它自己的 React 组件中来重构它时,我 运行 遇到了问题。
SingleCarousel.js
class SingleCarousel extends React.Component {
render() {
return (
<Carousel.Item>
<img
className="d-block w-100"
src={this.props.imgPath}
alt={this.props.header}
/>
<Carousel.Caption>
<h3>{this.props.header}</h3>
<p>{this.props.content}</p>
</Carousel.Caption>
</Carousel.Item>
);
}
}
Main.js(目前只是用 class 的实例替换一个轮播):
<Carousel>
<SingleCarousel
imgPath="https://www.fg-a.com/wallpapers/2019-black-fantasy-sky.jpg"
header="Second slide label"
content="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
/>
<Carousel.Item>
<img
className="d-block w-100"
src="https://www.fg-a.com/wallpapers/black-circles-2018.jpg"
alt="Third slide"
/>
<Carousel.Caption>
<h3>Third slide label</h3>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>
</Carousel.Caption>
</Carousel.Item>
</Carousel>
在第二种情况下,第一个轮播项目不会呈现在页面上。但是,我可以在 DOM 树中看到 DOM 元素。在 chrome 中检查时,问题是第一个项目的“carousel-item”div 永远不会更改为“active carousel-item”。我实际上有两个以上的元素,所以我可以看到它正在循环遍历所有项目,但无法将组件项目转换为活动状态,因此它不会呈现。为什么我会遇到这种行为?这两段代码不是等价的,应该产生相同的行为吗?
我认为这两个代码是等价的,但事实并非如此,所以答案之一是将 SingleCarousel
中的 Carousel.Item
替换为 Fragment
并将其命名为
<Carousel.Item>
<SingleCarousel
imgPath="https://www.fg-a.com/wallpapers/black-with-stars.jpg"
header="First slide label"
content="Placeholder text"
/>
</Carousel.Item>
Carousel.Item
是转换所必需的,因此您需要在调用某些东西之前添加它
Codesandbox:https://codesandbox.io/s/purple-wave-3300o?file=/src/HomeCarousels.js