vue之计算属性(computed)

简介

  • 在vue中,如果在methods中定义了一个函数,也是可以通过插值语法调用的,但会产生一个问题,如果有多个输入框使用了v-model,这时不管输入的内容是否与这个函数有关,这个函数都会执行一次,这样会让降低运行效率,为了解决这个问题,可以使用计算属性

计算属性效果:

  1. 计算属性只有在它的相关依赖发生变化时才会执行
  2. 计算属性是依赖缓存的
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="show"> ----> {{myFunc()}}
    <p><input type="text" v-model="test"> ---> {{test}}</p>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
            show:'',
            test:''
        },
        methods:{
            myFunc(){
                console.log('我执行了')
                return this.show
            }
        }
    })
</script>
</body>
</html>
  • **如下图可以看到,在第二个输入框输入内容后,也会调用myFunc函数
    image

计算属性

  • 只需要在computed属性中定义函数,之后使用插值语法调用的时候不需要加括号执行
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="show"> ----> {{myFunc}}
    <p><input type="text" v-model="test"> ---> {{test}}</p>
</div>
<script>
    new Vue({
        el: '#app',
        data: {
            show: '',
            test: ''
        },
        methods: {},
        // 注意,computed中的函数在调用时不需要加括号
        computed: {
            myFunc() {
                console.log('我执行了')
                return this.show
            }
        }
    })
</script>
</body>
</html>
  • 可以看到,第二个输入框的变化不会使myFunc函数运行
    image

使用computed实现筛选功能

根据用户在input输入框中输入的内容,对数据进行实时筛选,并将筛选后的结果返回到页面中显示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/jQuery.js"></script>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" @input="inputFunc" v-model="myText">
    <ul>
        <li v-for="i in newItemList">{{i}}</li>
    </ul>
</div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            myText: '',
            itemList: ['a', 'ab', 'abc', 'b', 'bc', 'bdc', 'dbd'],
        },
        computed:{
            newItemList(){
                return this.itemList.filter(item => item.indexOf(this.myText) >= 0)
            }
        }
    })
</script>
</html>

image

posted @ 2023-04-12 10:26  树苗叶子  阅读(91)  评论(0编辑  收藏  举报