【问题标题】:Passing dynamic data to bootstrap's modal by props in VueJS通过 VueJS 中的 props 将动态数据传递给引导程序的模态
【发布时间】:2024-01-22 09:48:01
【问题描述】:

我正在处理一个小型个人项目,但我在引导模式方面遇到了一个小问题。我有一个项目列表(卡片内的每个人),我想在每次点击卡片时显示详细信息。但无论我点击哪张卡片,我总是在模态中得到相同的值(来自第一个项目)。这是我的代码

App.vue

<template>
  <div>
    <Navbar />
    <Projects />
  </div>
</template>
 
<script>
import Navbar from "./components/Navbar.vue";
import Projects from "./components/projects/Projects.vue";
 
export default {
  name: "App",
  components: { Navbar, Projects },
};
</script>

Projects.vue

<template>
  <div class="projects bg-light" id="projects_title">
    <h1>Projects</h1>
    <div class="projects_cards">
      <div v-for="project in projects" class="single_project" :key="project.id">
        <SingleProject :project="project"/>
          <Modal :project="project" />
      </div>
    </div>
  </div>
</template>
 
<script>
import SingleProject from "./SingleProject.vue";
import Modal from "../Modal.vue";
export default {
  data() {
    return {
      projects: [
        {
          id: "1",
          number: "III",
          title:
            "Title 4",
        },
        {
          id: "2",
          number: "IV",
          title: "Title 4",
        },
      ],
    };
  },
  components: {
    SingleProject,
    Modal,
  },
};
</script>

SingleProject.vue

<template>
  <div class="card mx-2" style="width: 18rem;">
  <div class="card-body">
    <h5 class="card-title">  {‌{project.number}} </h5>
    <h6 class="card-subtitle mb-2 text-muted">{‌{project.title}}</h6>
    <p class="card-text">Some quick example text</p>
    <a class="card-link" data-toggle="modal" data-target="#exampleModal">Project Card</a>
  </div>
</div>
</template>
 
<script>
export default {
  props: {project : {
    type: Object
  }},
}
</script>

Modal.vue

<template>
  <div>
    <div
      class="modal fade"
      id="exampleModal"
      tabindex="-1"
      aria-labelledby="exampleModalLabel"
      aria-hidden="true"
    >
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title" id="exampleModalLabel">{‌{project.id}}</h5>
            <button
              type="button"
              class="close"
              data-dismiss="modal"
              aria-label="Close"
            >
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <div class="modal-body">
            {‌{project.title}}
          </div>
          <div class="modal-footer">
            <button
              type="button"
              class="btn btn-secondary"
              data-dismiss="modal"
            >
              Close
            </button>
            <button type="button" class="btn btn-primary">Save changes</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
 
<script>
export default {
  props: {
    project: {
      type: Object,
    },
  },
};
</script>

在道具内部,一切都很好。

【问题讨论】:

    标签: javascript twitter-bootstrap vue.js modal-dialog vue-props


    【解决方案1】:

    对我来说,这就是问题所在:

    <a class="card-link" data-toggle="modal" data-target="#exampleModal">Project Card</a>
    
    

    数据目标触发器#exampleModal是一个id,并且你所有的模态都有相同的id,所以你会得到这样的奇怪行为。

    你有不同的方法来处理它,比如使用@click事件会更好,但你需要做很多重构。

    一个小的修复可能是这样的:

    Modal.vue

    :id="'exampleModal-' + project.id"
    

    单个项目.vue

    <a class="card-link" data-toggle="modal" :data-target="'#exampleModal-' + project.id">Project Card</a>
    

    可以肯定的是,用格式化的值更新所有的 id。

    让我知道进展如何并欢呼

    【讨论】:

    • 谢谢伙计,这行得通:) 我尝试过类似的方法,但我删除了数据目标中的主题标签。感谢您的帮助。
    • 很高兴它对您有所帮助:) 如果是这种情况,请您验证答案
    • 只有一件事。 Modal id 也需要允许动态内容所以 :id="'exampleModal-' + project.id"