Vue实现列表过滤与排序的两种方法

简介: Vue实现列表过滤与排序的两种方法

侦听属性实现列表过滤:

<div id="APP">
  <input type="text" v-model="keyWord">
  <ul>
    <li v-for="(item,index) of newList" :key="item.id">
      {{item.name}} - {{item.age}} - {{item.sex}}
    </li>
  </ul>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      // keyWord 用于接收用户输入的内容
      keyWord:"",
      // 原始数据列表,用于过滤,不可更改
      list:[
        {id:1, name:"马冬梅", age:30, sex:"女"},
        {id:2, name:"周冬雨", age:18, sex:"女"},
        {id:3, name:"周杰伦", age:26, sex:"男"},
        {id:4, name:"温兆伦", age:24, sex:"男"}
      ],
      // 过滤后的数据列表,用于渲染页面
      newList:[]
    }
  },
  watch:{
    // 监听 keyWord 数据变化,当用户输入时进行操作
    keyWord:{
      // 初始化时执行一下,避免页面加载时 newList 中没有数据
      immediate:true,
      handler(val){
        // 利用 filter 方法让 newList 等于过滤后的数据列表
        this.newList = this.list.filter((item) => {
          // 利用 indexOf 方法返回条件成立的数据
          return item.name.indexOf(val) !== -1;
        })
      }
    }
  }
});

:filter 方法不归 Vue 管理,所以要写成箭头函数的形式。

 

计算属性实现列表过滤【推荐】:

<div id="APP">
  <input type="text" v-model="keyWord">
  <ul>
    <li v-for="(item,index) of newList" :key="item.id">
      {{item.name}} - {{item.age}} - {{item.sex}}
    </li>
  </ul>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      // keyWord 用于接收用户输入的内容
      keyWord:"",
      // 原始数据列表,用于过滤,不可更改
      list:[
        {id:1, name:"马冬梅", age:30, sex:"女"},
        {id:2, name:"周冬雨", age:18, sex:"女"},
        {id:3, name:"周杰伦", age:26, sex:"男"},
        {id:4, name:"温兆伦", age:24, sex:"男"}
      ]
    }
  },
  computed:{
    // 计算一个新的数据列表,用于渲染页面
    newList(){
      // 返回过滤后的数据列表
      return this.list.filter((item) => {
        return item.name.indexOf(this.keyWord) !== -1;
      })
    }
  }
});

计算属性实现列表排序

<div id="APP">
  <input type="text" v-model="keyWord">
  <button @click="sortType = 2">年龄升序</button>
  <button @click="sortType = 1">年龄降序</button>
  <button @click="sortType = 0">原顺序</button>
  <ul>
    <li v-for="(item,index) of newList" :key="item.id">
      {{item.name}} - {{item.age}} - {{item.sex}}
    </li>
  </ul>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      keyWord: "",
      // 0 表示原顺序、1 降序、2 升序
      sortType: 0,
      list:[
        {id:1, name:"马冬梅", age:30, sex:"女"},
        {id:2, name:"周冬雨", age:18, sex:"女"},
        {id:3, name:"周杰伦", age:26, sex:"男"},
        {id:4, name:"温兆伦", age:24, sex:"男"}
      ]
    }
  },
  computed:{
    newList(){
      // 因为需要排序过滤之后的数据,所以不能直接返回
      const arr = this.list.filter((item) => {
        return item.name.indexOf(this.keyWord) !== -1;
      })
      // 判断 sortType 是否不为 0,不为 0 表示需要排序
      if(this.sortType){
        arr.sort((min,max) => {
          // 1 表示降序,从大到小。2 表示升序,从小到大
          if(this.sortType === 1){
            return max.age - min.age;
          }else{
            return min.age - max.age;
          }
        })
      }
      return arr;
    }
  }
});

原创作者:吴小糖

创作时间:2023.3.14

相关文章
|
2天前
|
数据采集 JavaScript 前端开发
Vue框架的优缺点是什么
【7月更文挑战第5天】 Vue框架:组件化开发利于重用与扩展,响应式数据绑定简化状态管理;学习曲线平缓,生态系统丰富,集成便捷,且具性能优化手段。缺点包括社区规模相对小,类型支持不足(Vue 3.x改善),路由和状态管理需额外配置,SEO支持有限。随着发展,部分缺点正被克服。
8 1
|
3天前
|
JavaScript
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint
|
3天前
|
JavaScript
青戈大佬安装Vue,无Eslint安装版,vue2安装,vue2无eslint,最简单配置Vue安装资料
青戈大佬安装Vue,无Eslint安装版,vue2安装,vue2无eslint,最简单配置Vue安装资料
|
3天前
|
JavaScript
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
|
2天前
|
JavaScript 前端开发 开发工具
如何学习vue框架
【7月更文挑战第5天】 - 先学HTML/CSS/JS基础和前端工程化工具(npm, webpack, Git)。 - 从Vue官方文档学习基础,包括指令、组件、响应式系统。 - 深入研究Vue Router和Vuex,掌握路由管理和状态管理。 - 学习自定义指令和Mixins,优化性能技巧。 - 实战项目练习,加入Vue社区,阅读相关资源,提升技能。 - 关注Vue生态,持续实践和创新,以适应不断发展的框架。
6 0
|
2天前
vue3 【提效】自动导入框架方法 unplugin-auto-import 实用教程
vue3 【提效】自动导入框架方法 unplugin-auto-import 实用教程
12 0
|
3天前
|
JavaScript
vue知识点
vue知识点
7 1
|
3天前
|
JavaScript 区块链
vue 自定义网页图标 favicon.ico 和 网页标题
vue 自定义网页图标 favicon.ico 和 网页标题
10 1
|
4天前
|
存储 JavaScript 数据安全/隐私保护
vue实战——登录【详解】(含自适配全屏背景,记住账号--支持多账号,显隐密码切换,登录状态保持)
vue实战——登录【详解】(含自适配全屏背景,记住账号--支持多账号,显隐密码切换,登录状态保持)
14 1
|
4天前
|
JavaScript
vue实战——404页面模板001——男女手电筒动画
vue实战——404页面模板001——男女手电筒动画
12 1