Les instructions personnalisées Vue peuvent être définies globalement ou localement. Les composants Vue sont la réutilisation du HTML et du code, tandis que les instructions Vue sont une réutilisation étendue du DOM. Examinons de plus près la personnalisation dans l'analyse des instructions.
1. Instructions personnalisées Vue : utilisez Vue.directive(id,definition) pour enregistrer les instructions personnalisées globales et utilisez l'option directives du composant pour enregistrer les instructions personnalisées locales.
2. Fonction hook Vue :
La fonction de définition d'instruction fournit plusieurs fonctions hook (facultatif) :
bind : appelée une seule fois, l'instruction est liée pour la première fois. Appelée lorsqu'un élément est atteint, cette fonction hook peut être utilisée pour définir une action d'initialisation qui est exécutée une fois lors de la liaison.
inséré : Appelé lorsque l'élément lié est inséré dans le nœud parent (il peut être appelé tant que le nœud parent existe et n'a pas besoin d'exister dans le document).
mise à jour : la première fois qu'il est appelé immédiatement après la liaison, le paramètre obtenu est la valeur initiale de la liaison, et il est appelé plus tard lorsque le modèle où se trouve l'élément lié est mis à jour, que le changements de valeur de liaison. En comparant les valeurs de liaison avant et après la mise à jour, les mises à jour inutiles du modèle peuvent être ignorées (voir ci-dessous pour les paramètres détaillés de la fonction hook).
componentUpdated : appelé lorsque le modèle où se trouve l'élément lié termine un cycle de mise à jour.
unbind : Appelé une seule fois, lorsque l'instruction n'est pas liée à l'élément.
3. Paramètres de la fonction hook Vue : (el, bind, vnode, oldVnode)
el : L'élément lié par l'instruction peut être utilisé pour faire fonctionner directement le DOM.
binding : un objet contenant les attributs suivants
name : le nom de l'instruction, excluant le préfixe de v- ;
value : la valeur de liaison de l'instruction par exemple ; : v- my-directive="1+1", la valeur de value est 2 ;
oldValue : la valeur précédente liée par l'instruction, disponible uniquement dans les fonctions hook update et componentUpdated, que le changements de valeur ;
expression : la forme de chaîne de la valeur de liaison ; par exemple : v-my-directive="1+1", la valeur de l'expression est '1+1' ; > arg : passé à l'instruction Paramètres ; par exemple : v-my-directive:foo, la valeur de arg est 'foo' ;
modificateurs : un objet contenant des modificateurs par exemple : v-my-directive ; .a.b, la valeur des modificateurs est {'a':true,'b':true>
vnode : nœud virtuel généré compilé par Vue
oldVnode : le dernier nœud virtuel, uniquement ; dans les fonctions de hook update et composantUpdated Disponible.
4. Abréviation de fonction : dans la plupart des cas, nous souhaitons peut-être effectuer des actions répétées sur les hooks de liaison et de mise à jour, et ne voulons pas nous soucier des autres fonctions du hook. Vous pouvez l'écrire comme ceci :<p id="app" v-demo:foo.a.b="message"></p> Vue.directive('demo', { bind: function (el, binding, vnode) { console.log('bind'); var s = JSON.stringify el.innerHTML = 'name: ' + s(binding.name) + '<br>' + 'value: ' + s(binding.value) + '<br>' + 'expression: ' + s(binding.expression) + '<br>' + 'argument: ' + s(binding.arg) + '<br>' + 'modifiers: ' + s(binding.modifiers) + '<br>' + 'vnode keys: ' + Object.keys(vnode).join(', ') } }); new Vue({ el: '#app', data: { message: 'hello!' } });
Vue.directive('color-swatch', function (el, binding) { el.style.backgroundColor = binding.value })
<p v-demo="{ color: 'white', text: 'hello!' }"></p> Vue.directive('demo', function (el, binding) { console.log(binding.value.color) // => "white" console.log(binding.value.text) // => "hello!" })
<p id="app"> <my-comp v-if="msg" :msg="msg"></my-comp> <button @click="update">更新</button> <button @click="uninstall">卸载</button> <button @click="install">安装</button> </p> <script type="text/javascript"> Vue.directive('hello', { bind: function (el){ console.log('bind'); }, inserted: function (el){ console.log('inserted'); }, update: function (el){ console.log('update'); }, componentUpdated: function (el){ console.log('componentUpdated'); }, unbind: function (el){ console.log('unbind'); } }); var myComp = { template: '<h1 v-hello>{{msg}}</h1>', props: { msg: String } } new Vue({ el: '#app', data: { msg: 'Hello' }, components: { myComp: myComp }, methods: { update: function (){ this.msg = 'Hi'; }, uninstall: function (){ this.msg = ''; }, install: function (){ this.msg = 'Hello'; } } }) </script>
b. . Désinstallez le composant : unbind
d. Réinstallez le composant : bind insert
Notez la différence : bind et insert : lors de la liaison, le nœud parent est nul, lorsqu'il est inséré, le nœud parent existe. ; update et composantUpdated : la mise à jour est avant la mise à jour des données, composantUpdated est après la mise à jour des données.
Enfin, la dernière implémentation d'encapsulation d'instructions réellement développée
Idée de base
Exposer l'API au monde extérieurimport store from '@/store' export default { inserted(el, binding, vnode) { const { value } = binding const roles = store.state.permission.pagePermission if (value && typeof value === 'string' && value.length > 0) { const hasPermission = roles.some(role => { return role.permission == value }) if (!hasPermission) { el.parentNode && el.parentNode.removeChild(el) } } else { throw new Error(`need roles! Like v-permission="'button'"`) } } }
import permission from './permission' const install = function(Vue) { Vue.directive('permission', permission) } if (window.Vue) { window['permission'] = permission Vue.use(install) // eslint-disable-line } permission.install = install export default permission
Comment utiliser les instructions personnalisées de Vue pour compléter un menu déroulant
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!