如何在Vue JS中使用v-for和orderBy过滤器来反转数组的顺序?

Sov*_*iut 33 javascript arrays vue.js

我正在使用Vue JS来执行viewmodel绑定.在我的data对象中,我有一个按升序排序的项目数组(从最旧到最新),我希望保持这种方式基于代码的原因.

var v = new Vue({
    el: '#app',
    data: {
        items: [
            {id: 51,  message: 'first'},
            {id: 265, message: 'second'},
            {id: 32,  message: 'third'}
        ],
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在模板中显示数组时,我想颠倒顺序,使其下降(从最新到最旧).我尝试了以下方法:

<ol>
    <li v-for="item in items | orderBy -1" track-by="id">
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为orderBy过滤器似乎需要字段名称作为其第一个参数.

有没有办法v-for使用orderBy过滤器使用语法在模板中完成此操作?或者我将不得不创建自定义reverse过滤器?

Nim*_*ari 69

简洁明了的解决方案:

<li v-for="item in items.slice().reverse()">
//do something with item ...
</li>
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是答案的一个解决方案,但我要说你必须从开发人员眼中看出解决方案.许多经验丰富的开发人员都在努力保持业务逻辑和显示逻辑分离.特别是那些处理过将两者合并在一起的痛点的人.该解决方案有效,是的,它是一个很好的替代解决方案或其他解 然而,它确实将业务逻辑与显示逻辑混合得比大多数人认为可接受的更进一步. (7认同)
  • @RyanWatts 这就是使用 `.slice()` 方法的原因。它将返回一个新数组,因此原始的“items”数组不会受到影响。 (4认同)
  • 这是正确的答案.为什么人们会这么复杂?修辞. (2认同)
  • 它可以工作,但在控制台中返回错误*切片不是函数* (2认同)

kir*_*ern 28

我只是改变了显示的顺序,而不是颠倒创建元素的顺序。

<ol class="reverseorder">
    <li v-for="item in items" track-by="id">
Run Code Online (Sandbox Code Playgroud)

还有我的 CSS

<style>
.reverseorder {
  display: flex;
  flex-direction: column-reverse;
}
</style>
Run Code Online (Sandbox Code Playgroud)

无需克隆数组并反转它。

  • 作为旁注,这不会反转制表符索引 - 这意味着制表符顺序将是错误的。这对于可访问性来说并不是很好,因此如果您正在使用交互式元素(例如输入),请记住这一点。 (4认同)
  • 哇!这是绝妙的解决方案。轻巧且非常灵活)谢谢 (3认同)
  • 这是目前为止的理想答案。在 Javascript 数组中进行反向操作是另一种处理 (2认同)

t_d*_*m93 23

更新Vue2

我想展示一些方法,您可以使用数据而不使用过滤器,因为它们在Vue2 中已弃用:

内部计算属性

使用计算属性代替过滤器,这要好得多,因为您可以在组件中的任何地方使用该数据,而不仅仅是在模板中: jsFiddle

computed: {
    reverseItems() {
        return this.items.slice().reverse();
  }     
}
Run Code Online (Sandbox Code Playgroud)

在Vuex getter属性内

如果您正在使用Vuex,则将数据存储在store.state对象中.使用状态存储的数据进行某些转换的最佳方法是在getters对象中执行此操作(例如,通过项目列表进行过滤并计算它们,反向顺序等等...)

getters: {
    reverseItems: state => {
        return state.items.slice().reverse();
    }
}
Run Code Online (Sandbox Code Playgroud)

并从组件计算属性中的getter中检索状态:

computed: {
    showDialogCancelMatch() {
        return this.$store.state.reverseItems;
    }
}
Run Code Online (Sandbox Code Playgroud)


Pan*_*lis 18

注意:以下工作在Vue 1中,但在Vue 2过滤器中不推荐使用,您将看到:'属性或方法"reverse"未在实例上定义,但在渲染期间引用.请参阅tdom_93的vue2答案.

您可以创建自定义过滤器以按相反顺序返回项目:

Vue.filter('reverse', function(value) {
  // slice to make a copy of array, then reverse the copy
  return value.slice().reverse();
});
Run Code Online (Sandbox Code Playgroud)

然后在v-for表达式中使用它:

<ol>
    <li v-for="item in items | reverse" track-by="id">
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/pespantelis/sgsdm6qc/

  • 在vue 2.0中不起作用,错误是'属性或方法'反向"未在实例上定义,但在渲染期间引用." (7认同)