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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow