Vue.js
componenti
Ricerca…
Osservazioni
In Component (s):
oggetti di scena è una serie di stringhe letterali o riferimenti a oggetti usati per passare dati dal componente principale. Può anche essere in forma di oggetto quando si desidera avere un controllo più fine come specificare i valori predefiniti, il tipo di dati accettati, se è richiesto o facoltativo
i dati devono essere una funzione che restituisce un oggetto invece di un oggetto semplice. È così perché richiediamo a ciascuna istanza del componente di avere i propri dati per finalità di riusabilità.
eventi è un oggetto che contiene listener per eventi a cui il componente può rispondere in base a cambiamenti comportamentali
metodi oggetto contenente funzioni che definiscono il comportamento associato al componente
le proprietà calcolate sono come osservatori o osservabili, ogni volta che una dipendenza cambia le proprietà vengono ricalcolate automaticamente e le modifiche si riflettono nel DOM immediatamente se DOM utilizza qualsiasi proprietà calcolata
ready è il gancio del ciclo di vita di un'istanza Vue
Ambito del componente (non globale)
HTML
<script type="x-template" id="form-template">
<label>{{inputLabel}} :</label>
<input type="text" v-model="name" />
</script>
<div id="app">
<h2>{{appName}}</h2>
<form-component title="This is a form" v-bind:name="userName"></form-component>
</div>
JS
// Describe the form component
// Note: props is an array of attribute your component can take in entry.
// Note: With props you can pass static data('title') or dynamic data('userName').
// Note: When modifying 'name' property, you won't modify the parent variable, it is only descendent.
// Note: On a component, 'data' has to be a function that returns the data.
var formComponent = {
template: '#form-template',
props: ['title', 'name'],
data: function() {
return {
inputLabel: 'Name'
}
}
};
// This vue has a private component, it is only available on its scope.
// Note: It would work the same if the vue was a component.
// Note: You can build a tree of components, but you have to start the root with a 'new Vue()'.
var vue = new Vue({
el: '#app',
data: {
appName: 'Component Demo',
userName: 'John Doe'
},
components: {
'form-component': formComponent
}
});
Quali sono i componenti e come definire i componenti?
I componenti in Vue sono come i widget. Ci permettono di scrivere elementi personalizzati riutilizzabili con il comportamento desiderato.
Non sono altro che oggetti che possono contenere una o tutte le opzioni che la root o qualsiasi istanza di Vue può contenere, incluso un template HTML da renderizzare.
I componenti consistono in:
- Markup HTML: il modello del componente
- Stili CSS: come verrà visualizzato il markup HTML
- Codice JavaScript: i dati e il comportamento
Questi possono essere scritti ciascuno in un file separato o come un singolo file con estensione .vue
. Di seguito sono riportati esempi che mostrano entrambi i modi:
.VUE - come singolo file per il componente
<style>
.hello-world-compoment{
color:#eeeeee;
background-color:#555555;
}
</style>
<template>
<div class="hello-world-component">
<p>{{message}}</p>
<input @keyup.enter="changeName($event)"/>
</div>
</template>
<script>
export default{
props:[ /* to pass any data from the parent here... */ ],
events:{ /* event listeners go here */},
ready(){
this.name= "John";
},
data(){
return{
name:''
}
},
computed:{
message(){
return "Hello from " + this.name;
}
},
methods:{
// this could be easily achieved by using v-model on the <input> field, but just to show a method doing it this way.
changeName(e){
this.name = e.target.value;
}
}
}
</script>
File separati
hello-world.js - il file JS per l'oggetto componente
export default{
template:require('./hello-world.template.html'),
props:[ /* to pass any data from the parent here... */ ],
events:{ /* event listeners go here */ },
ready(){
this.name="John";
},
data(){
return{
name:''
}
},
computed:{
message(){
return "Hello World! from " + this.name;
}
},
methods:{
changeName(e){
let name = e.target.value;
this.name = name;
}
}
}
ciao-world.template.html
<div class="hello-world-component">
<p>{{message}}</p>
<input class="form-control input-sm" @keyup.enter="changeName($event)">
</div>
ciao-world.css
.hello-world-compoment{
color:#eeeeee;
background-color:#555555;
}
Questi esempi usano la sintassi es2015, quindi Babel sarà necessario per compilarli in es5 per i browser più vecchi.
Babel con Browserify + vueify o Webpack + vue-loader sarà richiesto per compilare hello-world.vue
.
Ora che abbiamo definito il componente hello-world
, dovremmo registrarlo con Vue.
Questo può essere fatto in due modi:
Registrati come componente globale
Nel file main.js
(punto di accesso all'app) possiamo registrare qualsiasi componente a livello globale con Vue.component
:
import Vue from 'vue'; // Note that 'vue' in this case is a Node module installed with 'npm install Vue'
Vue.component('hello-world', require('./hello-world'); // global registeration
new Vue({
el:'body',
// Templates can be defined as inline strings, like so:
template:'<div class="app-container"><hello-world></hello-world></div>'
});
Oppure registrarlo localmente all'interno di un componente principale o di un componente root
import Vue from 'vue'; // Note that 'vue' in this case is a Node module installed with 'npm install Vue'
import HelloWorld from './hello-world.js';
new Vue({
el:'body',
template:'<div class="app-container"><hello-world></hello-world></div>",
components:{HelloWorld} // local registeration
});
I componenti globali possono essere utilizzati ovunque all'interno dell'applicazione Vue.
I componenti locali sono disponibili solo per l'uso nel componente principale con cui sono registrati.
Componente del frammento
Potresti ricevere un errore della console che ti dice che non puoi fare qualcosa perché il tuo è un componente di frammento . Per risolvere questo tipo di problema è sufficiente avvolgere il modello del componente all'interno di un singolo tag, come un <div>
.
Registrazione locale dei componenti
Un componente può essere registrato globalmente o localmente (collegarsi a un altro componente specifico).
var Child = Vue.extend({
// ...
})
var Parent = Vue.extend({
template: '...',
components: {
'my-component': Child
}
})
Thiw new component () sarà disponibile solo all'interno dell'ambito (template) del componente Parent.
Registrazione in linea
Puoi estendere e registrare un componente in un solo passaggio:
Vue.component('custom-component', {
template: '<div>A custom component!</div>'
})
Anche quando il componente è registrato localmente:
var Parent = Vue.extend({
components: {
'custom-component': {
template: '<div>A custom component!</div>'
}
}
})
Registrazione dei dati nei componenti
Passare un oggetto alla proprietà dei data
durante la registrazione di un componente farebbe sì che tutte le istanze del componente puntino agli stessi dati. Per risolvere questo, abbiamo bisogno di restituire i data
da una funzione.
var CustomComponent = Vue.extend({
data: function () {
return { a: 1 }
}
})
eventi
Uno dei modi in cui i componenti possono comunicare con i suoi antenati / discendenti è tramite eventi di comunicazione personalizzati. Tutte le istanze di Vue sono anche emettitori e implementano un'interfaccia evento personalizzata che facilita la comunicazione all'interno di un albero di componenti. Possiamo usare il seguente:
-
$on
: ascolta gli eventi emessi da questi componenti antenati o discendenti. -
$broadcast
: emette un evento che si propaga verso il basso a tutti i discendenti. -
$dispatch
: emette un evento che si innesca prima sul componente stesso e che si propaga verso l'alto a tutti gli antenati. -
$emit
: attiva un evento su se stesso.
Ad esempio, vogliamo nascondere un componente pulsante specifico all'interno di un componente del modulo quando il modulo viene inviato. Sull'elemento genitore:
var FormComponent = Vue.extend({
// ...
components: {
ButtonComponent
},
methods: {
onSubmit () {
this.$broadcast('submit-form')
}
}
})
Sull'elemento figlio:
var FormComponent = Vue.extend({
// ...
events: {
'submit-form': function () {
console.log('I should be hiding');
}
}
})
Alcune cose da tenere a mente:
- Ogni volta che un evento trova un componente che lo ascolta e viene attivato, interrompe la propagazione a meno che la funzione callback in questo componente non restituisca
true
. -
$dispatch()
si attiva sempre prima sul componente che lo ha emesso. - Possiamo passare qualsiasi numero di argomenti al gestore di eventi. Facendo
this.$broadcast('submit-form', this.formData, this.formStatus)
ci permette di accedere a questi argomenti come'submit-form': function (formData, formStatus) {}