Vue.js
Berekende eigenschappen
Zoeken…
Opmerkingen
Gegevens versus berekende eigenschappen
Het belangrijkste use-case verschil voor de data
en computed
eigenschappen van een Vue
instantie is afhankelijk van de potentiële status of waarschijnlijkheid van wijziging van de gegevens. Bij het bepalen van welke categorie een bepaald object moet zijn, kunnen deze vragen helpen:
- Is dit een constante waarde? ( data )
- Heeft dit de mogelijkheid om te veranderen? ( berekend of gegevens )
- Is de waarde ervan afhankelijk van de waarde van andere gegevens? ( berekend )
- Heeft het aanvullende gegevens of berekeningen nodig om volledig te zijn voordat het wordt gebruikt? ( berekend )
- Zal de waarde alleen veranderen onder bepaalde omstandigheden? ( data )
Basis voorbeeld
Sjabloon
<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
}
}
})
Resultaat
a=1, b=2
Hier hebben we een berekende eigenschap verklaard b
. De door ons opgegeven functie wordt gebruikt als de getter-functie voor de eigenschap vm.b
:
console.log(vm.b) // -> 2
vm.a = 2
console.log(vm.b) // -> 3
De waarde van vm.b
is altijd afhankelijk van de waarde van vm.a
U kunt gegevens binden aan berekende eigenschappen in sjablonen, net als een normale eigenschap. Vue is zich ervan bewust dat vm.b
afhankelijk is van vm.a
, dus het zal alle bindingen bijwerken die afhankelijk zijn van vm.b
wanneer vm.a
verandert.
Berekende eigenschappen versus horloge
sjabloon
<div id="demo">{{fullName}}</div>
kijk voorbeeld
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
})
Berekend voorbeeld
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
Berekende Setters
Berekende eigenschappen worden automatisch opnieuw berekend wanneer gegevens waarvan de berekening afhankelijk is, veranderen. Als u echter een berekende eigenschap handmatig moet wijzigen, kunt u met Vue een setter-methode maken om dit te doen:
Sjabloon (uit het basisvoorbeeld hierboven):
<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
}
}
}
U kunt nu de getter of de setter gebruiken:
console.log(vm.b) // -> 2
vm.b = 4 // (setter)
console.log(vm.b) // -> 4
console.log(vm.a) // -> 3
vm.b = 4
roept de setter op en stelt this.a in op 3; bij uitbreiding zal vm.b evalueren tot 4.
Berekende setters gebruiken voor v-model
Mogelijk hebt u een v-model
voor een berekende eigenschap. Normaal gesproken zal het v-model de berekende eigenschapswaarde niet bijwerken.
De sjabloon:
<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;
}
De component:
var demo = new Vue({
el: '#demo',
data: {
statusProxy: null
},
computed: {
status: {
get () {
return (this.statusProxy === null) ? true : this.statusProxy
}
}
}
})
viool Hier zou je zien, klikken op het keuzerondje heeft helemaal geen zin, je status is nog steeds 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
}
}
}
})
viool En nu kun je zien dat het wisselen gebeurt terwijl het selectievakje is ingeschakeld / uitgeschakeld.