Vue2(生命周期,列表排序,计算属性和监听器)(三)

简介: Vue2(生命周期,列表排序,计算属性和监听器)

二,vue中列表排序


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            <input type="text" v-model="searchInput" name="" id="">
            <button @click="paixu(1)">升序</button>
            <button @click="paixu(2)">降序</button>
            <button @click="paixu(3)">原序列</button>
            <div v-for="(item,index) in searchList">
                {{item.name}}--{{item.price}}
            </div>
        </div>
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script>
    var app = new Vue({
        el:'#app',
        data(){
            return{
                keyword:0, // 用来排序
                searchInput:"",
                goodList:[
                    {name:'牛仔裤',price:200},
                    {name:'运动鞋',price:100},
                    {name:'跑步鞋',price:300},
                    {name:'篮球鞋',price:400},
                ],
            }
        },
        methods:{
            paixu(val){
                this.keyword=val
            }
        },
        computed:{
            searchList(){
                // 把goodList的内容过滤,把符合条件的形成一个新的数组
                // filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中
                let list = this.goodList.filter((item)=>{
                    return item.name.indexOf(this.searchInput)!==-1
                })
                if(this.keyword){
                    list.sort((a1,a2)=>{
                        return this.keyword === 1
                        ? a1.price - a2.price
                        : a2.price - a1.price
                    })
                }
                return list
            }
        }
    })
</script>
</html>

e48cddfe12cfbf05f42b4450fa3038fc_7315c3a053e64a08926ebc959a85752e.png

2.1,vue中数据更新的问题

2.1-1,对象新增数据更新问题
  • 描述
  • 通过普通对象添加属性方法,Vue不能监测到且不是响应式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div v-for="(attr,key) in person">
            {{key}} -- {{attr}}
        </div>
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script>
    var app = new Vue({
        el:'#app',
        data(){
            return{
                person:{
                    name:'张三',
                    sex:'男',
                }
            }
        },
    })
</script>
</html>

2728aeafaefdc6aa0b54611ace90f864_f50e583137e641c884ebefd7bb013cc4.png

这样添加它没有没有跟对象一样封装有监测数据变化的getter、setter

  • 解决
  • Vue.set() / this.$set
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div v-for="(attr,key) in person">
            {{key}} -- {{attr}}
        </div>
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script>
    var app = new Vue({
        el:'#app',
        data(){
            return{
                person:{
                    name:'张三',
                    sex:'男',
                }
            }
        },
    })
</script>
</html>

47fea0df79a40d98e08ac6f31e9db212_d495f8a84372467fa2bd4bd304c9702b.png

  • 注意
  • this.$set不能给vue实例的根数据对象添加属性


2.1-1,数组数据更新问题
  • 描述
  • 直接通过数组索引值改变数组的数据,Vue监测不到改变
  • 实际在 js 内存已经把数据的第一项数据修改了
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div v-for="(attr,key) in person">
            {{key}} -- {{attr}}
        </div>
        <div>
            <input type="text" v-model="searchInput" name="" id="">
            <button @click="paixu(1)">升序</button>
            <button @click="paixu(2)">降序</button>
            <button @click="paixu(3)">原序列</button>
            <div v-for="(item,index) in searchList">
                {{item.name}}--{{item.price}}
            </div>
        </div>
    </div>
</body>
<script src="../js/vue2.7.js"></script>
<script>
    var app = new Vue({
        el:'#app',
        data(){
            return{
                keyword:0, // 用来排序
                searchInput:"",
                goodList:[
                    {name:'牛仔裤',price:200},
                    {name:'运动鞋',price:100},
                    {name:'跑步鞋',price:300},
                    {name:'篮球鞋',price:400},
                ],
                person:{
                    name:'张三',
                    sex:'男',
                }
            }
        },
        methods:{
            paixu(val){
                this.keyword=val
            }
        },
        computed:{
            searchList(){
                // 把goodList的内容过滤,把符合条件的形成一个新的数组
                // filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中
                let list = this.goodList.filter((item)=>{
                    return item.name.indexOf(this.searchInput)!==-1
                })
                if(this.keyword){
                    list.sort((a1,a2)=>{
                        return this.keyword === 1
                        ? a1.price - a2.price
                        : a2.price - a1.price
                    })
                }
                return list
            }
        }
    })
</script>
</html>

3450023a585938a5c2c6dcd71780f886_b1c28fec7c5d4c4182b48848412bff81.png

  • 原因
  • 因为在vue中数组并没有跟对象一样封装有监测数据变化的getter、setter
  • 解决
  • Vue在数组的原始操作方法上包裹了重新解析模板的方法,也就是说我们在data里面的数组操作方法不是原生的,是vue封装过的
  • 哪些数组操作方法经过了封装?
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
pop() 删除数组的最后一个元素并返回删除的元素
shift()  删除并返回数组的第一个元素
unshift()  向数组的开头添加一个或更多元素,并返回新的长度。
splice()  从数组中添加或删除元素。
sort()   对数组的元素进行排序
reverse() 反转数组的元素顺序。

相关文章
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
829 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
489 1
|
9月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
开发者
vue3生命周期钩子变化
【10月更文挑战第4天】
|
监控 JavaScript 前端开发
vue学习第十二章(生命周期)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。本文深入探讨了Vue实例的生命周期,从初始化到销毁各阶段的关键钩子函数及其应用场景,帮助你更好地理解Vue的工作原理。如果你觉得有帮助,欢迎关注我,将持续分享更多优质内容!🎉🎉🎉
221 1
vue学习第十二章(生命周期)
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
JavaScript API
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
225 1
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
|
JavaScript
Vue 的父组件和子组件生命周期钩子执行顺序
在 Vue 中,父组件和子组件的生命周期钩子执行顺序如下:
|
JavaScript
|
JavaScript
vue3 生命周期
【10月更文挑战第14天】vue3 生命周期