• vue-基础3——计算属性


    计算属性

    复杂逻辑,模板难以维护

    (1) 基础例子

    <body>
        <div id="box">
         {{myname.substring(0,1).toUpperCase() + myname.substring(1)}}
    
         <p>计算属性:{{getName}}</p>
         <p>计算属性:{{getName}}</p>
    
         <p>方法:{{getNameMethod()}}</p>
         <p>方法:{{getNameMethod()}}</p>
    
         <p>{{getMyResult}}</p>
        </div>	
    
        <script type="text/javascript">
    
           var vm =  new Vue({
              el:"#box",
              data:{
                myname:"kerwin"
              },
              methods: {
                getNameMethod(){
                  console.log("getNameMethod")
                  return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1)
                }
              },
              computed: {
                getName(){
                  // 8*******
                  console.log("getName-computed",this)
                  return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1)
                },
                //完整写法
                getMyResult:{
                  get(){
                    return "1111111"
                  },
                  set(newvalue){
                    //接受新的值
                    console.log("接受计算属性传来的值",newvalue)
                  }
                }
              },
            })
    
    
            /*
              data: 状态 
              computed :
                1. 逻辑计算,防止模板过重
                2. 监听:依赖修改 ,get方法必须 return 
              
              watch: 监听,观察
                不用return 调用
    
            */
        </script>
    </body>
    

      

    (2) 计算缓存 VS methods
    -计算属性是基于它们的依赖进行缓存的。
    -计算属性只有在它的相关依赖发生改变时才会重新求值
    用计算属性制作一个购物车的全选按钮例子
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Examples</title>
    <meta name="description" content="">
    <meta name="keywords" content="">
    <link href="" rel="stylesheet">
    
    <script type="text/javascript" src="lib/vue.js"></script>
    </head>
    <body>
        <div id="box">
            全选:<input type="checkbox" v-model="isAllComputedChecked"/>
            <ul>
              <li v-for="(data,index) in list" :key="data.id" style="overflow: hidden;">
                <input type="checkbox" :value="data" v-model="checkgroup" style="float: left;"
                />
                <div style="float: left;">
                  <div>{{data.name}}</div>
                  <div>价格:{{data.price}}</div>
                </div>
    
                <div style="float: left;margin-left: 20px;">
                  <button @click="handleDel(data)">-</button>
                  {{data.number}}
                  <button @click="data.number++">+</button>
                </div>
    
                <div style="float: right;">
                  <button @click="handleRemve(index,data.id)">remove</button>
                </div>
              </li>
            </ul>
    
            <p>checkgroup勾选:{{checkgroup}}</p>
            <p>list:{{list}}</p>  
            
            <p>总金额:{{ computedSum }}</p>
        </div>
        
        <script type="text/javascript">
           var vm =  new Vue({
              el:"#box",
              data:{
                name:"kerwin",
                checkgroup:[],
                isAllChecked:false,
                list:[
                    {
                          name:"商品1",
                          price:10,
                          number:1,
                          id:"1",
                    },
                        {
                          name:"商品2",
                          price:20,
                          number:2,
                          id:"2",
                        },
                        {
                          name:"商品3",
                          price:30,
                          number:3,
                          id:"3",
                        }
                  ]
              },
              methods: {
                //删除的方法
                handleRemve(index,id){
                  console.log(index)
                  //删除时list
                  this.list.splice(index,1)
                  //删除checkgroup
                  // this.checkgroup.splice(index,1)
                  this.checkgroup = this.checkgroup.filter(item=>item.id!=id)
                },
                //商品减少
                handleDel(data){
                  data.number--
                  if(data.number===0){
                    data.number =1
                  }
                },
              },
    
              computed: {
                //计算总金额
                computedSum(){
                  var sum = 0;
                  for(var i in this.checkgroup){
                    sum += this.checkgroup[i].price*this.checkgroup[i].number
                  }
                  return sum
                  // return "1111"
                },
                isAllComputedChecked:{
                  get(){
                    var mychecked
                    if(this.checkgroup.length===this.list.length && this.list.length!==0){
                    //全选chekcbox勾上
                      mychecked  = true
                    }else{
                      // 取消checkbox勾选
                      mychecked = false
                    }
                    return mychecked
                  },
                  set(checked){
                    console.log(checked)
                    if(checked){
                      this.checkgroup = this.list
                    }else{
                      this.checkgroup = []
                    }
                  }
                }
              }
            })
        </script>
    </body>
    </html>
    

    (3) data vs computed vs watch

    Mixins

    混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。
    混入对象可以包含任意组件选项。
    当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

    https://cn.vuejs.org/v2/guide/mixins.html#%E5%9F%BA%E7%A1%80

    <body>
        <div id="box">
            <button @click="handleGet()">
              ajax-get
            </button>
            <button @click="handlePost()">
              ajax-post
            </button>
    
            {{getA}}
        </div>	
    
        <script type="text/javascript">
          //mixin 公共方法引入,
    
          var http = {
            methods:{
              handleGet(){
                // new 
                console.log("ajax.get()....,业务逻辑")
                //ajax.get()....
                
              },
              handlePost(){
                console.log("ajax.post()....,业务逻辑")
                //ajax.get()....
              }    
            },
            computed: {
              getA(){
                return "aaaaaaaaa";
              }
            },
          }
    
    
          new Vue({
            el:"#box",
            mixins:[http],
            data:{
    
            },
            methods: {
              //只做视图逻辑
              handleGet(){
                // new 
                console.log("ajax.get()....,业务逻辑------vue实例定义")
                //ajax.get()....
                
              },
            },
          })
        </script>
    </body>
    

      

  • 相关阅读:
    winform 监视DataGridView的滚动条,加载数据
    SQL 自动生成行号
    SQL 删除重复的数据(多个字段判断),只保留一条数据
    C# 一个简单的 工厂模式 例子
    winform 重写TextBox的OnTextChanged方法(事件)
    winform 给文本框加载内容的时候 始终让文本框的滚动条到底(允许显示多行Multiline=True)
    winform 制定DataGridViewTextColumn列(更改DataGridView的Cell的状态很有用)
    winform 使用委托 实现多线程访问控件
    C# 一个简单的递归函数和 两个List<T> 合并
    ADO.NET  把数据库A的某表的数据内容复制到数据库B的某表内
  • 原文地址:https://www.cnblogs.com/wuziqiang/p/13274932.html
Copyright © 2020-2023  润新知