reactjs - React 的 Swiper js 无法正确渲染子项

标签 reactjs children swiper.js

首先,我使用 React、Gatsby 和 Swiperjs。

我在将子项渲染到 Swiper 组件中时遇到问题。 我在两个地方(博客和作品集部分)使用了 swiper,因此我创建了 CardsSlider 组件来重用它。我使用两种类型的相似组件,因此我使用高阶组件用 SwiperSlide 包围每个卡片组件。然后,我迭代每个数据以生成由 SwiperSlide 组件包围的卡片,作为 CardsSlider 的子属性,这基本上是 Swiper。问题是:SwiperSlide 卡没有用 SwiperWrapper 组件包装,您可以在下面的 devtools 的 ss 中看到。

HTML Tags

博客组件:

const Blog = () => {
  const { postImage } = useStaticQuery(...)
  const CardsData = [
    {
      title: 'Post1',
      description:
        'Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum veritatis in reiciendis sit facere enim modi, libero placeat consectetur eaque?',
      image: postImage,
    }, 
     ...
  ];

  const BlogPostCardWithSlider = withSlider(BlogPostCard);

  return (
    <StyledSection>
      <StyledHeader text="BLOG" />
      <CardsSlider pagination>
        {CardsData.map((data) => (
          <BlogPostCardWithSlider key={data.title} data={data} />
        ))}
      </CardsSlider>
      <Button dark text="ZOBACZ WSZYSTKIE WPISY" />
    </StyledSection>
  );
};

export default Blog;

投资组合组件:

 const Portfolio = () => {
  const { projectImage } = useStaticQuery(...);

  const CardsData = [
    {
      title: 'Project1',
      description:
        'Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum veritatis in reiciendis sit facere enim modi, libero placeat consectetur eaque?',
      image: projectImage,
      techStack: ['bootstrap', 'nodejs', 'sequelize', 'react', 'mssql'],
    },
    ...
  ];

  const ProjectCardWithSlider = withSlider(ProjectCard);

  return (
    <StyledSection odd>
      <StyledHeader text="PORTFOLIO" />
      <CardsSlider navigation loop>
        {CardsData.map((data) => (
          <ProjectCardWithSlider key={data.title} data={data} />
        ))}
      </CardsSlider>
    </StyledSection>
  );
};

export default Portfolio;

withSlider HOC:

import React from 'react';
import { SwiperSlide } from 'swiper/react';

const slideStyles = {
  display: 'flex',
  justifyContent: 'center',
  alignItems: 'center',
};

const withSlider = (WprappedComponent) => (props) => (
  <SwiperSlide style={slideStyles}>
    <WprappedComponent {...props} />
  </SwiperSlide>
);

export default withSlider;

CardsSlider 组件:

import React from 'react';
import styled from 'styled-components';
import { Swiper } from 'swiper/react';
import SwiperCore, { Pagination, Navigation } from 'swiper';
import 'swiper/swiper-bundle.css';

SwiperCore.use([Pagination, Navigation]);

const SwiperWrapper = styled(Swiper)`
  ...
`;

const CardsSlider = ({ children, pagination, ...rest }) => {
  const params = {
    spaceBetween: 0,
    pagination: pagination && { clickable: true },
    ...rest,
  };

  return <SwiperWrapper {...params}>{children}</SwiperWrapper>;
};

有趣的事实是,当我像这样映射 child 时:

{children.map((child) => <SwiperSlide>{child}<SwiperSlide/>)}

它渲染在正确的位置。

感谢您的帮助。

最佳答案

在处理最小示例时,我遇到了同样的问题。如果子项不是 SwiperSlides,则它们似乎是在包装器之后添加的。 我的建议是将 SwiperSlide 保留为 Swiper 组件的直接子组件,并使用 HOC 来显示幻灯片的内容。至少,这似乎是唯一对我有用的东西,而且我对此很满意,因为我不想在 Swiper 的内部结构上浪费太多时间。

关于reactjs - React 的 Swiper js 无法正确渲染子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66993033/

相关文章:

javascript - 如何检测swiper js中的当前幻灯片?

jquery - Swiper slider 在 Bootstrap 选项卡面板内不起作用

reactjs - 我想在“下一步”中重定向用户而不使用 <Link>。 React Router 有 useNavigate(),那么 Next Router 有类似的东西吗?

javascript - 在 react-native 中从 superview 的底部布局一个按钮

python - BeautifulSoup 寻找特定的 child

Jquery $(this) 子选择器

javascript - 如果没有 child ,则针对特定元素

加载 Ng-Repeat 元素后运行的 jQuery Swiper 脚本

javascript - 如何在渲染函数中返回多个组件?

reactjs - 在模拟器中测试 native firebase 推送通知