javascript - setAttribute 不适用于 create-react-app 中的 onClick

标签 javascript reactjs onclick create-react-app setattribute

设置为 document.createElement("span") 的变量(“navBtn”)会创建一个范围,但由于某种原因在该范围上使用 setAttribute 不起作用。 navBtn 变量位于其自己的函数中,setAttribute 尝试使用 onClick 来调用不同的函数。我正在跟随一个使用常规 Javascript 制作轮播/幻灯片的视频。我不确定代码应该从常规 JavaScript 更改为 React 多少,因此我尝试使用 JSX、常规 JavaScript 等绑定(bind)方法。但似乎没有任何效果。

我正在尝试从此网站重新创建轮播:https://www.spacex.com/ 我不知道如何制作一个,所以我开始观看一段视频,该视频与网站上的幻灯片具有相同的功能,但以我自己的方式对其进行了调整,使其看起来像 SpaceX 的视频。这是在 Create-react-app 中,我正在关注的视频是纯 JavaScript 的,这就是为什么我还没有使用 props 或 states 的原因。

import React, {Component} from 'react';
import {Link} from "react-router-dom";
import './Showcase.css';

var slideIndex, slides, navBtns, captionText;
class Showcase extends Component{
    constructor(props){
        super(props);
        this.moveSlide = this.moveSlide.bind(this);
        this.plusSlides = this.plusSlides.bind(this);
    }
    componentDidMount(){
        this.initGallery();
    }
    initGallery(){
        slideIndex = 0;
        slides = document.getElementsByClassName('imageHolder');
        slides[slideIndex].style.opacity = 1;

        captionText = document.querySelector('.captionHolder .captionText');
        captionText.innerText = slides[slideIndex].querySelector(".captionText").innerText;

        navBtns=[];
        var navBtnsContainer = document.getElementById('navBtnsContainer');

        for(var i=0; i < slides.length; i++){
            var navBtn = document.createElement("span");
            navBtn.classList.add("navBtns");
            navBtn.setAttribute("onClick", "{() => this.moveSlide("+i+")}");
            navBtnsContainer.append(navBtn);
            navBtns.push(navBtn);
        };

        navBtns[slideIndex].classList.add("active");
    }
    plusSlides(n){
        this.moveSlide(slideIndex + n);
    }
    moveSlide(n){
        var i, current, next;
        var moveSlideAnimClass = {
            forCurrent: "",
            forNext: ""
        };
        if(n > slideIndex){
            if(n>=slides.length){n=0}
            moveSlideAnimClass.forCurrent = "moveLeftCurrentSlide";
            moveSlideAnimClass.forNext = "moveLeftNextSlide";
        } else if(n < slideIndex){
            if(n < 0){n = slides.length - 1}
            moveSlideAnimClass.forCurrent = "moveRightCurrentSlide";
            moveSlideAnimClass.forNext = "moveRightNextSlide";
        }
        if(n != slideIndex){
            next = slides[n];
            current = slides[slideIndex];
            for(i=0; i<slides.length;i++){
                slides[i].className="imageHolder";
                slides[i].style.opacity=0;
                navBtns[i].classList.remove("active");
            }
            current.classList.add(moveSlideAnimClass.forCurrent);
            next.classList.add(moveSlideAnimClass.forNext);
            navBtns[n].classList.add("active");
            slideIndex=n;
            slides[slideIndex].style.opacity = 1;
        }
    }
    render(){
        return(
            <section id="Showcase"> {/*CONTAINS ALL SLIDING IMAGES*/}
                <div className="captionHolder">
                    {/* <p className="captionText"></p> */}
                    <Link exact to="/amos" className="captionText"></Link>
                    <Link exact to="/amos">Watch Replay</Link>
                    <div id="right" onClick={() => this.plusSlides(1)}>RIGHT</div>
                    <div id="left" onClick={() => this.plusSlides(-1)}>LEFT</div>
                </div>
                <div className="imageHolder"> {/*HOLDS ALL IMAGES HERE*/}
                    <img src="https://www.spacex.com/sites/spacex/files/amos17_v2.jpg" alt="Amos-17 Mission"/>
                    <p className="captionText">Amos-17 Mission</p>
                </div>

                <div className="imageHolder"> {/*HOLDS ALL IMAGES HERE*/}
                    <img src="https://www.spacex.com/sites/spacex/files/v2_smallsatheader.png" alt="RideShare Missions"/>
                    <p className="captionText">Smallsat Rideshare Program</p>
                </div>

                <div className="imageHolder"> {/*HOLDS ALL IMAGES HERE*/}
                    <img src="https://www.spacex.com/sites/spacex/files/nasa_astronauts3.jpg" alt="NASA Astronauts on crew Dragon"/>
                    <p className="captionText">NASA Astronauts on Crew Dragon</p>
                </div>

                <div id="navBtnsContainer"></div>
            </section>
        );
    }
}

export default Showcase;

如果我尝试以“React”方式编写代码,onClick={() => this.moveSlide(i)} 我没有收到错误,但也没有结果。当我尝试以不同的方式编写此 setAttribute 时,我遇到了其他错误,而您通常不会使用 React onClick 属性。结果应该是,单击创建的跨度应将幻灯片移动到下一个图像,并使用“active”类设置下一个 navBtn。我希望它的外观在这里 https://www.spacex.com/

最佳答案

尝试

  navBtn.setAttribute("onClick", "this.moveSlide("+i+")");

  navBtn.setAttribute("onClick", "{this.moveSlide("+i+")}");

关于javascript - setAttribute 不适用于 create-react-app 中的 onClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478168/

相关文章:

javascript - 使用选择器单击时记录

javascript - 为什么 componentWillReceiveProps(nextProps) 不记录/触发

javascript - JavaScript 中的逻辑运算符及其行为

javascript - 如何在基于 d3 力的布局中为节点标签内的文本添加下划线?

php - 删除下拉列表中的重复项

javascript - Active ServiceWorker 并不总是拦截请求

javascript - 如何使用 CodeIgniter 安装 React Js ..?

javascript - 自动调用 onclick 事件

java - 按钮上的多个点击监听器

javascript - 在 Three.js 中使用camera.lookat() 时停止对象倾斜