如何使用v-for(Vue.js)循环JSON对象并将渲染的DOM分为两个div容器?

问题描述 投票:2回答:1

我有一个Axios回调,该回调返回一个JSON格式的数组,其中包含170个键:值对。现在,我使用v-for将每个key:value对的一个div容器渲染到另一个div包装器中(因此结果显示为一列)。

我估计的输出将有两列作为DOM输出,每列具有85个key:value对。

一旦迭代JSON数组的前85个(50%)到最后创建彼此相邻的两列,如何使v-for跳到第二个div包装器(假设html / css结构很好就可以了。 )?

非常感谢您的想法!

Vue.config.devtools = true;

var app = new Vue({
  delimiters: ['[[', ']]'],
  el: '.eurQuotesWrapper',
  data() {
    return {
      rates: []
    }},
  created() {
    axios
      .get("http://data.fixer.io/api/latest?access_key=XXX&base=EUR")
      .then(response => {
        this.rates = response.data.rates;
      });
  }
});
.column {
  margin-top: 8px;
  margin-left: 6px;
  height: 100%;
  width: 16%;
  float: left;
  border: 1px solid;
  border-radius: 10px;
}

.headings {
  text-align: center;
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
  color: #2E1A6D;
  margin-top: 5px;
  margin-bottom: 5px;
}

.keyColumn {
  float: left;
  width: 15%;
  height: 100%;
}

.valueColumn {
  float: left;
  width: 35%;
  height: 100%;
}

.key {
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
}

.value {
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
  padding-left: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<html>

<body>

<div class="column">
  <div class="headings">EUR/XXX</div>
  <div class="eurQuotesWrapper">
    <div class="keyColumn">
      <div v-for="(value, key) in rates" class="key">[[ key ]]</div>
    </div>
    <div class="valueColumn">
      <div v-for="(value, key) in rates" class="value">[[ value ]]</div>
    </div>
    <div class="keyColumn">
      <div v-for="(value, key) in rates" class="key"></div>
    </div>
    <div class="valueColumn">
      <div v-for="(value, key) in rates" class="value"></div>
    </div>
  </div>
</div>

</body>

<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</html>
javascript html vue.js
1个回答
3
投票

重点是创建一组computed值,这些值仅返回从API获得的对象的前一半(或后一半)。通过使用计算值,原始响应将保持“完好无损”以备将来处理。

这不是DRY解决方案(但可以修改为),我将为列创建一个组件-但在此代码段中,我只是使用了一种更简单的显示形式(<div v-for=""></div>]

Vue.config.devtools = true;

var app = new Vue({
  delimiters: ['[[', ']]'],
  el: '.eurQuotesWrapper',
  data() {
    return {
      rates: [],
    }
  },
  computed: {
    rates1() {
      const ratesArr = Object.entries(this.rates)
      const ret = ratesArr.reduce((a, c, i, d) => {
        if (i <= d.length / 2) a[c[0]] = c[1]
        return a
      }, {})
      console.log('rates1', ret)
      return ret
    },
    rates2() {
      const rateArr = Object.entries(this.rates)
      const ret = rateArr.reduce((a, c, i, d) => {
        if (i > d.length / 2) a[c[0]] = c[1]
        return a
      }, {})
      console.log('rates2', ret)
      return ret
    }
  },
  created() {
    axios
      .get("http://data.fixer.io/api/latest?access_key=XXX&base=EUR")
      .then(response => {
        this.rates = response.data.rates;
      });
  }
});
/*.column {
  margin-top: 8px;
  margin-left: 6px;
  height: 100%;
  width: 16%;
  float: left;
  border: 1px solid;
  border-radius: 10px;
}

.headings {
  text-align: center;
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
  color: #2E1A6D;
  margin-top: 5px;
  margin-bottom: 5px;
}

.keyColumn {
  float: left;
  width: 15%;
  height: 100%;
}

.valueColumn {
  float: left;
  width: 35%;
  height: 100%;
}

.key {
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
}

.value {
  font-family: 'Varela Round', sans-serif;
  font-weight: bold;
  font-size: 16px;
  padding-left: 20px;
}*/

.keyColumn {
  float: left;
}

.valueColumn {
  float: left;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<html>

<body>

  <div class="column">
    <div class="headings">EUR/XXX</div>
    <div class="eurQuotesWrapper">
      <strong>COL1</strong>
      <div v-for="(value, key) in rates1">[[key]]: [[value]]</div>
      <hr />
      <strong>COL2</strong>
      <div v-for="(value, key) in rates2">[[key]]: [[value]]</div>
    </div>
  </div>

</body>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

</html>
© www.soinside.com 2019 - 2024. All rights reserved.