@vue/language-service 1.9.0-alpha.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/template/en.json +2 -2
- package/data/template/fr.json +1 -1
- package/data/template/ja.json +2 -2
- package/data/template/ko.json +13 -13
- package/data/template/pt.json +18 -18
- package/data/template/zh-cn.json +2 -2
- package/index.d.ts +7 -0
- package/index.js +64 -0
- package/lib/ideFeatures/nameCasing.d.ts +13 -0
- package/{out → lib}/ideFeatures/nameCasing.js +82 -29
- package/lib/plugins/css.d.ts +2 -0
- package/lib/plugins/css.js +27 -0
- package/{out → lib}/plugins/data.d.ts +1 -2
- package/lib/plugins/vue-autoinsert-dotvalue.d.ts +10 -0
- package/{out → lib}/plugins/vue-autoinsert-dotvalue.js +70 -54
- package/lib/plugins/vue-autoinsert-parentheses.d.ts +2 -0
- package/lib/plugins/vue-autoinsert-parentheses.js +60 -0
- package/lib/plugins/vue-autoinsert-space.d.ts +2 -0
- package/lib/plugins/vue-autoinsert-space.js +34 -0
- package/lib/plugins/vue-codelens-references.d.ts +2 -0
- package/lib/plugins/vue-codelens-references.js +38 -0
- package/lib/plugins/vue-directive-comments.d.ts +2 -0
- package/lib/plugins/vue-directive-comments.js +61 -0
- package/lib/plugins/vue-document-drop.d.ts +2 -0
- package/lib/plugins/vue-document-drop.js +81 -0
- package/lib/plugins/vue-extract-file.d.ts +8 -0
- package/lib/plugins/vue-extract-file.js +258 -0
- package/lib/plugins/vue-sfc.d.ts +7 -0
- package/lib/plugins/vue-sfc.js +163 -0
- package/lib/plugins/vue-template.d.ts +3 -0
- package/lib/plugins/vue-template.js +594 -0
- package/lib/plugins/vue-toggle-v-bind-codeaction.d.ts +2 -0
- package/lib/plugins/vue-toggle-v-bind-codeaction.js +126 -0
- package/lib/plugins/vue-twoslash-queries.d.ts +2 -0
- package/lib/plugins/vue-twoslash-queries.js +50 -0
- package/lib/plugins/vue-visualize-hidden-callback-param.d.ts +2 -0
- package/lib/plugins/vue-visualize-hidden-callback-param.js +45 -0
- package/{out → lib}/types.d.ts +1 -2
- package/{out → lib}/types.js +1 -1
- package/package.json +20 -20
- package/scripts/update-html-data.js +426 -0
- package/out/helpers.d.ts +0 -17
- package/out/helpers.js +0 -235
- package/out/ideFeatures/dragImport.d.ts +0 -9
- package/out/ideFeatures/dragImport.js +0 -50
- package/out/ideFeatures/nameCasing.d.ts +0 -16
- package/out/index.d.ts +0 -8
- package/out/index.js +0 -26
- package/out/languageService.d.ts +0 -9
- package/out/languageService.js +0 -239
- package/out/plugins/vue-autoinsert-dotvalue.d.ts +0 -7
- package/out/plugins/vue-autoinsert-parentheses.d.ts +0 -3
- package/out/plugins/vue-autoinsert-parentheses.js +0 -61
- package/out/plugins/vue-autoinsert-space.d.ts +0 -3
- package/out/plugins/vue-autoinsert-space.js +0 -32
- package/out/plugins/vue-codelens-references.d.ts +0 -3
- package/out/plugins/vue-codelens-references.js +0 -54
- package/out/plugins/vue-directive-comments.d.ts +0 -3
- package/out/plugins/vue-directive-comments.js +0 -57
- package/out/plugins/vue-extract-file.d.ts +0 -9
- package/out/plugins/vue-extract-file.js +0 -293
- package/out/plugins/vue-template.d.ts +0 -12
- package/out/plugins/vue-template.js +0 -548
- package/out/plugins/vue-toggle-v-bind-codeaction.d.ts +0 -3
- package/out/plugins/vue-toggle-v-bind-codeaction.js +0 -126
- package/out/plugins/vue-twoslash-queries.d.ts +0 -3
- package/out/plugins/vue-twoslash-queries.js +0 -60
- package/out/plugins/vue-visualize-hidden-callback-param.d.ts +0 -3
- package/out/plugins/vue-visualize-hidden-callback-param.js +0 -43
- package/out/plugins/vue.d.ts +0 -8
- package/out/plugins/vue.js +0 -169
- /package/{out → lib}/plugins/data.js +0 -0
package/data/template/pt.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "Transition",
|
|
6
6
|
"description": {
|
|
7
7
|
"kind": "markdown",
|
|
8
|
-
"value": "\nFornece efeitos de transição animados para um **único** elemento ou componente.\n\n- **Propriedades**\n\n ```ts\n interface TransitionProps {\n /**\n * Usado para gerar automaticamente nomes de classes CSS de transição.\n * exemplo `name: 'fade'` expandirá automaticamente para `.fade-enter`,\n * `.fade-enter-active`, etc.\n */\n name?: string\n /**\n * Decide aplicar classes CSS de transição.\n * Padrão: true\n */\n css?: boolean\n /**\n * Especifica o tipo de eventos de transição à aguardar\n * para determinar a transição e o tempo.\n * O comportamento padrão é detetar automaticamente o tipo\n * que tiver a maior duração.\n */\n type?: 'transition' | 'animation'\n /**\n * Especifica durações explícitas para as transições.\n * O comportamento padrão é esperar pelo primeiro evento `transitionend`\n * ou `animationend` no elemento de transição raiz.\n */\n duration?: number | { enter: number; leave: number }\n /**\n * Controla a sequência de tempo das transições que entram ou saem.\n * O comportamento padrão é simultâneo.\n */\n mode?: 'in-out' | 'out-in' | 'default'\n /**\n * Define aplicar a transição na interpretação inicial.\n * Padrão: false\n */\n appear?: boolean\n\n /**\n * Propriedades para personalizar as classes de transição.\n * Use kebab-case nos modelos de marcação, exemplo enter-from-class=\"xxx\"\n */\n enterFromClass?: string\n enterActiveClass?: string\n enterToClass?: string\n appearFromClass?: string\n appearActiveClass?: string\n appearToClass?: string\n leaveFromClass?: string\n leaveActiveClass?: string\n leaveToClass?: string\n }\n ```\n\n- **Eventos**\n\n - `@before-enter`\n - `@before-leave`\n - `@enter`\n - `@leave`\n - `@appear`\n - `@after-enter`\n - `@after-leave`\n - `@after-appear`\n - `@enter-cancelled`\n - `@leave-cancelled` (apenas `v-show`)\n - `@appear-cancelled`\n\n- **Exemplo**\n\n Elemento simples:\n\n ```html\n <Transition>\n <div v-if=\"ok\">conteúdo alternado</div>\n </Transition>\n ```\n\n Forçar uma transição mudando o atributo `key`:\n\n ```html\n <Transition>\n <div :key=\"text\">{{ text }}</div>\n </Transition>\n ```\n\n Componente dinâmico, com o modo de transição + animação ao aparecer:\n\n ```html\n <Transition name=\"fade\" mode=\"out-in\" appear>\n <component :is=\"view\"></component>\n </Transition>\n ```\n\n Ouvir eventos de transição:\n\n ```html\n <Transition @after-enter=\"onTransitionComplete\">\n <div v-show=\"ok\">conteúdo ativado</div>\n </Transition>\n ```\n\n- **
|
|
8
|
+
"value": "\nFornece efeitos de transição animados para um **único** elemento ou componente.\n\n- **Propriedades**\n\n ```ts\n interface TransitionProps {\n /**\n * Usado para gerar automaticamente nomes de classes CSS de transição.\n * exemplo `name: 'fade'` expandirá automaticamente para `.fade-enter`,\n * `.fade-enter-active`, etc.\n */\n name?: string\n /**\n * Decide aplicar classes CSS de transição.\n * Padrão: true\n */\n css?: boolean\n /**\n * Especifica o tipo de eventos de transição à aguardar\n * para determinar a transição e o tempo.\n * O comportamento padrão é detetar automaticamente o tipo\n * que tiver a maior duração.\n */\n type?: 'transition' | 'animation'\n /**\n * Especifica durações explícitas para as transições.\n * O comportamento padrão é esperar pelo primeiro evento `transitionend`\n * ou `animationend` no elemento de transição raiz.\n */\n duration?: number | { enter: number; leave: number }\n /**\n * Controla a sequência de tempo das transições que entram ou saem.\n * O comportamento padrão é simultâneo.\n */\n mode?: 'in-out' | 'out-in' | 'default'\n /**\n * Define aplicar a transição na interpretação inicial.\n * Padrão: false\n */\n appear?: boolean\n\n /**\n * Propriedades para personalizar as classes de transição.\n * Use kebab-case nos modelos de marcação, exemplo enter-from-class=\"xxx\"\n */\n enterFromClass?: string\n enterActiveClass?: string\n enterToClass?: string\n appearFromClass?: string\n appearActiveClass?: string\n appearToClass?: string\n leaveFromClass?: string\n leaveActiveClass?: string\n leaveToClass?: string\n }\n ```\n\n- **Eventos**\n\n - `@before-enter`\n - `@before-leave`\n - `@enter`\n - `@leave`\n - `@appear`\n - `@after-enter`\n - `@after-leave`\n - `@after-appear`\n - `@enter-cancelled`\n - `@leave-cancelled` (apenas `v-show`)\n - `@appear-cancelled`\n\n- **Exemplo**\n\n Elemento simples:\n\n ```html\n <Transition>\n <div v-if=\"ok\">conteúdo alternado</div>\n </Transition>\n ```\n\n Forçar uma transição mudando o atributo `key`:\n\n ```html\n <Transition>\n <div :key=\"text\">{{ text }}</div>\n </Transition>\n ```\n\n Componente dinâmico, com o modo de transição + animação ao aparecer:\n\n ```html\n <Transition name=\"fade\" mode=\"out-in\" appear>\n <component :is=\"view\"></component>\n </Transition>\n ```\n\n Ouvir eventos de transição:\n\n ```html\n <Transition @after-enter=\"onTransitionComplete\">\n <div v-show=\"ok\">conteúdo ativado</div>\n </Transition>\n ```\n\n- **Consultar também:** [Guia - Transição](https://pt.vuejs.org/guide/built-ins/transition.html)\n"
|
|
9
9
|
},
|
|
10
10
|
"attributes": [],
|
|
11
11
|
"references": [
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"name": "TransitionGroup",
|
|
52
52
|
"description": {
|
|
53
53
|
"kind": "markdown",
|
|
54
|
-
"value": "\nFornece efeitos de transição para **múltiplos** elementos ou componentes numa lista.\n\n- **Propriedades**\n\n `<TransitionGroup>` aceita as mesmas propriedades que o `<Transition>` exceto `mode`, e mais duas propriedades adicionais:\n\n ```ts\n interface TransitionGroupProps extends Omit<TransitionProps, 'mode'> {\n /**\n * Se não definido, desenha um fragmento.\n */\n tag?: string\n /**\n * Para personalizar as classes CSS aplicadas durante as transições de movimento.\n * Use kebab-case em modelos de marcação, exemplo move-class=\"xxx\"\n */\n moveClass?: string\n }\n ```\n\n- **Eventos**\n\n `<TransitionGroup>` emite os mesmos eventos que `<Transition>`.\n\n- **Detalhes**\n\n Por padrão, `<TransitionGroup>` não desenha um elemento de DOM que envolve, mas pode ser definido através da propriedade `tag`.\n\n Note que todo filho num `<transition-group>` deve ser [**identificado unicamente**](https://pt.vuejs.org/guide/essentials/list.html#maintaining-state-with-key) para que as animações funcionem apropriadamente.\n\n `<TransitionGroup>` suporta transições de movimento através de transformações de CSS. Quando a posição dum filho na tela é mudada após uma atualização, será aplicada uma classe de movimento CSS (gerada automaticamente pelo atributo `name` ou configurada pela propriedade `move-class`). Se a propriedade de CSS `transform` é passível de transição quando a classe de movimento é aplicada, o elemento será suavemente animado até o seu destino usando a [técnica FLIP](https://aerotwist.com/blog/flip-your-animations/).\n\n- **Exemplo**\n\n ```html\n <TransitionGroup tag=\"ul\" name=\"slide\">\n <li v-for=\"item in items\" :key=\"item.id\">\n {{ item.text }}\n </li>\n </TransitionGroup>\n ```\n\n- **
|
|
54
|
+
"value": "\nFornece efeitos de transição para **múltiplos** elementos ou componentes numa lista.\n\n- **Propriedades**\n\n `<TransitionGroup>` aceita as mesmas propriedades que o `<Transition>` exceto `mode`, e mais duas propriedades adicionais:\n\n ```ts\n interface TransitionGroupProps extends Omit<TransitionProps, 'mode'> {\n /**\n * Se não definido, desenha um fragmento.\n */\n tag?: string\n /**\n * Para personalizar as classes CSS aplicadas durante as transições de movimento.\n * Use kebab-case em modelos de marcação, exemplo move-class=\"xxx\"\n */\n moveClass?: string\n }\n ```\n\n- **Eventos**\n\n `<TransitionGroup>` emite os mesmos eventos que `<Transition>`.\n\n- **Detalhes**\n\n Por padrão, `<TransitionGroup>` não desenha um elemento de DOM que envolve, mas pode ser definido através da propriedade `tag`.\n\n Note que todo filho num `<transition-group>` deve ser [**identificado unicamente**](https://pt.vuejs.org/guide/essentials/list.html#maintaining-state-with-key) para que as animações funcionem apropriadamente.\n\n `<TransitionGroup>` suporta transições de movimento através de transformações de CSS. Quando a posição dum filho na tela é mudada após uma atualização, será aplicada uma classe de movimento CSS (gerada automaticamente pelo atributo `name` ou configurada pela propriedade `move-class`). Se a propriedade de CSS `transform` é passível de transição quando a classe de movimento é aplicada, o elemento será suavemente animado até o seu destino usando a [técnica FLIP](https://aerotwist.com/blog/flip-your-animations/).\n\n- **Exemplo**\n\n ```html\n <TransitionGroup tag=\"ul\" name=\"slide\">\n <li v-for=\"item in items\" :key=\"item.id\">\n {{ item.text }}\n </li>\n </TransitionGroup>\n ```\n\n- **Consultar também:** [Guia - `TransitionGroup`](https://pt.vuejs.org/guide/built-ins/transition-group.html)\n"
|
|
55
55
|
},
|
|
56
56
|
"attributes": [],
|
|
57
57
|
"references": [
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"name": "KeepAlive",
|
|
98
98
|
"description": {
|
|
99
99
|
"kind": "markdown",
|
|
100
|
-
"value": "\nArmazena para consulta imediata os componentes alternados dinamicamente envolvidos dentro.\n\n- **Propriedades**\n\n ```ts\n interface KeepAliveProps {\n /**\n * Se especificado, apenas componentes com nomes correspondidos\n * pelo `include` estarão na memória de consulta imediata.\n */\n include?: MatchPattern\n /**\n * Qualquer componente com um nome correspondidos pelo `exclude`\n * não estarão na memória de consulta imediata.\n */\n exclude?: MatchPattern\n /**\n * O número máximo de instâncias de componente à armazenar\n * na memória de consulta imediata.\n */\n max?: number | string\n }\n\n type MatchPattern = string | RegExp | (string | RegExp)[]\n ```\n\n- **Detalhes**\n\n Quando envolvido em torno dum componente dinâmico, `<KeepAlive>` armazena para consulta imediata as instâncias de componente inativo sem destruí-las.\n\n Só pode existir uma instância de componente como filho direto de `<KeepAlive>` em qualquer momento.\n\n Quando um componente é alternado dentro de `<KeepAlive>`, seus gatilhos de ciclo de vida `activated` e `deactivated` são invocados de acordo, fornecendo uma alternativa ao `mounted` e `unmounted`, que não são chamados. Isto aplica-se ao filho direto de `<KeepAlive>` e também a todos os seus descendentes.\n\n- **Exemplo**\n\n Uso básico:\n\n ```html\n <KeepAlive>\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n Quando usado com os ramos `v-if` / `v-else`, só deve existir um componente desenhado de cada vez:\n\n ```html\n <KeepAlive>\n <comp-a v-if=\"a > 1\"></comp-a>\n <comp-b v-else></comp-b>\n </KeepAlive>\n ```\n\n Usado em conjunto com `<Transition>`:\n\n ```html\n <Transition>\n <KeepAlive>\n <component :is=\"view\"></component>\n </KeepAlive>\n </Transition>\n ```\n\n Usando `include` / `exclude`:\n\n ```html\n <!-- sequência de caracteres delimitada por vírgula -->\n <KeepAlive include=\"a,b\">\n <component :is=\"view\"></component>\n </KeepAlive>\n\n <!-- regex (use `v-bind`) -->\n <KeepAlive :include=\"/a|b/\">\n <component :is=\"view\"></component>\n </KeepAlive>\n\n <!-- vetor (use `v-bind`) -->\n <KeepAlive :include=\"['a', 'b']\">\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n Uso com `max`:\n\n ```html\n <KeepAlive :max=\"10\">\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n- **
|
|
100
|
+
"value": "\nArmazena para consulta imediata os componentes alternados dinamicamente envolvidos dentro.\n\n- **Propriedades**\n\n ```ts\n interface KeepAliveProps {\n /**\n * Se especificado, apenas componentes com nomes correspondidos\n * pelo `include` estarão na memória de consulta imediata.\n */\n include?: MatchPattern\n /**\n * Qualquer componente com um nome correspondidos pelo `exclude`\n * não estarão na memória de consulta imediata.\n */\n exclude?: MatchPattern\n /**\n * O número máximo de instâncias de componente à armazenar\n * na memória de consulta imediata.\n */\n max?: number | string\n }\n\n type MatchPattern = string | RegExp | (string | RegExp)[]\n ```\n\n- **Detalhes**\n\n Quando envolvido em torno dum componente dinâmico, `<KeepAlive>` armazena para consulta imediata as instâncias de componente inativo sem destruí-las.\n\n Só pode existir uma instância de componente como filho direto de `<KeepAlive>` em qualquer momento.\n\n Quando um componente é alternado dentro de `<KeepAlive>`, seus gatilhos de ciclo de vida `activated` e `deactivated` são invocados de acordo, fornecendo uma alternativa ao `mounted` e `unmounted`, que não são chamados. Isto aplica-se ao filho direto de `<KeepAlive>` e também a todos os seus descendentes.\n\n- **Exemplo**\n\n Uso básico:\n\n ```html\n <KeepAlive>\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n Quando usado com os ramos `v-if` / `v-else`, só deve existir um componente desenhado de cada vez:\n\n ```html\n <KeepAlive>\n <comp-a v-if=\"a > 1\"></comp-a>\n <comp-b v-else></comp-b>\n </KeepAlive>\n ```\n\n Usado em conjunto com `<Transition>`:\n\n ```html\n <Transition>\n <KeepAlive>\n <component :is=\"view\"></component>\n </KeepAlive>\n </Transition>\n ```\n\n Usando `include` / `exclude`:\n\n ```html\n <!-- sequência de caracteres delimitada por vírgula -->\n <KeepAlive include=\"a,b\">\n <component :is=\"view\"></component>\n </KeepAlive>\n\n <!-- regex (use `v-bind`) -->\n <KeepAlive :include=\"/a|b/\">\n <component :is=\"view\"></component>\n </KeepAlive>\n\n <!-- vetor (use `v-bind`) -->\n <KeepAlive :include=\"['a', 'b']\">\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n Uso com `max`:\n\n ```html\n <KeepAlive :max=\"10\">\n <component :is=\"view\"></component>\n </KeepAlive>\n ```\n\n- **Consultar também:** [Guia - `KeepAlive`](https://pt.vuejs.org/guide/built-ins/keep-alive.html)\n"
|
|
101
101
|
},
|
|
102
102
|
"attributes": [],
|
|
103
103
|
"references": [
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
"name": "Teleport",
|
|
144
144
|
"description": {
|
|
145
145
|
"kind": "markdown",
|
|
146
|
-
"value": "\nDesenha o conteúdo da sua ranhura numa outra parte do DOM.\n\n- **Propriedades**\n\n ```ts\n interface TeleportProps {\n /**\n * Obrigatório. Específica o contentor alvo.\n * Pode ser ou um seletor ou um elemento verdadeiro.\n */\n to: string | HTMLElement\n /**\n * Quando `true`, o conteúdo continuará na sua localização\n * original ao invés de ser movido para o contentor alvo.\n * Pode ser mudado dinamicamente.\n */\n disabled?: boolean\n }\n ```\n\n- **Exemplo**\n\n Especificando o contentor alvo:\n\n ```html\n <teleport to=\"#some-id\" />\n <teleport to=\".some-class\" />\n <teleport to=\"[data-teleport]\" />\n ```\n\n Desativar condicionalmente:\n\n ```html\n <teleport to=\"#popup\" :disabled=\"displayVideoInline\">\n <video src=\"./my-movie.mp4\">\n </teleport>\n ```\n\n- **
|
|
146
|
+
"value": "\nDesenha o conteúdo da sua ranhura numa outra parte do DOM.\n\n- **Propriedades**\n\n ```ts\n interface TeleportProps {\n /**\n * Obrigatório. Específica o contentor alvo.\n * Pode ser ou um seletor ou um elemento verdadeiro.\n */\n to: string | HTMLElement\n /**\n * Quando `true`, o conteúdo continuará na sua localização\n * original ao invés de ser movido para o contentor alvo.\n * Pode ser mudado dinamicamente.\n */\n disabled?: boolean\n }\n ```\n\n- **Exemplo**\n\n Especificando o contentor alvo:\n\n ```html\n <teleport to=\"#some-id\" />\n <teleport to=\".some-class\" />\n <teleport to=\"[data-teleport]\" />\n ```\n\n Desativar condicionalmente:\n\n ```html\n <teleport to=\"#popup\" :disabled=\"displayVideoInline\">\n <video src=\"./my-movie.mp4\">\n </teleport>\n ```\n\n- **Consultar também:** [Guia - `Teleport`](https://pt.vuejs.org/guide/built-ins/teleport.html)\n"
|
|
147
147
|
},
|
|
148
148
|
"attributes": [],
|
|
149
149
|
"references": [
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"name": "Suspense",
|
|
190
190
|
"description": {
|
|
191
191
|
"kind": "markdown",
|
|
192
|
-
"value": "\nUsado para orquestrar dependências assíncronas encaixadas numa árvore de componente.\n\n- **Propriedades**\n\n ```ts\n interface SuspenseProps {\n timeout?: string | number\n }\n ```\n\n- **Eventos**\n\n - `@resolve`\n - `@pending`\n - `@fallback`\n\n- **Detalhes**\n\n `<Suspense>` aceita duas ranhuras: a ranhura `#default` e a ranhura `#fallback`. Ele exibirá o conteúdo da ranhura de retorno (`#fallback`) enquanto desenha a ranhura padrão (`#default`) na memória.\n\n Se encontrar dependências assíncronas ([Componentes Assíncronos](https://pt.vuejs.org/guide/components/async.html) e componentes com [`async setup()`](https://pt.vuejs.org/guide/built-ins/suspense.html#async-setup)) enquanto desenha a ranhura padrão, aguardará até todos serem resolvidos antes de exibir a ranhura padrão.\n\n- **
|
|
192
|
+
"value": "\nUsado para orquestrar dependências assíncronas encaixadas numa árvore de componente.\n\n- **Propriedades**\n\n ```ts\n interface SuspenseProps {\n timeout?: string | number\n }\n ```\n\n- **Eventos**\n\n - `@resolve`\n - `@pending`\n - `@fallback`\n\n- **Detalhes**\n\n `<Suspense>` aceita duas ranhuras: a ranhura `#default` e a ranhura `#fallback`. Ele exibirá o conteúdo da ranhura de retorno (`#fallback`) enquanto desenha a ranhura padrão (`#default`) na memória.\n\n Se encontrar dependências assíncronas ([Componentes Assíncronos](https://pt.vuejs.org/guide/components/async.html) e componentes com [`async setup()`](https://pt.vuejs.org/guide/built-ins/suspense.html#async-setup)) enquanto desenha a ranhura padrão, aguardará até todos serem resolvidos antes de exibir a ranhura padrão.\n\n- **Consultar também:** [Guia - `Suspense`](https://pt.vuejs.org/guide/built-ins/suspense.html)\n"
|
|
193
193
|
},
|
|
194
194
|
"attributes": [],
|
|
195
195
|
"references": [
|
|
@@ -375,7 +375,7 @@
|
|
|
375
375
|
"name": "v-text",
|
|
376
376
|
"description": {
|
|
377
377
|
"kind": "markdown",
|
|
378
|
-
"value": "\nAtualiza o conteúdo de texto do elemento.\n\n- **Espera:** `string`\n\n- **Detalhes**\n\n `v-text` funciona definindo a propriedade [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) do elemento, sobrescreverá qualquer conteúdo existente dentro do elemento. Se precisarmos de atualizar a parte da `textContent`, devemos usar as [interpolações de bigodes](https://pt.vuejs.org/guide/essentials/template-syntax.html#text-interpolation).\n\n- **Exemplo**\n\n ```html\n <span v-text=\"msg\"></span>\n <!-- é o mesmo que -->\n <span>{{msg}}</span>\n ```\n\n- **
|
|
378
|
+
"value": "\nAtualiza o conteúdo de texto do elemento.\n\n- **Espera:** `string`\n\n- **Detalhes**\n\n `v-text` funciona definindo a propriedade [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) do elemento, sobrescreverá qualquer conteúdo existente dentro do elemento. Se precisarmos de atualizar a parte da `textContent`, devemos usar as [interpolações de bigodes](https://pt.vuejs.org/guide/essentials/template-syntax.html#text-interpolation).\n\n- **Exemplo**\n\n ```html\n <span v-text=\"msg\"></span>\n <!-- é o mesmo que -->\n <span>{{msg}}</span>\n ```\n\n- **Consultar também** [Sintaxe do Modelo de Marcação - Interpolação de Texto](https://pt.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n"
|
|
379
379
|
},
|
|
380
380
|
"references": [
|
|
381
381
|
{
|
|
@@ -420,7 +420,7 @@
|
|
|
420
420
|
"name": "v-html",
|
|
421
421
|
"description": {
|
|
422
422
|
"kind": "markdown",
|
|
423
|
-
"value": "\nAtualiza a [`innerHTML`](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML) do elemento.\n\n- **Espera:** `string`\n\n- **Detalhes:**\n\n Os conteúdos da `v-html` são inseridos como HTML simples - a sintaxe de modelo de marcação da Vue não será processada. Se estivermos a tentar compor modelos de marcação usando `v-html`, vamos tentar repensar a solução usando componentes.\n\n :::warning
|
|
423
|
+
"value": "\nAtualiza a [`innerHTML`](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML) do elemento.\n\n- **Espera:** `string`\n\n- **Detalhes:**\n\n Os conteúdos da `v-html` são inseridos como HTML simples - a sintaxe de modelo de marcação da Vue não será processada. Se estivermos a tentar compor modelos de marcação usando `v-html`, vamos tentar repensar a solução usando componentes.\n\n :::warning NOTA DE SEGURANÇA\n Interpretar dinamicamente HTML arbitrário na nossa aplicação pode ser muito perigoso porque pode facilmente conduzir a [ataques de XSS](https://en.wikipedia.org/wiki/Cross-site_scripting). Só deveríamos usar `v-html` sobre conteúdo confiável e **nunca** sobre conteúdo fornecido pelo utilizador.\n :::\n\n Nos [Componentes de Ficheiro Único](https://pt.vuejs.org/guide/scaling-up/sfc.html), os estilos `scoped` não serão aplicados ao conteúdo dentro de `v-html`, porque este HTML não é processado pelo compilador de modelos de marcação da Vue. Se quisermos mirar o conteúdo de `v-html` com CSS isolada, podemos usar os [módulos de CSS](./sfc-css-features#css-modules) ou elemento `<style>` adicional e global com uma estratégia de isolamento manual, como a BEM.\n\n- **Exemplo**\n\n ```html\n <div v-html=\"html\"></div>\n ```\n\n- **Consultar também** [Sintaxe do Modelo de Marcação - HTML Puro](https://pt.vuejs.org/guide/essentials/template-syntax.html#raw-html)\n"
|
|
424
424
|
},
|
|
425
425
|
"references": [
|
|
426
426
|
{
|
|
@@ -465,7 +465,7 @@
|
|
|
465
465
|
"name": "v-show",
|
|
466
466
|
"description": {
|
|
467
467
|
"kind": "markdown",
|
|
468
|
-
"value": "\nAlterna a visibilidade do elemento baseado na veracidade do valor da expressão.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n `v-show` funciona definindo a propriedade de CSS `display` através de estilos em linha, e tentará respeitar o valor inicial da `display` quando o elemento estiver visível. Também aciona transições quando sua condição muda.\n\n- **
|
|
468
|
+
"value": "\nAlterna a visibilidade do elemento baseado na veracidade do valor da expressão.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n `v-show` funciona definindo a propriedade de CSS `display` através de estilos em linha, e tentará respeitar o valor inicial da `display` quando o elemento estiver visível. Também aciona transições quando sua condição muda.\n\n- **Consultar também** [Interpretação Condicional - `v-show`](https://pt.vuejs.org/guide/essentials/conditional.html#v-show)\n"
|
|
469
469
|
},
|
|
470
470
|
"references": [
|
|
471
471
|
{
|
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
"name": "v-if",
|
|
511
511
|
"description": {
|
|
512
512
|
"kind": "markdown",
|
|
513
|
-
"value": "\nInterpreta condicionalmente um elemento ou um fragmento de modelo de marcação baseado na veracidade do valor da expressão.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n Quando um elemento de `v-if` é alternado, o elemento e suas diretivas ou componentes contidos são destruídos e construídos novamente. Se a condição inicial for falsa, então o conteúdo interno não será interpretado de todo.\n\n Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n Esta diretiva aciona transições quando sua condição muda.\n\n Quando usada em conjunto, a `v-if` tem uma prioridade superior à `v-for`. Não recomendados usar estas duas diretivas ao mesmo tempo sobre um elemento — consulte o [guia de interpretação de lista](https://pt.vuejs.org/guide/essentials/list.html#v-for-with-v-if) por mais detalhes.\n\n- **
|
|
513
|
+
"value": "\nInterpreta condicionalmente um elemento ou um fragmento de modelo de marcação baseado na veracidade do valor da expressão.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n Quando um elemento de `v-if` é alternado, o elemento e suas diretivas ou componentes contidos são destruídos e construídos novamente. Se a condição inicial for falsa, então o conteúdo interno não será interpretado de todo.\n\n Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n Esta diretiva aciona transições quando sua condição muda.\n\n Quando usada em conjunto, a `v-if` tem uma prioridade superior à `v-for`. Não recomendados usar estas duas diretivas ao mesmo tempo sobre um elemento — consulte o [guia de interpretação de lista](https://pt.vuejs.org/guide/essentials/list.html#v-for-with-v-if) por mais detalhes.\n\n- **Consultar também** [Interpretação Condicional - `v-if`](https://pt.vuejs.org/guide/essentials/conditional.html#v-if)\n"
|
|
514
514
|
},
|
|
515
515
|
"references": [
|
|
516
516
|
{
|
|
@@ -556,7 +556,7 @@
|
|
|
556
556
|
"valueSet": "v",
|
|
557
557
|
"description": {
|
|
558
558
|
"kind": "markdown",
|
|
559
|
-
"value": "\nDenota um \"bloco `else`\" para a `v-if` ou para uma cadeia `v-if` / `v-else-if`.\n\n- **Não espera expressões**\n\n- **Detalhes**\n\n - Restrição: o anterior elemento irmão deve ter a `v-if` ou `v-else-if`.\n\n - Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n- **Exemplo**\n\n ```html\n <div v-if=\"Math.random() > 0.5\">\n Now you see me\n </div>\n <div v-else>\n Now you don't\n </div>\n ```\n\n- **
|
|
559
|
+
"value": "\nDenota um \"bloco `else`\" para a `v-if` ou para uma cadeia `v-if` / `v-else-if`.\n\n- **Não espera expressões**\n\n- **Detalhes**\n\n - Restrição: o anterior elemento irmão deve ter a `v-if` ou `v-else-if`.\n\n - Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n- **Exemplo**\n\n ```html\n <div v-if=\"Math.random() > 0.5\">\n Now you see me\n </div>\n <div v-else>\n Now you don't\n </div>\n ```\n\n- **Consultar também** [Interpretação Condicional - `v-else`](https://pt.vuejs.org/guide/essentials/conditional.html#v-else)\n"
|
|
560
560
|
},
|
|
561
561
|
"references": [
|
|
562
562
|
{
|
|
@@ -601,7 +601,7 @@
|
|
|
601
601
|
"name": "v-else-if",
|
|
602
602
|
"description": {
|
|
603
603
|
"kind": "markdown",
|
|
604
|
-
"value": "\nDenota o \"bloco `else if`\" para a `v-if`. Pode ser encadeada.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n - Restrição: o anterior elemento irmão deve ter a `v-if` ou `v-else-if`.\n\n - Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n- **Exemplo**\n\n ```html\n <div v-if=\"type === 'A'\">\n A\n </div>\n <div v-else-if=\"type === 'B'\">\n B\n </div>\n <div v-else-if=\"type === 'C'\">\n C\n </div>\n <div v-else>\n Not A/B/C\n </div>\n ```\n\n- **
|
|
604
|
+
"value": "\nDenota o \"bloco `else if`\" para a `v-if`. Pode ser encadeada.\n\n- **Espera:** `any`\n\n- **Detalhes**\n\n - Restrição: o anterior elemento irmão deve ter a `v-if` ou `v-else-if`.\n\n - Pode ser usada no `<template>` para denotar um bloco condicional contendo apenas texto ou vários elementos.\n\n- **Exemplo**\n\n ```html\n <div v-if=\"type === 'A'\">\n A\n </div>\n <div v-else-if=\"type === 'B'\">\n B\n </div>\n <div v-else-if=\"type === 'C'\">\n C\n </div>\n <div v-else>\n Not A/B/C\n </div>\n ```\n\n- **Consultar também** [Interpretação Condicional - `v-else-if`](https://pt.vuejs.org/guide/essentials/conditional.html#v-else-if)\n"
|
|
605
605
|
},
|
|
606
606
|
"references": [
|
|
607
607
|
{
|
|
@@ -646,7 +646,7 @@
|
|
|
646
646
|
"name": "v-for",
|
|
647
647
|
"description": {
|
|
648
648
|
"kind": "markdown",
|
|
649
|
-
"value": "\nInterpreta o elemento ou bloco de modelo de marcação várias vezes baseada na fonte dos dados.\n\n- **Espera:** `Array | Object | number | string | Iterable`\n\n- **Detalhes**\n\n O valor da diretiva deve usar a sintaxe especial `alias in expression` para fornecer um pseudónimo para o elemento atual a ser iterado:\n\n ```html\n <div v-for=\"item in items\">\n {{ item.text }}\n </div>\n ```\n\n Alternativamente, também podemos especificar um pseudónimo para o índice (ou a chave se usada sobre um objeto):\n\n ```html\n <div v-for=\"(item, index) in items\"></div>\n <div v-for=\"(value, key) in object\"></div>\n <div v-for=\"(value, name, index) in object\"></div>\n ```\n\n O comportamento padrão da `v-for` tentará remendar os elementos no lugar sem movê-los. Para forçar a reordenação de elementos, devemos fornecer uma sugestão de ordenação com o atributo especial `key`:\n\n ```html\n <div v-for=\"item in items\" :key=\"item.id\">\n {{ item.text }}\n </div>\n ```\n\n `v-for` também pode trabalhar com valores que implementam o [Protocolo Iterável](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol), incluindo os `Map` e `Set` nativos.\n\n- **
|
|
649
|
+
"value": "\nInterpreta o elemento ou bloco de modelo de marcação várias vezes baseada na fonte dos dados.\n\n- **Espera:** `Array | Object | number | string | Iterable`\n\n- **Detalhes**\n\n O valor da diretiva deve usar a sintaxe especial `alias in expression` para fornecer um pseudónimo para o elemento atual a ser iterado:\n\n ```html\n <div v-for=\"item in items\">\n {{ item.text }}\n </div>\n ```\n\n Alternativamente, também podemos especificar um pseudónimo para o índice (ou a chave se usada sobre um objeto):\n\n ```html\n <div v-for=\"(item, index) in items\"></div>\n <div v-for=\"(value, key) in object\"></div>\n <div v-for=\"(value, name, index) in object\"></div>\n ```\n\n O comportamento padrão da `v-for` tentará remendar os elementos no lugar sem movê-los. Para forçar a reordenação de elementos, devemos fornecer uma sugestão de ordenação com o atributo especial `key`:\n\n ```html\n <div v-for=\"item in items\" :key=\"item.id\">\n {{ item.text }}\n </div>\n ```\n\n `v-for` também pode trabalhar com valores que implementam o [Protocolo Iterável](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol), incluindo os `Map` e `Set` nativos.\n\n- **Consultar também**\n - [Interpretação de Lista](https://pt.vuejs.org/guide/essentials/list.html)\n"
|
|
650
650
|
},
|
|
651
651
|
"references": [
|
|
652
652
|
{
|
|
@@ -691,7 +691,7 @@
|
|
|
691
691
|
"name": "v-on",
|
|
692
692
|
"description": {
|
|
693
693
|
"kind": "markdown",
|
|
694
|
-
"value": "\nAnexa um ouvinte de evento ao elemento.\n\n- **Atalho:** `@`\n\n- **Espera:** `Function | Inline Statement | Object (sem argumento)`\n\n- **Argumento:** `event` (opcional se estivermos usando a sintaxe de Objeto)\n\n- **Modificadores**\n\n - `.stop` - chama `event.stopPropagation()`.\n - `.prevent` - chama `event.preventDefault()`.\n - `.capture` - adiciona ouvinte de evento no modo de captura.\n - `.self` - apenas aciona o manipulador se o evento fosse despachado a partir deste elemento.\n - `.{keyAlias}` - apenas aciona o manipulador sobre certas teclas.\n - `.once` - aciona o manipulador no máximo uma vez.\n - `.left` - apenas aciona o manipulador para os eventos de rato do botão esquerdo.\n - `.right` - apenas aciona o manipulador para os eventos de rato do botão direito.\n - `.middle` - apenas aciona o manipulador para os eventos de rato do botão do meio.\n - `.passive` - anexa um evento de DOM com `{ passive: true }`.\n\n- **Detalhes**\n\n O tipo de evento é denotado pelo argumento. A expressão pode ser um nome de método, uma declaração em linha, ou omitida se existirem modificadores presentes.\n\n Quando usada num elemento normal, apenas ouve os [**eventos de DOM nativos**](https://developer.mozilla.org/en-US/docs/Web/Events). Quando usada num componente de elemento personalizado, ouve os **eventos personalizados** emitidos sobre este componente filho.\n\n Quando ouvimos os eventos de DOM nativos, o método recebe o evento nativo como único argumento. Se usarmos a declaração em linha, a declaração tem acesso à propriedade `$event` especial: `v-on:click=\"handle('ok', $event)\"`.\n\n `v-on` também suporta vínculo a um objeto de pares de evento / ouvinte sem um argumento. Nota que quando usamos a sintaxe de objeto, esta não suporta quaisquer modificadores.\n\n- **Exemplo**\n\n ```html\n <!-- manipulador de método -->\n <button v-on:click=\"doThis\"></button>\n\n <!-- evento dinâmico -->\n <button v-on:[event]=\"doThis\"></button>\n\n <!-- declaração em linha -->\n <button v-on:click=\"doThat('hello', $event)\"></button>\n\n <!-- atalho -->\n <button @click=\"doThis\"></button>\n\n <!-- atalho de evento dinâmico -->\n <button @[event]=\"doThis\"></button>\n\n <!-- parar propagação -->\n <button @click.stop=\"doThis\"></button>\n\n <!-- impedir o padrão -->\n <button @click.prevent=\"doThis\"></button>\n\n <!-- impedir o padrão sem expressão -->\n <form @submit.prevent></form>\n\n <!-- encadear modificadores -->\n <button @click.stop.prevent=\"doThis\"></button>\n\n <!-- modificador de tecla usando pseudónimo de tecla -->\n <input @keyup.enter=\"onEnter\" />\n\n <!-- o evento de clique será acionado no máximo uma vez -->\n <button v-on:click.once=\"doThis\"></button>\n\n <!-- sintaxe de objeto -->\n <button v-on=\"{ mousedown: doThis, mouseup: doThat }\"></button>\n ```\n\n Ouvindo eventos personalizados dum componente filho (o manipulador é chamado quando \"my-event\" é emitido sobre o filho):\n\n ```html\n <MyComponent @my-event=\"handleThis\" />\n\n <!-- declaração em linha -->\n <MyComponent @my-event=\"handleThis(123, $event)\" />\n ```\n\n- **
|
|
694
|
+
"value": "\nAnexa um ouvinte de evento ao elemento.\n\n- **Atalho:** `@`\n\n- **Espera:** `Function | Inline Statement | Object (sem argumento)`\n\n- **Argumento:** `event` (opcional se estivermos usando a sintaxe de Objeto)\n\n- **Modificadores**\n\n - `.stop` - chama `event.stopPropagation()`.\n - `.prevent` - chama `event.preventDefault()`.\n - `.capture` - adiciona ouvinte de evento no modo de captura.\n - `.self` - apenas aciona o manipulador se o evento fosse despachado a partir deste elemento.\n - `.{keyAlias}` - apenas aciona o manipulador sobre certas teclas.\n - `.once` - aciona o manipulador no máximo uma vez.\n - `.left` - apenas aciona o manipulador para os eventos de rato do botão esquerdo.\n - `.right` - apenas aciona o manipulador para os eventos de rato do botão direito.\n - `.middle` - apenas aciona o manipulador para os eventos de rato do botão do meio.\n - `.passive` - anexa um evento de DOM com `{ passive: true }`.\n\n- **Detalhes**\n\n O tipo de evento é denotado pelo argumento. A expressão pode ser um nome de método, uma declaração em linha, ou omitida se existirem modificadores presentes.\n\n Quando usada num elemento normal, apenas ouve os [**eventos de DOM nativos**](https://developer.mozilla.org/en-US/docs/Web/Events). Quando usada num componente de elemento personalizado, ouve os **eventos personalizados** emitidos sobre este componente filho.\n\n Quando ouvimos os eventos de DOM nativos, o método recebe o evento nativo como único argumento. Se usarmos a declaração em linha, a declaração tem acesso à propriedade `$event` especial: `v-on:click=\"handle('ok', $event)\"`.\n\n `v-on` também suporta vínculo a um objeto de pares de evento / ouvinte sem um argumento. Nota que quando usamos a sintaxe de objeto, esta não suporta quaisquer modificadores.\n\n- **Exemplo**\n\n ```html\n <!-- manipulador de método -->\n <button v-on:click=\"doThis\"></button>\n\n <!-- evento dinâmico -->\n <button v-on:[event]=\"doThis\"></button>\n\n <!-- declaração em linha -->\n <button v-on:click=\"doThat('hello', $event)\"></button>\n\n <!-- atalho -->\n <button @click=\"doThis\"></button>\n\n <!-- atalho de evento dinâmico -->\n <button @[event]=\"doThis\"></button>\n\n <!-- parar propagação -->\n <button @click.stop=\"doThis\"></button>\n\n <!-- impedir o padrão -->\n <button @click.prevent=\"doThis\"></button>\n\n <!-- impedir o padrão sem expressão -->\n <form @submit.prevent></form>\n\n <!-- encadear modificadores -->\n <button @click.stop.prevent=\"doThis\"></button>\n\n <!-- modificador de tecla usando pseudónimo de tecla -->\n <input @keyup.enter=\"onEnter\" />\n\n <!-- o evento de clique será acionado no máximo uma vez -->\n <button v-on:click.once=\"doThis\"></button>\n\n <!-- sintaxe de objeto -->\n <button v-on=\"{ mousedown: doThis, mouseup: doThat }\"></button>\n ```\n\n Ouvindo eventos personalizados dum componente filho (o manipulador é chamado quando \"my-event\" é emitido sobre o filho):\n\n ```html\n <MyComponent @my-event=\"handleThis\" />\n\n <!-- declaração em linha -->\n <MyComponent @my-event=\"handleThis(123, $event)\" />\n ```\n\n- **Consultar também**\n - [Manipulação de Eventos](https://pt.vuejs.org/guide/essentials/event-handling.html)\n - [Componentes - Eventos Personalizados](https://pt.vuejs.org/guide/essentials/component-basics.html#listening-to-events)\n"
|
|
695
695
|
},
|
|
696
696
|
"references": [
|
|
697
697
|
{
|
|
@@ -736,7 +736,7 @@
|
|
|
736
736
|
"name": "v-bind",
|
|
737
737
|
"description": {
|
|
738
738
|
"kind": "markdown",
|
|
739
|
-
"value": "\nVincula dinamicamente um ou mais atributos, ou uma propriedade de componente à uma expressão.\n\n- **Atalho
|
|
739
|
+
"value": "\nVincula dinamicamente um ou mais atributos, ou uma propriedade de componente à uma expressão.\n\n- **Atalho:**\n - `:` ou `.` (quando usamos o modificador `.prop`)\n - Omitir o valor (quando o atributo e o valor vinculado tiverem o mesmo nome) <sup class=\"vt-badge\">3.4+</sup>\n\n- **Espera:** `any (com argumento) | Object (sem argumento)`\n\n- **Argumento:** `attrOrProp (opcional)`\n\n- **Modificadores**\n\n - `.camel` - transforma o nome de atributo em caixa espetada em caixa de camelo.\n - `.prop` - força um vínculo a ser definido como uma propriedade do DOM. <sup class=\"vt-badge\">3.2+</sup>\n - `.attr` - força um vínculo a ser definido como um atributo de DOM. <sup class=\"vt-badge\">3.2+</sup>\n\n- **Uso**\n\n Quando usada para vincular o atributo `class` ou `style`, `v-bind` suporta tipos de valores adicionar como Vetor ou Objeto. Consulte a seção do guia ligado abaixo por mais detalhes.\n\n Quando definimos um vínculo num elemento, a Vue por padrão verifica se o elemento tem a chave definida como uma propriedade usando uma verificação do operador `in`. Se a propriedade for definida, a Vue definirá o valor como uma propriedade de DOM ao invés dum atributo. Isto deve funciona na maioria dos casos, mas podemos sobrepor este comportamento ao usar explicitamente os modificadores `.prop` ou `.attr`. Isto é algumas vezes necessário, especialmente quando [trabalhamos com elementos personalizados](https://pt.vuejs.org/guide/extras/web-components.html#passing-dom-properties).\n\n Quando usada para vínculos de propriedade de componente, a propriedade deve ser declarada apropriadamente no componente filho.\n\n Quando usada sem um argumento, pode ser usada para vincular um objeto contendo pares de nome-valor de atributo.\n\n- **Exemplo**\n\n ```html\n <!-- vincular um atributo -->\n <img v-bind:src=\"imageSrc\" />\n\n <!-- nome de atributo dinâmico -->\n <button v-bind:[key]=\"value\"></button>\n\n <!-- atalho -->\n <img :src=\"imageSrc\" />\n\n <!-- atalho de mesmo nome (3.4+), expande a `:src=\"src\"` -->\n <img :src />\n\n <!-- atalho de nome de atributo dinâmico -->\n <button :[key]=\"value\"></button>\n\n <!-- com concatenação de sequência de caracteres em linha -->\n <img :src=\"'/path/to/images/' + fileName\" />\n\n <!-- vínculos de classe -->\n <div :class=\"{ red: isRed }\"></div>\n <div :class=\"[classA, classB]\"></div>\n <div :class=\"[classA, { classB: isB, classC: isC }]\"></div>\n\n <!-- vínculos de estilo -->\n <div :style=\"{ fontSize: size + 'px' }\"></div>\n <div :style=\"[styleObjectA, styleObjectB]\"></div>\n\n <!-- vincular um objeto de atributos -->\n <div v-bind=\"{ id: someProp, 'other-attr': otherProp }\"></div>\n\n <!-- vincular propriedades. -->\n <!-- \"prop\" deve ser declarada no componente filho. -->\n <MyComponent :prop=\"someThing\" />\n\n <!-- passar as propriedades do pai em comum com um componente filho -->\n <MyComponent v-bind=\"$props\" />\n\n <!-- XLink -->\n <svg><a :xlink:special=\"foo\"></a></svg>\n ```\n\n O modificador `.prop` também tem um atalho dedicado `.`:\n\n ```html\n <div :someProperty.prop=\"someObject\"></div>\n\n <!-- equivalente a -->\n <div .someProperty=\"someObject\"></div>\n ```\n\n O modificador `.camel` permite a camelização dum nome de atributo de `v-bind` quando usamos modelos de marcação no DOM, por exemplo o atributo `viewBox` de SVG:\n\n ```html\n <svg :view-box.camel=\"viewBox\"></svg>\n ```\n\n `.camel` não é necessário se estivermos a usar modelos de marcação de sequência de caracteres, pré-compilar o modelo de marcação com uma etapa de construção.\n\n- **Consultar também**\n - [Vínculos de Classe e Estilo](https://pt.vuejs.org/guide/essentials/class-and-style.html)\n - [Componentes - Detalhes da Passagem de Propriedade](https://pt.vuejs.org/guide/components/props.html#prop-passing-details)\n"
|
|
740
740
|
},
|
|
741
741
|
"references": [
|
|
742
742
|
{
|
|
@@ -781,7 +781,7 @@
|
|
|
781
781
|
"name": "v-model",
|
|
782
782
|
"description": {
|
|
783
783
|
"kind": "markdown",
|
|
784
|
-
"value": "\nCria um vínculo bidirecional num elemento de entrada de formulário ou um componente.\n\n- **Espera:** variar baseado no valor do elemento de entradas de formulário ou na saída de componentes\n\n- **Limitado a:**\n\n - `<input>`\n - `<select>`\n - `<textarea>`\n - componentes\n\n- **Modificadores**\n\n - [`.lazy`](https://pt.vuejs.org/guide/essentials/forms.html#lazy) - ouve os eventos de `change` ao invés de `input`\n - [`.number`](https://pt.vuejs.org/guide/essentials/forms.html#number) - converte uma sequência de caracteres de entrada válida em números.\n - [`.trim`](https://pt.vuejs.org/guide/essentials/forms.html#trim) - apara a entrada\n\n- **
|
|
784
|
+
"value": "\nCria um vínculo bidirecional num elemento de entrada de formulário ou um componente.\n\n- **Espera:** variar baseado no valor do elemento de entradas de formulário ou na saída de componentes\n\n- **Limitado a:**\n\n - `<input>`\n - `<select>`\n - `<textarea>`\n - componentes\n\n- **Modificadores**\n\n - [`.lazy`](https://pt.vuejs.org/guide/essentials/forms.html#lazy) - ouve os eventos de `change` ao invés de `input`\n - [`.number`](https://pt.vuejs.org/guide/essentials/forms.html#number) - converte uma sequência de caracteres de entrada válida em números.\n - [`.trim`](https://pt.vuejs.org/guide/essentials/forms.html#trim) - apara a entrada\n\n- **Consultar também**\n\n - [Vínculos de Entrada de Formulário](https://pt.vuejs.org/guide/essentials/forms.html)\n - [Eventos de Componente - Uso com `v-model`](https://pt.vuejs.org/guide/components/v-model.html)\n"
|
|
785
785
|
},
|
|
786
786
|
"references": [
|
|
787
787
|
{
|
|
@@ -826,7 +826,7 @@
|
|
|
826
826
|
"name": "v-slot",
|
|
827
827
|
"description": {
|
|
828
828
|
"kind": "markdown",
|
|
829
|
-
"value": "\nDenota ranhuras nomeadas ou ranhuras isoladas que esperam receber propriedades.\n\n- **Atalho:** `#`\n\n- **Espera:** expressão de JavaScript que é válido numa posição de argumento de função, incluindo suporte para desestruturação. Opcional - apenas necessário se esperamos propriedades serem passadas para a ranhura.\n\n- **Argumento:** nome da ranhura (opcional, predefinido para `default`)\n\n- **Limitado a:**\n\n - `<template>`\n - [componentes](https://pt.vuejs.org/guide/components/slots.html#scoped-slots) (para única ranhura padrão com propriedades)\n\n- **Exemplo**\n\n ```html\n <!-- Ranhuras nomeadas -->\n <BaseLayout>\n <template v-slot:header>\n Header content\n </template>\n\n <template v-slot:default>\n Default slot content\n </template>\n\n <template v-slot:footer>\n Footer content\n </template>\n </BaseLayout>\n\n <!-- Ranhura nomeada que recebe propriedades -->\n <InfiniteScroll>\n <template v-slot:item=\"slotProps\">\n <div class=\"item\">\n {{ slotProps.item.text }}\n </div>\n </template>\n </InfiniteScroll>\n\n <!-- Ranhura padrão que recebe propriedades, com desestruturação -->\n <Mouse v-slot=\"{ x, y }\">\n Mouse position: {{ x }}, {{ y }}\n </Mouse>\n ```\n\n- **
|
|
829
|
+
"value": "\nDenota ranhuras nomeadas ou ranhuras isoladas que esperam receber propriedades.\n\n- **Atalho:** `#`\n\n- **Espera:** expressão de JavaScript que é válido numa posição de argumento de função, incluindo suporte para desestruturação. Opcional - apenas necessário se esperamos propriedades serem passadas para a ranhura.\n\n- **Argumento:** nome da ranhura (opcional, predefinido para `default`)\n\n- **Limitado a:**\n\n - `<template>`\n - [componentes](https://pt.vuejs.org/guide/components/slots.html#scoped-slots) (para única ranhura padrão com propriedades)\n\n- **Exemplo**\n\n ```html\n <!-- Ranhuras nomeadas -->\n <BaseLayout>\n <template v-slot:header>\n Header content\n </template>\n\n <template v-slot:default>\n Default slot content\n </template>\n\n <template v-slot:footer>\n Footer content\n </template>\n </BaseLayout>\n\n <!-- Ranhura nomeada que recebe propriedades -->\n <InfiniteScroll>\n <template v-slot:item=\"slotProps\">\n <div class=\"item\">\n {{ slotProps.item.text }}\n </div>\n </template>\n </InfiniteScroll>\n\n <!-- Ranhura padrão que recebe propriedades, com desestruturação -->\n <Mouse v-slot=\"{ x, y }\">\n Mouse position: {{ x }}, {{ y }}\n </Mouse>\n ```\n\n- **Consultar também**\n - [Componentes - Ranhuras](https://pt.vuejs.org/guide/components/slots.html)\n"
|
|
830
830
|
},
|
|
831
831
|
"references": [
|
|
832
832
|
{
|
|
@@ -916,7 +916,7 @@
|
|
|
916
916
|
"name": "v-once",
|
|
917
917
|
"description": {
|
|
918
918
|
"kind": "markdown",
|
|
919
|
-
"value": "\nDesenha o elemento e o componente apenas uma vez, e ignora as futuras atualizações.\n\n- **Não espera expressão**\n\n- **Detalhes**\n\n Nos redesenhos subsequentes, o elemento ou componente e todos os seus filhos serão tratados como conteúdo estático e ignorados. Isto pode ser usado para otimizar o desempenho da atualização.\n\n ```html\n <!-- elemento único -->\n <span v-once>This will never change: {{msg}}</span>\n <!-- o elemento tem filhos -->\n <div v-once>\n <h1>comment</h1>\n <p>{{msg}}</p>\n </div>\n <!-- componente -->\n <MyComponent v-once :comment=\"msg\"></MyComponent>\n <!-- diretiva `v-for` -->\n <ul>\n <li v-for=\"i in list\" v-once>{{i}}</li>\n </ul>\n ```\n\n Desde a 3.2, também podemos memorizar parte do modelo de marcação com condições de invalidação usando a [`v-memo`](#v-memo).\n\n- **
|
|
919
|
+
"value": "\nDesenha o elemento e o componente apenas uma vez, e ignora as futuras atualizações.\n\n- **Não espera expressão**\n\n- **Detalhes**\n\n Nos redesenhos subsequentes, o elemento ou componente e todos os seus filhos serão tratados como conteúdo estático e ignorados. Isto pode ser usado para otimizar o desempenho da atualização.\n\n ```html\n <!-- elemento único -->\n <span v-once>This will never change: {{msg}}</span>\n <!-- o elemento tem filhos -->\n <div v-once>\n <h1>comment</h1>\n <p>{{msg}}</p>\n </div>\n <!-- componente -->\n <MyComponent v-once :comment=\"msg\"></MyComponent>\n <!-- diretiva `v-for` -->\n <ul>\n <li v-for=\"i in list\" v-once>{{i}}</li>\n </ul>\n ```\n\n Desde a 3.2, também podemos memorizar parte do modelo de marcação com condições de invalidação usando a [`v-memo`](#v-memo).\n\n- **Consultar também**\n - [Sintaxe de Vínculo de Dados - Interpolações](https://pt.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [`v-memo`](#v-memo)\n"
|
|
920
920
|
},
|
|
921
921
|
"references": [
|
|
922
922
|
{
|
|
@@ -961,7 +961,7 @@
|
|
|
961
961
|
"name": "v-memo",
|
|
962
962
|
"description": {
|
|
963
963
|
"kind": "markdown",
|
|
964
|
-
"value": "\n- **Espera:** `any[]`\n\n- **Detalhes**\n\n Memoriza uma sub-árvore do modelo de marcação. Pode ser usada em ambos elementos e componentes. A diretiva espera um vetor de valores de dependência de comprimento fixo à comparar para a memorização. Se todos os valores no vetor fossem os mesmos que os da última interpretação, então as atualizações para a sub-árvore inteira serão ignoradas. Por exemplo:\n\n ```html\n <div v-memo=\"[valueA, valueB]\">\n ...\n </div>\n ```\n\n Quando o componente redesenha-se, se ambos `valueA` e `valueB` continuarem os mesmos, todas as atualizações para este `<div>` e seus filhos serão ignoradas. De fato, mesmo a criação nó virtual do DOM virtual também será ignorada uma vez que a cópia memorizada da sub-árvore pode ser usada novamente.\n\n É importante especificar o vetor de memorização corretamente, de outro modo podemos ignorar atualizações que deveriam de fato ser aplicadas. `v-memo` com um vetor de dependência vazio (`v-memo=\"[]\"`) seria funcionalmente equivalente à `v-once`.\n\n **Uso com `v-for`**\n\n `v-memo` é fornecida exclusivamente para micro otimizações em cenários de desempenho crítico e deveriam ser raramente necessários. O caso de uso mais comum onde isto pode ser útil é quando desenhamos grandes listas `v-for` (onde `length > 1000`):\n\n ```html\n <div v-for=\"item in list\" :key=\"item.id\" v-memo=\"[item.id === selected]\">\n <p>ID: {{ item.id }} - selected: {{ item.id === selected }}</p>\n <p>...more child nodes</p>\n </div>\n ```\n\n Quando o estado `selected` do componente mudar, será criada uma grande quantidade de nós virtuais, embora a maioria dos itens permaneça exatamente igual. O uso de `v-memo` neste contexto está essencialmente a dizer \"apenas atualize este item se tiver passado de não selecionado para selecionado, ou o contrário\". Isto permite que todos os itens não afetados reusarem seus anteriores nós virtuais e ignorar a diferenciação inteiramente. Nota que não precisamos incluir `item.id` no vetor de dependência da `v-memo` neste contexto, uma vez que a Vue atualmente a infere a partir da `:key` do item.\n\n :::warning AVISO\n Quando usamos a `v-memo` com a `v-for`, devemos certificar-nos que são usados no mesmo elemento. **`v-memo` não funciona dentro da `v-for`**.\n :::\n\n `v-memo` também pode ser usada nos componentes para manualmente impedir atualizações indesejadas em certos casos extremos onde a verificação da atualização do componente filho não foi otimizado. Mas novamente, é responsabilidade do programador especificar os vetores de dependência correta para evitar ignorar atualizações necessárias.\n\n- **
|
|
964
|
+
"value": "\n- **Espera:** `any[]`\n\n- **Detalhes**\n\n Memoriza uma sub-árvore do modelo de marcação. Pode ser usada em ambos elementos e componentes. A diretiva espera um vetor de valores de dependência de comprimento fixo à comparar para a memorização. Se todos os valores no vetor fossem os mesmos que os da última interpretação, então as atualizações para a sub-árvore inteira serão ignoradas. Por exemplo:\n\n ```html\n <div v-memo=\"[valueA, valueB]\">\n ...\n </div>\n ```\n\n Quando o componente redesenha-se, se ambos `valueA` e `valueB` continuarem os mesmos, todas as atualizações para este `<div>` e seus filhos serão ignoradas. De fato, mesmo a criação nó virtual do DOM virtual também será ignorada uma vez que a cópia memorizada da sub-árvore pode ser usada novamente.\n\n É importante especificar o vetor de memorização corretamente, de outro modo podemos ignorar atualizações que deveriam de fato ser aplicadas. `v-memo` com um vetor de dependência vazio (`v-memo=\"[]\"`) seria funcionalmente equivalente à `v-once`.\n\n **Uso com `v-for`**\n\n `v-memo` é fornecida exclusivamente para micro otimizações em cenários de desempenho crítico e deveriam ser raramente necessários. O caso de uso mais comum onde isto pode ser útil é quando desenhamos grandes listas `v-for` (onde `length > 1000`):\n\n ```html\n <div v-for=\"item in list\" :key=\"item.id\" v-memo=\"[item.id === selected]\">\n <p>ID: {{ item.id }} - selected: {{ item.id === selected }}</p>\n <p>...more child nodes</p>\n </div>\n ```\n\n Quando o estado `selected` do componente mudar, será criada uma grande quantidade de nós virtuais, embora a maioria dos itens permaneça exatamente igual. O uso de `v-memo` neste contexto está essencialmente a dizer \"apenas atualize este item se tiver passado de não selecionado para selecionado, ou o contrário\". Isto permite que todos os itens não afetados reusarem seus anteriores nós virtuais e ignorar a diferenciação inteiramente. Nota que não precisamos incluir `item.id` no vetor de dependência da `v-memo` neste contexto, uma vez que a Vue atualmente a infere a partir da `:key` do item.\n\n :::warning AVISO\n Quando usamos a `v-memo` com a `v-for`, devemos certificar-nos que são usados no mesmo elemento. **`v-memo` não funciona dentro da `v-for`**.\n :::\n\n `v-memo` também pode ser usada nos componentes para manualmente impedir atualizações indesejadas em certos casos extremos onde a verificação da atualização do componente filho não foi otimizado. Mas novamente, é responsabilidade do programador especificar os vetores de dependência correta para evitar ignorar atualizações necessárias.\n\n- **Consultar também**\n - [`v-once`](#v-once)\n"
|
|
965
965
|
},
|
|
966
966
|
"references": [
|
|
967
967
|
{
|
package/data/template/zh-cn.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "Transition",
|
|
6
6
|
"description": {
|
|
7
7
|
"kind": "markdown",
|
|
8
|
-
"value": "\n为**单个**元素或组件提供动画过渡效果。\n\n- **Props**\n\n ```ts\n interface TransitionProps {\n /**\n * 用于自动生成过渡 CSS class 名。\n * 例如 `name: 'fade'` 将自动扩展为 `.fade-enter`、\n * `.fade-enter-active` 等。\n */\n name?: string\n /**\n * 是否应用 CSS 过渡 class。\n * 默认:true\n */\n css?: boolean\n /**\n * 指定要等待的过渡事件类型\n * 来确定过渡结束的时间。\n * 默认情况下会自动检测\n * 持续时间较长的类型。\n */\n type?: 'transition' | 'animation'\n /**\n * 显式指定过渡的持续时间。\n * 默认情况下是等待过渡效果的根元素的第一个 `transitionend`\n * 或`animationend`事件。\n */\n duration?: number | { enter: number; leave: number }\n /**\n * 控制离开/进入过渡的时序。\n * 默认情况下是同时的。\n */\n mode?: 'in-out' | 'out-in' | 'default'\n /**\n * 是否对初始渲染使用过渡。\n * 默认:false\n */\n appear?: boolean\n\n /**\n * 用于自定义过渡 class 的 prop。\n * 在模板中使用短横线命名,例如:enter-from-class=\"xxx\"\n */\n enterFromClass?: string\n enterActiveClass?: string\n enterToClass?: string\n appearFromClass?: string\n appearActiveClass?: string\n appearToClass?: string\n leaveFromClass?: string\n leaveActiveClass?: string\n leaveToClass?: string\n }\n ```\n\n- **事件**\n\n - `@before-enter`\n - `@before-leave`\n - `@enter`\n - `@leave`\n - `@appear`\n - `@after-enter`\n - `@after-leave`\n - `@after-appear`\n - `@enter-cancelled`\n - `@leave-cancelled` (`v-show` only)\n - `@appear-cancelled`\n\n- **示例**\n\n 简单元素:\n\n ```html\n <Transition>\n <div v-if=\"ok\">toggled content</div>\n </Transition>\n ```\n\n 通过改变 `key` 属性来强制过度执行:\n\n ```html\n <Transition>\n <div :key=\"text\">{{ text }}</div>\n </Transition>\n ```\n\n 动态组件,初始渲染时带有过渡模式 + 动画出现:\n\n ```html\n <Transition name=\"fade\" mode=\"out-in\" appear>\n <component :is=\"view\"></component>\n </Transition>\n ```\n\n 监听过渡事件:\n\n ```html\n <Transition @after-enter=\"onTransitionComplete\">\n <div v-show=\"ok\">toggled content</div>\n </Transition>\n ```\n\n- **参考**
|
|
8
|
+
"value": "\n为**单个**元素或组件提供动画过渡效果。\n\n- **Props**\n\n ```ts\n interface TransitionProps {\n /**\n * 用于自动生成过渡 CSS class 名。\n * 例如 `name: 'fade'` 将自动扩展为 `.fade-enter`、\n * `.fade-enter-active` 等。\n */\n name?: string\n /**\n * 是否应用 CSS 过渡 class。\n * 默认:true\n */\n css?: boolean\n /**\n * 指定要等待的过渡事件类型\n * 来确定过渡结束的时间。\n * 默认情况下会自动检测\n * 持续时间较长的类型。\n */\n type?: 'transition' | 'animation'\n /**\n * 显式指定过渡的持续时间。\n * 默认情况下是等待过渡效果的根元素的第一个 `transitionend`\n * 或`animationend`事件。\n */\n duration?: number | { enter: number; leave: number }\n /**\n * 控制离开/进入过渡的时序。\n * 默认情况下是同时的。\n */\n mode?: 'in-out' | 'out-in' | 'default'\n /**\n * 是否对初始渲染使用过渡。\n * 默认:false\n */\n appear?: boolean\n\n /**\n * 用于自定义过渡 class 的 prop。\n * 在模板中使用短横线命名,例如:enter-from-class=\"xxx\"\n */\n enterFromClass?: string\n enterActiveClass?: string\n enterToClass?: string\n appearFromClass?: string\n appearActiveClass?: string\n appearToClass?: string\n leaveFromClass?: string\n leaveActiveClass?: string\n leaveToClass?: string\n }\n ```\n\n- **事件**\n\n - `@before-enter`\n - `@before-leave`\n - `@enter`\n - `@leave`\n - `@appear`\n - `@after-enter`\n - `@after-leave`\n - `@after-appear`\n - `@enter-cancelled`\n - `@leave-cancelled` (`v-show` only)\n - `@appear-cancelled`\n\n- **示例**\n\n 简单元素:\n\n ```html\n <Transition>\n <div v-if=\"ok\">toggled content</div>\n </Transition>\n ```\n\n 通过改变 `key` 属性来强制过度执行:\n\n ```html\n <Transition>\n <div :key=\"text\">{{ text }}</div>\n </Transition>\n ```\n\n 动态组件,初始渲染时带有过渡模式 + 动画出现:\n\n ```html\n <Transition name=\"fade\" mode=\"out-in\" appear>\n <component :is=\"view\"></component>\n </Transition>\n ```\n\n 监听过渡事件:\n\n ```html\n <Transition @after-enter=\"onTransitionComplete\">\n <div v-show=\"ok\">toggled content</div>\n </Transition>\n ```\n\n- **参考**[指南 - `<Transition>`](https://cn.vuejs.org/guide/built-ins/transition.html)\n"
|
|
9
9
|
},
|
|
10
10
|
"attributes": [],
|
|
11
11
|
"references": [
|
|
@@ -736,7 +736,7 @@
|
|
|
736
736
|
"name": "v-bind",
|
|
737
737
|
"description": {
|
|
738
738
|
"kind": "markdown",
|
|
739
|
-
"value": "\n动态的绑定一个或多个 attribute,也可以是组件的 prop。\n\n-
|
|
739
|
+
"value": "\n动态的绑定一个或多个 attribute,也可以是组件的 prop。\n\n- **缩写:**\n - `:` 或者 `.` (当使用 `.prop` 修饰符)\n - 值可以省略 (当 attribute 和绑定的值同名时) <sup class=\"vt-badge\">3.4+</sup>\n\n- **期望:**`any (带参数) | Object (不带参数)`\n\n- **参数:**`attrOrProp (可选的)`\n\n- **修饰符**\n\n - `.camel` - 将短横线命名的 attribute 转变为驼峰式命名。\n - `.prop` - 强制绑定为 DOM property。<sup class=\"vt-badge\">3.2+</sup>\n - `.attr` - 强制绑定为 DOM attribute。<sup class=\"vt-badge\">3.2+</sup>\n\n- **用途**\n\n 当用于绑定 `class` 或 `style` attribute,`v-bind` 支持额外的值类型如数组或对象。详见下方的指南链接。\n\n 在处理绑定时,Vue 默认会利用 `in` 操作符来检查该元素上是否定义了和绑定的 key 同名的 DOM property。如果存在同名的 property,则 Vue 会将它作为 DOM property 赋值,而不是作为 attribute 设置。这个行为在大多数情况都符合期望的绑定值类型,但是你也可以显式用 `.prop` 和 `.attr` 修饰符来强制绑定方式。有时这是必要的,特别是在和[自定义元素](https://cn.vuejs.org/guide/extras/web-components.html#passing-dom-properties)打交道时。\n\n 当用于组件 props 绑定时,所绑定的 props 必须在子组件中已被正确声明。\n\n 当不带参数使用时,可以用于绑定一个包含了多个 attribute 名称-绑定值对的对象。\n\n- **示例**\n\n ```html\n <!-- 绑定 attribute -->\n <img v-bind:src=\"imageSrc\" />\n\n <!-- 动态 attribute 名 -->\n <button v-bind:[key]=\"value\"></button>\n\n <!-- 缩写 -->\n <img :src=\"imageSrc\" />\n\n <!-- 缩写形式的动态 attribute 名 (3.4+),扩展为 :src=\"src\" -->\n <img :src />\n\n <!-- 动态 attribute 名的缩写 -->\n <button :[key]=\"value\"></button>\n\n <!-- 内联字符串拼接 -->\n <img :src=\"'/path/to/images/' + fileName\" />\n\n <!-- class 绑定 -->\n <div :class=\"{ red: isRed }\"></div>\n <div :class=\"[classA, classB]\"></div>\n <div :class=\"[classA, { classB: isB, classC: isC }]\"></div>\n\n <!-- style 绑定 -->\n <div :style=\"{ fontSize: size + 'px' }\"></div>\n <div :style=\"[styleObjectA, styleObjectB]\"></div>\n\n <!-- 绑定对象形式的 attribute -->\n <div v-bind=\"{ id: someProp, 'other-attr': otherProp }\"></div>\n\n <!-- prop 绑定。“prop” 必须在子组件中已声明。 -->\n <MyComponent :prop=\"someThing\" />\n\n <!-- 传递子父组件共有的 prop -->\n <MyComponent v-bind=\"$props\" />\n\n <!-- XLink -->\n <svg><a :xlink:special=\"foo\"></a></svg>\n ```\n\n `.prop` 修饰符也有专门的缩写,`.`:\n\n ```html\n <div :someProperty.prop=\"someObject\"></div>\n\n <!-- 等同于 -->\n <div .someProperty=\"someObject\"></div>\n ```\n\n 当在 DOM 内模板使用 `.camel` 修饰符,可以驼峰化 `v-bind` attribute 的名称,例如 SVG `viewBox` attribute:\n\n ```html\n <svg :view-box.camel=\"viewBox\"></svg>\n ```\n\n 如果使用字符串模板或使用构建步骤预编译模板,则不需要 `.camel`。\n\n- **参考**\n - [Class 与 Style 绑定](https://cn.vuejs.org/guide/essentials/class-and-style.html)\n - [组件 - Prop 传递细节](https://cn.vuejs.org/guide/components/props.html#prop-passing-details)\n"
|
|
740
740
|
},
|
|
741
741
|
"references": [
|
|
742
742
|
{
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from '@volar/language-service';
|
|
2
|
+
export * from '@vue/language-core';
|
|
3
|
+
export * from './lib/ideFeatures/nameCasing';
|
|
4
|
+
export * from './lib/types';
|
|
5
|
+
import type { ServiceEnvironment, ServicePlugin } from '@volar/language-service';
|
|
6
|
+
import type { VueCompilerOptions } from './lib/types';
|
|
7
|
+
export declare function createVueServicePlugins(ts: typeof import('typescript'), getVueOptions: (env: ServiceEnvironment) => VueCompilerOptions): ServicePlugin[];
|
package/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createVueServicePlugins = void 0;
|
|
18
|
+
__exportStar(require("@volar/language-service"), exports);
|
|
19
|
+
__exportStar(require("@vue/language-core"), exports);
|
|
20
|
+
__exportStar(require("./lib/ideFeatures/nameCasing"), exports);
|
|
21
|
+
__exportStar(require("./lib/types"), exports);
|
|
22
|
+
const volar_service_emmet_1 = require("volar-service-emmet");
|
|
23
|
+
const volar_service_json_1 = require("volar-service-json");
|
|
24
|
+
const volar_service_pug_beautify_1 = require("volar-service-pug-beautify");
|
|
25
|
+
const volar_service_typescript_1 = require("volar-service-typescript");
|
|
26
|
+
const volar_service_typescript_twoslash_queries_1 = require("volar-service-typescript-twoslash-queries");
|
|
27
|
+
const css_1 = require("./lib/plugins/css");
|
|
28
|
+
const vue_autoinsert_dotvalue_1 = require("./lib/plugins/vue-autoinsert-dotvalue");
|
|
29
|
+
const vue_autoinsert_parentheses_1 = require("./lib/plugins/vue-autoinsert-parentheses");
|
|
30
|
+
const vue_autoinsert_space_1 = require("./lib/plugins/vue-autoinsert-space");
|
|
31
|
+
const vue_codelens_references_1 = require("./lib/plugins/vue-codelens-references");
|
|
32
|
+
const vue_directive_comments_1 = require("./lib/plugins/vue-directive-comments");
|
|
33
|
+
const vue_document_drop_1 = require("./lib/plugins/vue-document-drop");
|
|
34
|
+
const vue_extract_file_1 = require("./lib/plugins/vue-extract-file");
|
|
35
|
+
const vue_sfc_1 = require("./lib/plugins/vue-sfc");
|
|
36
|
+
const vue_template_1 = require("./lib/plugins/vue-template");
|
|
37
|
+
const vue_toggle_v_bind_codeaction_1 = require("./lib/plugins/vue-toggle-v-bind-codeaction");
|
|
38
|
+
const vue_twoslash_queries_1 = require("./lib/plugins/vue-twoslash-queries");
|
|
39
|
+
const vue_visualize_hidden_callback_param_1 = require("./lib/plugins/vue-visualize-hidden-callback-param");
|
|
40
|
+
function createVueServicePlugins(ts, getVueOptions) {
|
|
41
|
+
return [
|
|
42
|
+
(0, volar_service_typescript_1.create)(ts),
|
|
43
|
+
(0, volar_service_typescript_twoslash_queries_1.create)(),
|
|
44
|
+
(0, css_1.create)(),
|
|
45
|
+
(0, volar_service_pug_beautify_1.create)(),
|
|
46
|
+
(0, volar_service_json_1.create)(),
|
|
47
|
+
(0, vue_template_1.create)('html', ts, getVueOptions),
|
|
48
|
+
(0, vue_template_1.create)('pug', ts, getVueOptions),
|
|
49
|
+
(0, vue_sfc_1.create)(),
|
|
50
|
+
(0, vue_twoslash_queries_1.create)(ts),
|
|
51
|
+
(0, vue_codelens_references_1.create)(),
|
|
52
|
+
(0, vue_document_drop_1.create)(ts),
|
|
53
|
+
(0, vue_autoinsert_dotvalue_1.create)(ts),
|
|
54
|
+
(0, vue_autoinsert_parentheses_1.create)(ts),
|
|
55
|
+
(0, vue_autoinsert_space_1.create)(),
|
|
56
|
+
(0, vue_visualize_hidden_callback_param_1.create)(),
|
|
57
|
+
(0, vue_directive_comments_1.create)(),
|
|
58
|
+
(0, vue_extract_file_1.create)(ts),
|
|
59
|
+
(0, vue_toggle_v_bind_codeaction_1.create)(ts),
|
|
60
|
+
(0, volar_service_emmet_1.create)(),
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
exports.createVueServicePlugins = createVueServicePlugins;
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ServiceContext } from '@volar/language-service';
|
|
2
|
+
import type * as vscode from 'vscode-languageserver-protocol';
|
|
3
|
+
import { AttrNameCasing, TagNameCasing } from '../types';
|
|
4
|
+
export declare function convertTagName(context: ServiceContext, uri: string, casing: TagNameCasing): Promise<vscode.TextEdit[] | undefined>;
|
|
5
|
+
export declare function convertAttrName(context: ServiceContext, uri: string, casing: AttrNameCasing): Promise<vscode.TextEdit[] | undefined>;
|
|
6
|
+
export declare function getNameCasing(context: ServiceContext, uri: string): Promise<{
|
|
7
|
+
tag: TagNameCasing;
|
|
8
|
+
attr: AttrNameCasing;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function detect(context: ServiceContext, uri: string): Promise<{
|
|
11
|
+
tag: TagNameCasing[];
|
|
12
|
+
attr: AttrNameCasing[];
|
|
13
|
+
}>;
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.detect = exports.getNameCasing = exports.convertAttrName = exports.convertTagName = void 0;
|
|
4
|
+
const vue = require("@vue/language-core");
|
|
4
5
|
const language_core_1 = require("@vue/language-core");
|
|
5
|
-
const
|
|
6
|
+
const namedPipeClient = require("@vue/typescript-plugin/lib/client");
|
|
7
|
+
const computeds_1 = require("computeds");
|
|
6
8
|
const types_1 = require("../types");
|
|
7
|
-
async function convertTagName(
|
|
8
|
-
const
|
|
9
|
-
if (!
|
|
9
|
+
async function convertTagName(context, uri, casing) {
|
|
10
|
+
const sourceFile = context.language.files.get(uri);
|
|
11
|
+
if (!sourceFile)
|
|
10
12
|
return;
|
|
11
|
-
const
|
|
13
|
+
const rootCode = sourceFile?.generated?.code;
|
|
14
|
+
if (!(rootCode instanceof language_core_1.VueGeneratedCode))
|
|
15
|
+
return;
|
|
16
|
+
const desc = rootCode.sfc;
|
|
12
17
|
if (!desc.template)
|
|
13
18
|
return;
|
|
14
|
-
const languageService = context.inject('typescript/languageService');
|
|
15
19
|
const template = desc.template;
|
|
16
|
-
const document = context.documents.
|
|
20
|
+
const document = context.documents.get(sourceFile.id, sourceFile.languageId, sourceFile.snapshot);
|
|
17
21
|
const edits = [];
|
|
18
|
-
const components =
|
|
19
|
-
const tags =
|
|
22
|
+
const components = await namedPipeClient.getComponentNames(rootCode.fileName) ?? [];
|
|
23
|
+
const tags = getTemplateTagsAndAttrs(rootCode);
|
|
20
24
|
for (const [tagName, { offsets }] of tags) {
|
|
21
25
|
const componentName = components.find(component => component === tagName || (0, language_core_1.hyphenateTag)(component) === tagName);
|
|
22
26
|
if (componentName) {
|
|
@@ -36,23 +40,25 @@ async function convertTagName(ts, context, uri, casing, vueCompilerOptions) {
|
|
|
36
40
|
return edits;
|
|
37
41
|
}
|
|
38
42
|
exports.convertTagName = convertTagName;
|
|
39
|
-
async function convertAttrName(
|
|
40
|
-
const
|
|
41
|
-
if (!
|
|
43
|
+
async function convertAttrName(context, uri, casing) {
|
|
44
|
+
const sourceFile = context.language.files.get(uri);
|
|
45
|
+
if (!sourceFile)
|
|
46
|
+
return;
|
|
47
|
+
const rootCode = sourceFile?.generated?.code;
|
|
48
|
+
if (!(rootCode instanceof language_core_1.VueGeneratedCode))
|
|
42
49
|
return;
|
|
43
|
-
const desc =
|
|
50
|
+
const desc = rootCode.sfc;
|
|
44
51
|
if (!desc.template)
|
|
45
52
|
return;
|
|
46
|
-
const languageService = context.inject('typescript/languageService');
|
|
47
53
|
const template = desc.template;
|
|
48
|
-
const document = context.documents.
|
|
54
|
+
const document = context.documents.get(uri, sourceFile.languageId, sourceFile.snapshot);
|
|
49
55
|
const edits = [];
|
|
50
|
-
const components =
|
|
51
|
-
const tags =
|
|
56
|
+
const components = await namedPipeClient.getComponentNames(rootCode.fileName) ?? [];
|
|
57
|
+
const tags = getTemplateTagsAndAttrs(rootCode);
|
|
52
58
|
for (const [tagName, { attrs }] of tags) {
|
|
53
59
|
const componentName = components.find(component => component === tagName || (0, language_core_1.hyphenateTag)(component) === tagName);
|
|
54
60
|
if (componentName) {
|
|
55
|
-
const props =
|
|
61
|
+
const props = await namedPipeClient.getComponentProps(rootCode.fileName, componentName) ?? [];
|
|
56
62
|
for (const [attrName, { offsets }] of attrs) {
|
|
57
63
|
const propName = props.find(prop => prop === attrName || (0, language_core_1.hyphenateAttr)(prop) === attrName);
|
|
58
64
|
if (propName) {
|
|
@@ -74,8 +80,8 @@ async function convertAttrName(ts, context, uri, casing, vueCompilerOptions) {
|
|
|
74
80
|
return edits;
|
|
75
81
|
}
|
|
76
82
|
exports.convertAttrName = convertAttrName;
|
|
77
|
-
async function getNameCasing(
|
|
78
|
-
const detected = detect(
|
|
83
|
+
async function getNameCasing(context, uri) {
|
|
84
|
+
const detected = await detect(context, uri);
|
|
79
85
|
const [attr, tag] = await Promise.all([
|
|
80
86
|
context.env.getConfiguration?.('vue.complete.casing.props', uri),
|
|
81
87
|
context.env.getConfiguration?.('vue.complete.casing.tags', uri),
|
|
@@ -88,21 +94,20 @@ async function getNameCasing(ts, context, uri, vueCompilerOptions) {
|
|
|
88
94
|
};
|
|
89
95
|
}
|
|
90
96
|
exports.getNameCasing = getNameCasing;
|
|
91
|
-
function detect(
|
|
92
|
-
const rootFile = context.
|
|
93
|
-
if (!(rootFile instanceof language_core_1.
|
|
97
|
+
async function detect(context, uri) {
|
|
98
|
+
const rootFile = context.language.files.get(uri)?.generated?.code;
|
|
99
|
+
if (!(rootFile instanceof language_core_1.VueGeneratedCode)) {
|
|
94
100
|
return {
|
|
95
101
|
tag: [],
|
|
96
102
|
attr: [],
|
|
97
103
|
};
|
|
98
104
|
}
|
|
99
|
-
const languageService = context.inject('typescript/languageService');
|
|
100
105
|
return {
|
|
101
|
-
tag: getTagNameCase(rootFile),
|
|
106
|
+
tag: await getTagNameCase(rootFile),
|
|
102
107
|
attr: getAttrNameCase(rootFile),
|
|
103
108
|
};
|
|
104
109
|
function getAttrNameCase(file) {
|
|
105
|
-
const tags =
|
|
110
|
+
const tags = getTemplateTagsAndAttrs(file);
|
|
106
111
|
const result = [];
|
|
107
112
|
for (const [_, { attrs }] of tags) {
|
|
108
113
|
for (const [tagName] of attrs) {
|
|
@@ -122,9 +127,9 @@ function detect(ts, context, uri, vueCompilerOptions) {
|
|
|
122
127
|
}
|
|
123
128
|
return result;
|
|
124
129
|
}
|
|
125
|
-
function getTagNameCase(file) {
|
|
126
|
-
const components =
|
|
127
|
-
const tagNames =
|
|
130
|
+
async function getTagNameCase(file) {
|
|
131
|
+
const components = await namedPipeClient.getComponentNames(file.fileName) ?? [];
|
|
132
|
+
const tagNames = getTemplateTagsAndAttrs(file);
|
|
128
133
|
const result = [];
|
|
129
134
|
let anyComponentUsed = false;
|
|
130
135
|
for (const component of components) {
|
|
@@ -155,4 +160,52 @@ function detect(ts, context, uri, vueCompilerOptions) {
|
|
|
155
160
|
}
|
|
156
161
|
}
|
|
157
162
|
exports.detect = detect;
|
|
163
|
+
const map = new WeakMap();
|
|
164
|
+
function getTemplateTagsAndAttrs(sourceFile) {
|
|
165
|
+
if (!map.has(sourceFile)) {
|
|
166
|
+
const getter = (0, computeds_1.computed)(() => {
|
|
167
|
+
if (!(sourceFile instanceof vue.VueGeneratedCode))
|
|
168
|
+
return;
|
|
169
|
+
const ast = sourceFile.sfc.template?.ast;
|
|
170
|
+
const tags = new Map();
|
|
171
|
+
if (ast) {
|
|
172
|
+
for (const node of vue.eachElementNode(ast)) {
|
|
173
|
+
if (!tags.has(node.tag)) {
|
|
174
|
+
tags.set(node.tag, { offsets: [], attrs: new Map() });
|
|
175
|
+
}
|
|
176
|
+
const tag = tags.get(node.tag);
|
|
177
|
+
const startTagHtmlOffset = node.loc.start.offset + node.loc.source.indexOf(node.tag);
|
|
178
|
+
const endTagHtmlOffset = node.loc.start.offset + node.loc.source.lastIndexOf(node.tag);
|
|
179
|
+
tag.offsets.push(startTagHtmlOffset);
|
|
180
|
+
if (!node.isSelfClosing) {
|
|
181
|
+
tag.offsets.push(endTagHtmlOffset);
|
|
182
|
+
}
|
|
183
|
+
for (const prop of node.props) {
|
|
184
|
+
let name;
|
|
185
|
+
let offset;
|
|
186
|
+
if (prop.type === 7
|
|
187
|
+
&& prop.arg?.type === 4
|
|
188
|
+
&& prop.arg.isStatic) {
|
|
189
|
+
name = prop.arg.content;
|
|
190
|
+
offset = prop.arg.loc.start.offset;
|
|
191
|
+
}
|
|
192
|
+
else if (prop.type === 6) {
|
|
193
|
+
name = prop.name;
|
|
194
|
+
offset = prop.loc.start.offset;
|
|
195
|
+
}
|
|
196
|
+
if (name !== undefined && offset !== undefined) {
|
|
197
|
+
if (!tag.attrs.has(name)) {
|
|
198
|
+
tag.attrs.set(name, { offsets: [] });
|
|
199
|
+
}
|
|
200
|
+
tag.attrs.get(name).offsets.push(offset);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return tags;
|
|
206
|
+
});
|
|
207
|
+
map.set(sourceFile, getter);
|
|
208
|
+
}
|
|
209
|
+
return map.get(sourceFile)() ?? new Map();
|
|
210
|
+
}
|
|
158
211
|
//# sourceMappingURL=nameCasing.js.map
|