【问题标题】:VueJS Accordion Table - Appears outside of the tableVueJS 手风琴表 - 出现在表之外
【发布时间】:2017-11-16 14:51:17
【问题描述】:

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

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

我的代码如下:

<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>

我可以在哪里放置手风琴 div 以使其正确显示?

编辑:

请看小提琴:https://jsfiddle.net/49gptnad/355/

【问题讨论】:

  • 你把你的手风琴tr放在另一个tr里面。放在后面。 tr 不能是另一个 tr 的子代。
  • @RoyJ 请看这个小提琴:如你所见,它没有达到我需要它做的效果:jsfiddle.net/49gptnad/355 甚至把它放在tr之外
  • 手风琴应该是一行还是在一个单元格中?或者更确切地说,您似乎希望每行都有一个手风琴?
  • @BertEvans 我想要下面一行的手风琴。因此,它基本上会在特定行下方展开,但不应展开所有行。可悲的是,目前 JSFiddle 扩展了所有行并且还出现在侧面而不是额外的行(如果你喜欢)
  • @BertEvans 这完美!非常感谢。在性能方面,是在page load 上加载手风琴的数据还是在点击时通过 ajax 加载/显示数据更好?

标签: javascript vue.js


【解决方案1】:

听起来您想要一个与每一行关联的手风琴,所以实际上,您希望每个数据项都有 行。

您可以通过将 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

【讨论】:

  • 我刚刚意识到了一些事情。我得到了你的实现row.contentVisible = !row.contentVisible 但是,在我的实例中(jsfiddle 只是一个例子)我使用的是store,它从axios request.. 我在这个数据中没有 row.contentVisible.. 因此是否可以为每个数据添加一行或简单地以另一种方式处理?
  • @phorce 只需在您的 axios 响应处理程序中使用 map 即可将属性添加到数据中。
  • 虽然会是一个解决方案,但这个应用程序是实时的。所以通过向商店添加地图是行不通的,因为每次更新某些东西时它会关闭手风琴啊哈!
  • @phorce 你想问一个单独的问题来处理这些额外的约束吗?
  • 我只有:stackoverflow.com/questions/44551563/… 任何帮助将不胜感激:)
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多