javascript - VueJS Accordion 表 - 出现在表外

标签 javascript vue.js

我有一个表,其中使用 ajax 获取数据。我正在尝试创建一个表,其中每一行都有一个关联的隐藏行,单击该行会切换隐藏行的显示。隐藏行包含 Accordion 。

问题是 Accordion 变得一团糟并显示在表格的底部,而不是显示在它被点击的特定行的下方。

我的代码如下:

<table class="table table-striped table-bordered table-hover">
    <thead>
      <tr>
        <th v-for="column in columns">
           <span v-if="column == 'Predictive Price'">
                {{column}} 
                <i class="fa fa-info-circle" v-tooltip="msg"></i>
           </span>
           <span v-else-if="column == 'Actual Price'">
                 {{column}}
           <i class="fa fa-info-circle" v-tooltip="tooltip.actual_price"></i>
                              </span>
                              <span v-else>

                                {{column}}
                              </span>
                          </th>
                          <th>Actions</th>
                       </tr>

                   </thead>

                   <tbody>
                      <tr v-for="row in model" @click="showRow">

                          <td>
                              {{row.id}}
                          </td>

                          <td>
                              {{row.company_customer.customer_name}}
                          </td>

                          <td>
                              <i class="fa fa-map-marker"></i>
                              <small>
                                {{row.pickup_addr.address_1}}, {{row.pickup_addr.city}}, {{row.pickup_addr.postcode}}
                              </small>
                          </td>

                          <td>
                              <i class="fa fa-map-marker"></i>
                              <small>
                                  {{row.pickup_addr.address_1}}, {{row.pickup_addr.city}}, {{row.pickup_addr.postcode}}
                              </small>
                          </td>

                          <td>
                                &pound;{{row.predictive_price}}
                          </td>

                          <td>
                                &pound;{{row.actual_price}}
                          </td>

                          <td>
                              n/a
                          </td>

                          <tr>
                            <td colspan="7" v-if="contentVisible">
                                  <div class="accordian-body">
                                      ACCORDION 
                                  </div>
                            </td>
                          </tr>

                      </tr>



                  </tbody>
              </table>


<script>

export default {

    methods: {
        data() {
          return {
            msg: 'This is just an estimation!',

            tooltip: {
                actual_price: 'Click on the price to edit it.'
            },

            contentVisible: false,

          }
      },
      rowRow() {
          this.contentVisible = !this.contentVisible;
      }
    }

}

</script>

我应该 Handlebars 风琴 div 放在哪里才能正确显示?

编辑:

请参阅 fiddle :https://jsfiddle.net/49gptnad/355/

最佳答案

听起来您想要一个与每一行关联的 Accordion ,所以实际上,您想要为每个数据项两行

您可以通过将 v-for 移动到包装两行的 template 标记来实现这一点。

此外,您需要逐行控制内容是否可见,因此为每个数据项添加一个 contentVisible 属性,并使用它来控制您的第二行是否可见。

console.clear()

var vm = new Vue({
  el: '#vue-instance',
  data: {
    testing: [{
        id: 1,
        name: "Customer 1",
        contentVisible: false

      },
      {
        id: 2,
        name: "Customer 1",
        contentVisible: false

      },
      {
        id: 3,
        name: "Customer 3",
        contentVisible: false

      },
    ],
    columns: ["id", "name"]
  },

  mounted() {
    console.log(this.testing);
  },

  methods: {
    showRow(data) {
      this.contentVisible = !this.contentVisible;

    }

  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
<div id="vue-instance">
  <table class="table table-striped table-bordered table-hover">
    <thead>
      <tr>
        <th v-for="column in columns">
          {{column}}
        </th>
      </tr>
    </thead>

    <tbody>
      <template v-for="row in testing">
        <tr @click="row.contentVisible = !row.contentVisible">
           <td>{{row.id}}</td>
           <td>{{row.name}}</td>
         </tr>
         <tr v-if="row.contentVisible">
           <td :colspan="columns.length" >
             <div class="accordian-body">
               afasfafs
             </div>
           </td>
         </tr>
      </template>
    </tbody>
  </table>
</div>

这是您更新的 fiddle .

关于javascript - VueJS Accordion 表 - 出现在表外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44544994/

相关文章:

javascript - 如何在pdfjs中添加onclick()

vue.js - Vue-cli:在 git bash windows 上创建新项目时箭头键不起作用

javascript - 在文本末尾移动一个 div

vue.js - 升级到 Vue 3 : where to put data and methods?

javascript - 无法使用 Nuxt 和 Vuejs 找到正确的页面

javascript - 如何在nuxt中使用amchart?

javascript - 在 JavaScript Canvas API 中设置允许的绘图区域

javascript - 以动态形式替换输入的占位符

javascript - react Excel 工作簿构建

javascript - 显式调用与父函数查找的效率