# API de la fonction de rendu
breaking

# Vue d'ensemble

Ce changement n'affectera pas les utilisateurs de <template>.

Voici un résumé rapide de ce qui a changé :

  • h est maintenant importé globalement au lieu d'être passé comme argument aux fonctions de rendu.
  • Les arguments des fonctions de rendu ont été modifiés afin d'être plus cohérents entre les composants à état et fonctionnels.
  • Les VNodes ont maintenant une structure de props plate.

Pour plus d'informations, lisez la suite !

# Argument de la fonction de rendu

# Syntaxe 2.x

En 2.x, la fonction render recevait automatiquement la fonction h (qui est un alias conventionnel pour createElement) comme argument :

// Vue 2 Render Function Example
export default {
  render(h) {
    return h('div')
  }
}
1
2
3
4
5
6

# Syntaxe 3.x

En 3.x, h est maintenant importé globalement au lieu d'être passé automatiquement comme argument.

// Exemple de fonction de rendu de Vue 3
import { h } from 'vue'

export default {
  render() {
    return h('div')
  }
}
1
2
3
4
5
6
7
8

# Modification de la signature de la fonction de rendu

# Syntaxe 2.x

En 2.x, la fonction render recevait automatiquement des arguments tels que h.

// Exemple de fonction de rendu de Vue 2
export default {
  render(h) {
    return h('div')
  }
}
1
2
3
4
5
6

# Syntaxe 3.x

En 3.x, puisque la fonction render ne reçoit plus d'arguments, elle sera principalement utilisée à l'intérieur de la fonction setup(). Cela présente l'avantage supplémentaire d'avoir accès à l'état réactif et aux fonctions déclarées dans la portée, ainsi qu'aux arguments passés à setup().

import { h, reactive } from 'vue'

export default {
  setup(props, { slots, attrs, emit }) {
    const state = reactive({
      count: 0
    })

    function increment() {
      state.count++
    }

    // retour de la fonction de rendu
    return () =>
      h(
        'div',
        {
          onClick: increment
        },
        state.count
      )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Pour plus d'informations sur le fonctionnement de setup(), consultez notre Guide de l'API de composition.

# Format des props VNode

# Syntaxe 2.x

En 2.x, domProps contenait une liste imbriquée dans les props VNode :

// 2.x
{
  staticClass: 'button',
  class: {'is-outlined': isOutlined },
  staticStyle: { color: '#34495E' },
  style: { backgroundColor: buttonColor },
  attrs: { id: 'submit' },
  domProps: { innerHTML: '' },
  on: { click: submitForm },
  key: 'submit-button'
}
1
2
3
4
5
6
7
8
9
10
11

# Syntaxe 3.x

Dans la version 3.x, la structure entière des props VNode est aplatie. En utilisant l'exemple ci-dessus, voici à quoi cela ressemblerait maintenant.

// 3.x Syntax
{
  class: ['button', { 'is-outlined': isOutlined }],
  style: [{ color: '#34495E' }, { backgroundColor: buttonColor }],
  id: 'submit',
  innerHTML: '',
  onClick: submitForm,
  key: 'submit-button'
}
1
2
3
4
5
6
7
8
9

# Composant enregistré

# Syntaxe 2.x

En 2.x, lorsqu'un composant a été enregistré, la fonction de rendu fonctionne bien lorsqu'on passe le nom du composant comme chaîne de caractères au premier argument :

// 2.x
Vue.component('button-counter', {
  data() {
    return {
      count: 0
    }
  }
  template: `
    <button @click="count++">
      Clicked {{ count }} times.
    </button>
  `
})

export default {
  render(h) {
    return h('button-counter')
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Syntaxe 3.x

En 3.x, les VNodes étant sans contexte, nous ne pouvons plus utiliser une chaîne d'ID pour rechercher implicitement les composants enregistrés. A la place, nous devons utiliser une méthode importée resolveComponent :

// 3.x
import { h, resolveComponent } from 'vue'

export default {
  setup() {
    const ButtonCounter = resolveComponent('button-counter')
    return () => h(ButtonCounter)
  }
}
1
2
3
4
5
6
7
8
9

Pour plus d'informations, voir Modification du RFC de l'Api Render Function (opens new window).

# Stratégie de migration

# Auteurs de la bibliothèque

L'importation globale de h signifie que toute bibliothèque contenant des composants Vue devra inclure import { h } from 'vue' quelque part. Par conséquent, cela crée un peu de surcharge car les auteurs de bibliothèques doivent configurer correctement l'externalisation de Vue dans leur configuration de construction :

  • Vue ne doit pas être intégré à la bibliothèque.
  • Pour les modules, l'importation doit être laissée de côté et être gérée par le bundler de l'utilisateur final.
  • Pour les constructions UMD / navigateur, l'importation doit d'abord essayer le fichier global Vue.h et se rabattre sur les appels require.

# Prochaines étapes

Voir le Guide de la fonction de rendu pour une documentation plus détaillée !

Deployed on Netlify.
Dernière Mise-à-jour: 11/20/2021, 10:06:27 AM