Sök…


Anmärkningar

Data kontra beräknade egenskaper

Huvudanvändningsfall skillnad för data och computed egenskaperna hos en Vue instans är beroende på den potentiella tillstånd eller sannolikhet för byte av data. När du bestämmer vilken kategori ett visst objekt ska vara kan dessa frågor hjälpa:

  • Är detta ett konstant värde? ( data )
  • Har detta möjlighet att förändras? ( dator eller data )
  • Beror värdet på det på värdet på andra data? ( beräknad )
  • Behöver det ytterligare data eller beräkningar för att vara fullständiga innan de används? ( beräknad )
  • Kommer värdet endast att ändras under vissa omständigheter? ( data )

Grundläggande exempel

Mall

<div id="example">
  a={{ a }}, b={{ b }}
</div>

JavaScript

var vm = new Vue({
  el: '#example',
  data: {
    a: 1
  },
  computed: {
    // a computed getter
    b: function () {
      // `this` points to the vm instance
      return this.a + 1
    }
  }
})

Resultat

a=1, b=2

Här har vi förklarat en beräknad egenskap b . Funktionen som vi tillhandahåller kommer att användas som getterfunktion för fastigheten vm.b :

console.log(vm.b) // -> 2
vm.a = 2
console.log(vm.b) // -> 3

vm.b är alltid beroende av vm.a .

Du kan binda data till beräkna egenskaper i mallar precis som en normal egenskap. Vue är medveten om att vm.b beror på vm.a , så det kommer att uppdatera alla bindningar som beror på vm.b när vm.a ändras.

Beräknade egenskaper kontra klocka

mall

<div id="demo">{{fullName}}</div>

se exempel

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  }
})

vm.$watch('firstName', function (val) {
  this.fullName = val + ' ' + this.lastName
})

vm.$watch('lastName', function (val) {
  this.fullName = this.firstName + ' ' + val
})

Beräknat exempel

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

Beräknade bosättare

Beräknade egenskaper kommer automatiskt att beräknas igen när data som beräkningen beror på ändras. Men om du måste ändra en beräknad egenskap manuellt, låter Vue dig skapa en setter-metod för att göra detta:

Mall (från grundexemplet ovan):

<div id="example">
  a={{ a }}, b={{ b }}
</div>

Javascript:

var vm = new Vue({
  el: '#example',
  data: {
    a: 1
  },
  computed: {
    b: {
      // getter
      get: function () {
        return this.a + 1
      },
      // setter
      set: function (newValue) {
        this.a = newValue - 1 
      }
    }
  }

Du kan nu åberopa antingen getter eller setter:

console.log(vm.b)       // -> 2
vm.b = 4                // (setter) 
console.log(vm.b)       // -> 4
console.log(vm.a)       // -> 3

vm.b = 4 kommer att påkalla setteren och ställa detta.a till 3; som förlängning kommer vm.b att utvärdera till 4.

Med hjälp av beräknade inställningar för v-modell


Du kanske behöver en v-model på en datoregenskap. Normalt uppdaterar inte v-modellen det beräknade egendomsvärdet.

Mallen:

<div id="demo">
  <div class='inline-block card'>
    <div :class='{onlineMarker: true, online: status, offline: !status}'></div>  
    <p class='user-state'>User is {{ (status) ? 'online' : 'offline' }}</p>
  </div>

  <div class='margin-5'>
    <input type='checkbox' v-model='status'>Toggle status (This will show you as offline to others)
  </div>
</div>

styling:

#demo {
  font-family: Helvetica;
  font-size: 12px;
}
.inline-block > * {
  display: inline-block;
}
.card {
  background: #ddd;
  padding:2px 10px;
  border-radius: 3px;
}
.onlineMarker {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  transition: all 0.5s ease-out;
}

.online {
  background-color: #3C3;
}

.offline {
  background-color: #aaa;
}

.user-state {
  text-transform: uppercase;
  letter-spacing: 1px;
}

.margin-5 {
  margin: 5px;
}

Komponenten:

var demo = new Vue({
    el: '#demo',
    data: {
        statusProxy: null
    },
    computed: {
        status: {
            get () {
                return (this.statusProxy === null) ? true : this.statusProxy     
            }
        }
    }
})

fiddle Här skulle du se, att klicka på alternativknappen har ingen nytta alls, din status är fortfarande online.

var demo = new Vue({
    el: '#demo',
    data: {
        statusProxy: null
    },
    computed: {
        status: {
            get () {
                return (this.statusProxy === null) ? true : this.statusProxy     
            },
            set (val) {
                this.statusProxy = val            
            }
        }
    }
})

fiddle Och nu kan du se växlingen hända när kryssrutan är markerad / avmarkerad.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow