You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue组件中循环内addEventListener无法正常工作的问题咨询

Vue组件中循环内addEventListener无法正常工作的问题咨询

各位大佬好,我最近开发Vue项目时遇到了个头疼的问题——我写了一个用来切换密码显示/隐藏的组件,单独使用时完全正常,但把它放到v-for循环里渲染后,点击图标触发切换的功能就失效了,点击完全没反应,控制台也没报错,实在找不到问题出在哪,想请大家帮忙看看。

先贴一下我的组件代码:

<template>
  <span :data-target="target" class="input-icon">
    <slot></slot>
  </span>
</template>

<script>
export default {
  name: "InputIcon",
  props: {
    target: String,
  },
  mounted() {
    let showHidePassword = function (selector) {
      let elem = document.querySelectorAll(selector);
      elem.forEach((item) => {
        item.addEventListener("click", function (e) {
          e.preventDefault();
          let target = document.getElementById(
            item.getAttribute("data-target")
          );
          if (target.type == "password") {
            target.type = "text";
            item.classList.add("shown");
          } else {
            target.type = "password";
            item.classList.remove("shown");
          }
        });
      });
    };

    showHidePassword(".password-toggle");
  },
};
</script>

我在父组件里是这样循环使用这个组件的:

<template>
  <div v-for="(field, index) in passwordList" :key="index">
    <input :id="`password-input-${index}`" type="password" v-model="field.value" />
    <InputIcon 
      :target="`password-input-${index}`" 
      class="password-toggle"
    >
      <i class="fa fa-eye"></i>
    </InputIcon>
  </div>
</template>

单独使用一个InputIcon组件时,点击图标能正常切换输入框的密码显示状态,但一放到循环里,所有图标点击都没反应了。我猜测是不是mounted钩子执行的时候,循环里的元素还没完全渲染?或者是事件绑定的方式有问题?有没有朋友遇到过类似的情况,能给我点思路吗?

备注:内容来源于stack exchange,提问作者Erjan Kydyrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:43:05