Vue基础-第二篇

535 阅读3分钟

Vue基础-第二篇

reduce方法的使用

利用reduce方法遍历数组的每一个元素,reduce()调用结果最后返回一个最终值(最后一次return值)

        var arr = [
       {name: 'Vuejs入门', price: 99, count: 3},
       {name: 'Vuejs底层', price: 89, count: 1},
       {name: 'Vuejs从入门到放弃', price: 19, count: 5},
       ]

    //数组名.reduce(回调函数,pre的初始值)
    arr.reduce(function(pre, current){
        // reduce这个方法被调用时,会遍历arr这个数组的每一个元素,每遍历一个元素,就执行一次这里的代码
        // current表示当前正在遍历的这个元素
        // pre 是上一次的这个函数return的值
        // !!!因为第一次遍历没有上一个return值,所以,交给了第二个参数,设置pre的初始值
        console.log(pre, current)
        return 10
    },0)

	//!!!并且reduce方法最终会返回最后一次的return值

需求:计算上面购物车的总价(每一个 price*count 的和)

	//reduce方法最终会返回最后一次的return值
    var a = arr.reduce(function(pre, current){

        console.log(pre, current)

        // var total = 当前这次的 price*count + 上一次的total
        var total = current.price*current.count + pre
        return total
    },0)

    alert(a)   //这个a就是上面购物车的总价

备注:上面这个reduce()方法和Vue本身没有关系,纯粹是一个js数组的方法。

(重点)Vue的计算属性computed 的使用

跟上面的案例一样
什么时候用计算属性:一个值如果受其他值的影响,随着他的变化而发生改变,那这个值就可以做成计算属性。

    <div id="app">
        {{total}}
    </div>
    <script>
        var vm = new Vue({
            el:"#app",
            data:{
                arr: [
                    {name: 'Vuejs入门', price: 99, count: 3},
                    {name: 'Vuejs底层', price: 89, count: 1},
                    {name: 'Vuejs从入门到放弃', price: 19, count: 5},
                ]    
            },
            computed:{
                //computed里面的方法必须有返回值!这个return值将来在视图中被{{total}}引用
                total(){
                    var a = this.arr.reduce(function(pre, current){

                        console.log(pre, current)

                        // var total = 当前这次的 price*count + 上一次的total
                        var total = current.price*current.count + pre
                        return total
                    },0)
                    return a
                }
            }

        })
    </script>

其实计算属性有缓存的效果,第一次使用的时候计算属性的值就会被缓存起来, 被其他值影响的(其他值发生变化)时候,才会再次执行 计算属性的函数;
而普通方法调用1次就执行1次,性能效率低下。

    <div id='app'>
        <p>总价为: {{ compTotal }}</p>
        <p>总价为: {{ compTotal }}</p>
        <p>总价为: {{ compTotal }}</p>
        <p>总价为: {{ compTotal }}</p>
        <p>总价为: {{ compTotal }}</p>
        <p>methods中的总价为: {{ methTotal() }}</p>
        <p>methods中的总价为: {{ methTotal() }}</p>
        <p>methods中的总价为: {{ methTotal() }}</p>
        <p>methods中的总价为: {{ methTotal() }}</p>
        <p>methods中的总价为: {{ methTotal() }}</p>
    </div>  
    <script>
        new Vue({
            el:'#app',
            data:{
                arr: [
                    {name: 'Vuejs入门', price: 99, count: 3},
                    {name: 'Vuejs底层', price: 89, count: 1},
                    {name: 'Vuejs从入门到放弃', price: 19, count: 5},
                ]
            },
            computed:{
                //computed里面的方法必须有返回值!这个return值将来在视图中被{{compTotal}}引用
                compTotal(){
                    console.log("执行了compTotal");
                    let ret = this.arr.reduce((pre,cur)=>{
                        return cur.price*cur.count + pre
                    },0)
                    return "¥"+ret.toFixed(2)+"元"
                }
            },
            methods:{
                methTotal(){
                    console.log("执行了methTotal");
                    let ret = this.arr.reduce((pre,cur)=>{
                        return cur.price*cur.count + pre
                    },0)
                    return "¥"+ret.toFixed(2)+"元"
                }
            }
        })

computed内部方法的另一种写法(知道有get和 set的格式)

            computed:{
                total:{
                    get(){
                        // 获取total的是执行,并缓存这个值, 往后就是arr里面的值发生改变才来执行
                        // get 就相当于刚才写的函数
                        let ret = this.arr.reduce((pre,cur)=>{
                            return cur.price * cur.count + pre
                        },0)
                        return "¥"+ret.toFixed(2)+"元"
                    },
                    set(newValue){  //newValue 用来接收等号后面这个新的值
                        // total的值被修改的时候执行
                        console.log("执行了set方法",newValue);
                    }
                }
            }
            
             vm.total = 11   // 触发set方法的执行

使用:value和@input代替v-model

v-model 可以用 value属性,input事件来替换
v-model 是vue提供给我们的一个语法糖

    <div id='app'>
        <!-- 在用户输入的时候,修改txtVal,修改成用户输入的值 -->
        <input type="text" :value="txtVal" @input="handleInput">
        <p>{{txtVal}}</p>
    </div>  
    <script>
        new Vue({
            el:'#app',
            data:{
                txtVal:"默认值"
            },
            methods:{
                handleInput(e){
                    // 用户输入的时候,就来执行,输入一个字符就触发1次
                    console.log("触发了input事件",e.target.value);
                    // 修改txtVal
                    // this.txtVal = 用户输入的信息
                    this.txtVal = e.target.value
                }
            }
        })