javascript js:为什么通过document.querySelector()对map()元素的更改会导致重新呈现?

eanckbw9  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(140)
const slides = [
    [string1, string2, stringi],
    [string1, string2, stringi],
    [string1, string2, stringi],
    [string1, string2, stringi],
];

const changeSlide = (num) => {
    const discipline = document.querySelector("#changeSlide-"+num)
    discipline.classList.toggle("hidden")
}

    return (
            <div className="flex flex-col w-1/2 h-60 px-12 py-4 items-center shadow-lg rounded-xl ring-1 ring-black/5">
                <h1 className="pb-2">
                    Technical Skills
                </h1>
                <ul className="flex space-x-2 border-b-2 mb-2">
                    <li>
                        <a href="" className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
                            onClick={() => changeSlide(0)}>Software</a>
                    </li>
                    <li>
                        <a href="" className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
                            onClick={() => changeSlide(1)}>Firmware</a>
                    </li>
                    <li>
                        <a href="" className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
                            onClick={() => changeSlide(2)}>Mechanical</a>
                    </li>
                    <li>
                        <a href="" className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
                            onClick={() => changeSlide(3)}>DevOps</a>
                    </li>
                </ul>
                {slides.map(function(slide, idx) {
                    return <div className="hidden"
                                id={"changeSlide-"+idx}
                                key={idx}>
                                    {slide.map(function(line, jdx) {
                                        return <p key={jdx}>{line}</p>
                                        })
                                    }
                            </div>
                        })
                    }
        </div>
    )
}

this is what this renders for me
我想让这个react组件在相应的菜单按钮被单击时返回slides数组中的字符串。它确实是这样做的。问题是页面似乎在内容显示后再次呈现。我说可能是因为据我所知它可能是在重新运行map函数或其他东西。
我需要1)找出在changeSlide(idx)被调用onClick之后发生了什么以及为什么发生,以及2)应该做什么。
我不确定上面的代码是否会运行,因为我删除了很多我实际使用的东西。我认为一个更简单的视图会有所帮助。让我知道,我会重新发布工作代码,但这应该是最好的说明问题。谢谢。

oxcyiej7

oxcyiej71#

问题是链接有一个href集合,所以点击它会导航(再次导航到当前页面,因为href是一个空字符串)。要么删除href,防止点击时的默认操作,要么使用另一个元素(可能是一个按钮)样式看起来像一个链接。
删除href:

<a className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
    onClick={() => changeSlide(0)}>Software</a>

使用event.preventDefault()

<a href="" className="p-2 inline-block rounded-t-lg hover:bg-gray-200"
    onClick={e => {
      e.preventDefault();
      changeSlide(0);
    }}>Software</a>

此外,最好将所选索引存储在状态中,而不是手动修改DOM。

相关问题