From 042a0be1fad53cc39e8f868b1fce11b98fe23474 Mon Sep 17 00:00:00 2001 From: Yukon123 <82578034+Yukon123@users.noreply.github.com> Date: Tue, 24 Aug 2021 21:02:55 +0800 Subject: [PATCH 001/103] Change `property` to `attribute` (#1198) --- src/guide/migration/v-bind.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/guide/migration/v-bind.md b/src/guide/migration/v-bind.md index c5acdb82aa..902e2ce4cb 100644 --- a/src/guide/migration/v-bind.md +++ b/src/guide/migration/v-bind.md @@ -12,11 +12,11 @@ badges: ## Introduction -When dynamically binding attributes on an element, a common scenario involves using both the `v-bind="object"` syntax as well as individual properties in the same element. However, this raises questions as far as the priority of merging. +When dynamically binding attributes on an element, a common scenario involves using both the `v-bind="object"` syntax as well as individual attributes in the same element. However, this raises questions as far as the priority of merging. ## 2.x Syntax -In 2.x, if an element has both `v-bind="object"` and an identical individual property defined, the individual property would always overwrite bindings in the `object`. +In 2.x, if an element has both `v-bind="object"` and an identical individual attribute defined, the individual attribute would always overwrite bindings in the `object`. ```html @@ -27,7 +27,7 @@ In 2.x, if an element has both `v-bind="object"` and an identical individual pro ## 3.x Syntax -In 3x, if an element has both `v-bind="object"` and an identical individual property defined, the order of how the bindings are declared determines how they are merged. In other words, rather than assuming developers want the individual property to always override what is defined in the `object`, developers now have more control over the desired merging behavior. +In 3x, if an element has both `v-bind="object"` and an identical individual attribute defined, the order of how the bindings are declared determines how they are merged. In other words, rather than assuming developers want the individual attribute to always override what is defined in the `object`, developers now have more control over the desired merging behavior. ```html @@ -43,6 +43,6 @@ In 3x, if an element has both `v-bind="object"` and an identical individual prop ## Migration Strategy -If you are relying on this override functionality for `v-bind`, we currently recommend ensuring that your `v-bind` attribute is defined before individual properties. +If you are relying on this override functionality for `v-bind`, we currently recommend ensuring that your `v-bind` attribute is defined before individual attributes. [Migration build flag: `COMPILER_V_BIND_OBJECT_ORDER`](migration-build.html#compat-configuration) From 9ed94d87a3996fc0126af546af9cf6504d090a7f Mon Sep 17 00:00:00 2001 From: Yukon123 <82578034+Yukon123@users.noreply.github.com> Date: Tue, 24 Aug 2021 21:04:12 +0800 Subject: [PATCH 002/103] Change `is` prop to `is` attr (#1197) * Change `is` prop to `is` attr * change attr to attribute --- src/guide/migration/custom-elements-interop.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/guide/migration/custom-elements-interop.md b/src/guide/migration/custom-elements-interop.md index 3d2a9cd09b..766aa3ebff 100644 --- a/src/guide/migration/custom-elements-interop.md +++ b/src/guide/migration/custom-elements-interop.md @@ -8,7 +8,7 @@ badges: ## Overview - **BREAKING:** The checks to determine whether tags should be treated as custom elements are now performed during template compilation, and should be configured via compiler options instead of runtime config. -- **BREAKING:** Special `is` prop usage is restricted to the reserved `` tag only. +- **BREAKING:** Special `is` attribute usage is restricted to the reserved `` tag only. - **NEW:** To support 2.x use cases where `is` was used on native elements to work around native HTML parsing restrictions, prefix the value with `vue:` to resolve it as a Vue component. ## Autonomous Custom Elements @@ -69,21 +69,21 @@ The Custom Elements specification provides a way to use custom elements as [Cust ``` -Vue's usage of the `is` special prop was simulating what the native attribute does before it was made universally available in browsers. However, in 2.x it was interpreted as rendering a Vue component with the name `plastic-button`. This blocks the native usage of Customized Built-in Element mentioned above. +Vue's usage of the `is` special attribute was simulating what the native attribute does before it was made universally available in browsers. However, in 2.x it was interpreted as rendering a Vue component with the name `plastic-button`. This blocks the native usage of Customized Built-in Element mentioned above. -In 3.0, we are limiting Vue's special treatment of the `is` prop to the `` tag only. +In 3.0, we are limiting Vue's special treatment of the `is` attribute to the `` tag only. - When used on the reserved `` tag, it will behave exactly the same as in 2.x; -- When used on normal components, it will behave like a normal prop: +- When used on normal components, it will behave like a normal attribute: ```html ``` - 2.x behavior: renders the `bar` component. - - 3.x behavior: renders the `foo` component and passing the `is` prop. + - 3.x behavior: renders the `foo` component and passing the `is` attribute. -- When used on plain elements, it will be passed to the `createElement` call as the `is` prop, and also rendered as a native attribute. This supports the usage of customized built-in elements. +- When used on plain elements, it will be passed to the `createElement` call as the `is` attribute, and also rendered as a native attribute. This supports the usage of customized built-in elements. ```html @@ -105,7 +105,7 @@ In 3.0, we are limiting Vue's special treatment of the `is` prop to the ` From a3c0c2765fb2e2c98a980c9bde773fe87a9a1bf8 Mon Sep 17 00:00:00 2001 From: GU Yiling Date: Wed, 25 Aug 2021 21:51:55 +0800 Subject: [PATCH 003/103] docs: fix the description for enumerated attributes coercion change (#1208) --- src/guide/migration/attribute-coercion.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/guide/migration/attribute-coercion.md b/src/guide/migration/attribute-coercion.md index 076d4df122..00696cb055 100644 --- a/src/guide/migration/attribute-coercion.md +++ b/src/guide/migration/attribute-coercion.md @@ -85,7 +85,7 @@ The absence of an enumerated attribute and `attr="false"` may produce different | `draggable` | `draggable` → `false` | | `spellcheck` | `spellcheck` → `true` | -To keep the old behavior work, and as we will be coercing `false` to `'false'`, in 3.x Vue developers need to make `v-bind` expression resolve to `false` or `'false'` for `contenteditable` and `spellcheck`. +Since we no longer coerce `null` to `'false'` for “enumerated properties” in 3.x, in the case of `contenteditable` and `spellcheck`, developers will need to change those `v-bind` expressions that used to resolve to `null` to resolve to `false` or `'false'` in order to maintain the same behavior as 2.x. In 2.x, invalid values were coerced to `'true'` for enumerated attributes. This was usually unintended and unlikely to be relied upon on a large scale. In 3.x `true` or `'true'` should be explicitly specified. @@ -107,7 +107,7 @@ In 3.x, `null` or `undefined` should be used to explicitly remove an attribute. 2.x “Enumerated attrs”
i.e. contenteditable, draggable and spellcheck. - undefined, false + undefined undefined, null removed @@ -120,7 +120,7 @@ In 3.x, `null` or `undefined` should be used to explicitly remove an attribute. "true" - null, 'false' + null, false, 'false' false, 'false' "false" From 8c8e59a4d1396f50fa8773ca2f27fe6ace3f13a0 Mon Sep 17 00:00:00 2001 From: Kai <9503447+krienow@users.noreply.github.com> Date: Wed, 25 Aug 2021 21:52:50 +0200 Subject: [PATCH 004/103] fix: missing comma in web-components.md (#1192) --- src/guide/web-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/web-components.md b/src/guide/web-components.md index e75cfd91ce..4f9793ca2f 100644 --- a/src/guide/web-components.md +++ b/src/guide/web-components.md @@ -44,7 +44,7 @@ module.exports = { .rule('vue') .use('vue-loader') .tap(options => ({ - ...options + ...options, compilerOptions: { // treat any tag that starts with ion- as custom elements isCustomElement: tag => tag.startsWith('ion-') From 4d745447a0aefd3f616ae50277b6d87067243c34 Mon Sep 17 00:00:00 2001 From: Christian M <7541795+chriamue@users.noreply.github.com> Date: Wed, 25 Aug 2021 22:08:39 +0200 Subject: [PATCH 005/103] Update web-components.md (#1207) Fixed tipo in MyBar.ce.bar as MyBar.ce.vue. --- src/guide/web-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/web-components.md b/src/guide/web-components.md index 4f9793ca2f..20436165be 100644 --- a/src/guide/web-components.md +++ b/src/guide/web-components.md @@ -200,7 +200,7 @@ It is recommended to export the individual element constructors to give your use ```js import { defineCustomElement } from 'vue' import Foo from './MyFoo.ce.vue' -import Bar from './MyBar.ce.bar' +import Bar from './MyBar.ce.vue' const MyFoo = defineCustomElement(Foo) const MyBar = defineCustomElement(Bar) From 10849bb05dc75e7c59917ca3fdf660790b8fdc9a Mon Sep 17 00:00:00 2001 From: Dan Jutan Date: Sat, 28 Aug 2021 18:46:57 -0400 Subject: [PATCH 006/103] Script Setup Edits for Clarity (#1194) * Second-person consistency * Edit defineProps and defineEmits for clarity * Update src/api/sfc-script-setup.md Co-authored-by: skirtle <65301168+skirtles-code@users.noreply.github.com> Co-authored-by: skirtle <65301168+skirtles-code@users.noreply.github.com> --- src/api/sfc-script-setup.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/api/sfc-script-setup.md b/src/api/sfc-script-setup.md index a775ebf4c9..cfb7b2b3c6 100644 --- a/src/api/sfc-script-setup.md +++ b/src/api/sfc-script-setup.md @@ -89,7 +89,7 @@ Think of `MyComponent` as being referenced as a variable. If you have used JSX, ### Dynamic Components -Since components are referenced as variables instead of registered under string keys, we should use dynamic `:is` binding when using dynamic components inside ` ``` -While this seems like a convenience, it requires a custom syntax that breaks the assumption of expressions inside of curly braces being "just JavaScript," which has both learning and implementation costs. +While this seems like a convenience, it requires a custom syntax that breaks the assumption of expressions inside curly braces being "just JavaScript," which has both learning and implementation costs. ## 3.x Update From cd533bdca82e54d2b64099d66a3769d5765d6a40 Mon Sep 17 00:00:00 2001 From: wxsm Date: Sat, 4 Sep 2021 13:20:25 +0800 Subject: [PATCH 012/103] update emits-option.md (#1223) --- src/guide/migration/emits-option.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/emits-option.md b/src/guide/migration/emits-option.md index 35b40aea09..0258eac038 100644 --- a/src/guide/migration/emits-option.md +++ b/src/guide/migration/emits-option.md @@ -53,7 +53,7 @@ For more information on this, please read the [API documentation for this featur ## Migration Strategy -It is highly recommended that you document all of the events emitted by each of your components using `emits`. +It is highly recommended that you document all the events emitted by each of your components using `emits`. This is especially important because of [the removal of the `.native` modifier](./v-on-native-modifier-removed.md). Any listeners for events that aren't declared with `emits` will now be included in the component's `$attrs`, which by default will be bound to the component's root node. From ce1d957803dd507efca1732f808181196a22d730 Mon Sep 17 00:00:00 2001 From: Natalia Tepluhina Date: Sat, 4 Sep 2021 07:23:28 +0200 Subject: [PATCH 013/103] fix: updated Vetur to Volar Close https://github.com/vuejs/docs/issues/1206 --- src/guide/migration/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/introduction.md b/src/guide/migration/introduction.md index 6090a3e947..b9ca785008 100644 --- a/src/guide/migration/introduction.md +++ b/src/guide/migration/introduction.md @@ -166,7 +166,7 @@ We are working on a new version of the Devtools with a new UI and refactored int ### IDE Support -It is recommended to use [VSCode](https://code.visualstudio.com/) with our official extension [Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur), which provides comprehensive IDE support for Vue 3. +It is recommended to use [VSCode](https://code.visualstudio.com/) with our official extension [Volar](https://github.com/johnsoncodehk/volar), which provides comprehensive IDE support for Vue 3. ### Other Projects From 2716506b675f5d65a28607306b90854cb7dbc4a2 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 7 Sep 2021 16:15:39 -0400 Subject: [PATCH 014/103] compat: add a step on typescript typing alias --- src/guide/migration/migration-build.md | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/guide/migration/migration-build.md b/src/guide/migration/migration-build.md index 262558ebef..8df38f2903 100644 --- a/src/guide/migration/migration-build.md +++ b/src/guide/migration/migration-build.md @@ -155,11 +155,22 @@ The following workflow walks through the steps of migrating an actual Vue 2 app -4. At this point, your application may encounter some compile-time errors / warnings (e.g. use of filters). Fix them first. If all compiler warnings are gone, you can also set the compiler to Vue 3 mode. +4. If you are using TypeScript, you will also need to modify `vue`'s typing to expose the default export (which is no longer present in Vue 3) by adding a `*.d.ts` file with the following: + + ```ts + declare module 'vue' { + import { CompatVue } from '@vue/runtime-dom' + const Vue: CompatVue + export default Vue + export * from '@vue/runtime-dom' + } + ``` + +5. At this point, your application may encounter some compile-time errors / warnings (e.g. use of filters). Fix them first. If all compiler warnings are gone, you can also set the compiler to Vue 3 mode. [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/b05d9555f6e115dea7016d7e5a1a80e8f825be52) -5. After fixing the errors, the app should be able to run if it is not subject to the [limitations](#known-limitations) mentioned above. +6. After fixing the errors, the app should be able to run if it is not subject to the [limitations](#known-limitations) mentioned above. You will likely see a LOT of warnings from both the command line and the browser console. Here are some general tips: @@ -171,29 +182,29 @@ The following workflow walks through the steps of migrating an actual Vue 2 app - If you are using `vue-router`, note `` and `` will not work with `` until you upgrade to `vue-router` v4. -6. Update [`` class names](/guide/migration/transition.html). This is the only feature that does not have a runtime warning. You can do a project-wide search for `.*-enter` and `.*-leave` CSS class names. +7. Update [`` class names](/guide/migration/transition.html). This is the only feature that does not have a runtime warning. You can do a project-wide search for `.*-enter` and `.*-leave` CSS class names. [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/d300103ba622ae26ac26a82cd688e0f70b6c1d8f) -7. Update app entry to use [new global mounting API](/guide/migration/global-api.html#a-new-global-api-createapp). +8. Update app entry to use [new global mounting API](/guide/migration/global-api.html#a-new-global-api-createapp). [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/a6e0c9ac7b1f4131908a4b1e43641f608593f714) -8. [Upgrade `vuex` to v4](https://next.vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html). +9. [Upgrade `vuex` to v4](https://next.vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html). [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/5bfd4c61ee50f358cd5daebaa584f2c3f91e0205) -9. [Upgrade `vue-router` to v4](https://next.router.vuejs.org/guide/migration/index.html). If you also use `vuex-router-sync`, you can replace it with a store getter. +10. [Upgrade `vue-router` to v4](https://next.router.vuejs.org/guide/migration/index.html). If you also use `vuex-router-sync`, you can replace it with a store getter. - After the upgrade, to use `` and `` with `` requires using the new [scoped-slot based syntax](https://next.router.vuejs.org/guide/migration/index.html#router-view-keep-alive-and-transition). + After the upgrade, to use `` and `` with `` requires using the new [scoped-slot based syntax](https://next.router.vuejs.org/guide/migration/index.html#router-view-keep-alive-and-transition). - [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/758961e73ac4089890079d4ce14996741cf9344b) + [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/758961e73ac4089890079d4ce14996741cf9344b) -10. Pick off individual warnings. Note some features have conflicting behavior between Vue 2 and Vue 3 - for example, the render function API, or the functional component vs. async component change. To migrate to Vue 3 API without affecting the rest of the application, you can opt-in to Vue 3 behavior on a per-component basis with the [`compatConfig` option](#per-component-config). +11. Pick off individual warnings. Note some features have conflicting behavior between Vue 2 and Vue 3 - for example, the render function API, or the functional component vs. async component change. To migrate to Vue 3 API without affecting the rest of the application, you can opt-in to Vue 3 behavior on a per-component basis with the [`compatConfig` option](#per-component-config). [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/d0c7d3ae789be71b8fd56ce79cb4cb1f921f893b) -11. When all warnings are fixed, you can remove the migration build and switch to Vue 3 proper. Note you may not be able to do so if you still have dependencies that rely on Vue 2 behavior. +12. When all warnings are fixed, you can remove the migration build and switch to Vue 3 proper. Note you may not be able to do so if you still have dependencies that rely on Vue 2 behavior. [Example commit](https://github.com/vuejs/vue-hackernews-2.0/commit/9beb45490bc5f938c9e87b4ac1357cfb799565bd) From b5c968e6a5f87f4c7f3639be5e8f81ab481d93b5 Mon Sep 17 00:00:00 2001 From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Wed, 8 Sep 2021 06:33:44 +0100 Subject: [PATCH 015/103] fix: create a new SSR router history for each router instance (#1229) --- src/guide/ssr/routing.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/guide/ssr/routing.md b/src/guide/ssr/routing.md index 943bf1389e..05fe4575f9 100644 --- a/src/guide/ssr/routing.md +++ b/src/guide/ssr/routing.md @@ -13,12 +13,15 @@ import MyUser from './components/MyUser.vue' const isServer = typeof window === 'undefined' -const history = isServer ? createMemoryHistory() : createWebHistory() +const createHistory = isServer ? createMemoryHistory : createWebHistory const routes = [{ path: '/user', component: MyUser }] export default function() { - return createRouter({ routes, history }) + return createRouter({ + history: createHistory(), + routes + }) } ``` From b8c599f877d5b0019ea1674c2be30d28cdd97513 Mon Sep 17 00:00:00 2001 From: Anik Das Date: Wed, 8 Sep 2021 11:04:40 +0530 Subject: [PATCH 016/103] fix: firefox mobile view fixed (#1227) added viewport meta tag in vitepress config Signed-off-by: Anik Das --- src/.vuepress/config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.vuepress/config.js b/src/.vuepress/config.js index dc24ac170e..5fbe7c6d69 100644 --- a/src/.vuepress/config.js +++ b/src/.vuepress/config.js @@ -296,6 +296,7 @@ module.exports = { ['link', { rel: 'manifest', href: '/manifest.json' }], ['meta', { name: 'theme-color', content: '#3eaf7c' }], ['meta', { name: 'apple-mobile-web-app-capable', content: 'yes' }], + ['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1.0' }], [ 'meta', { name: 'apple-mobile-web-app-status-bar-style', content: 'black' } From 5f92c59e02e0edfecbb05e9c344ea8c04f470934 Mon Sep 17 00:00:00 2001 From: Yukon123 <82578034+Yukon123@users.noreply.github.com> Date: Sun, 12 Sep 2021 13:24:27 +0800 Subject: [PATCH 017/103] docs: Add types of `key` (#1238) --- src/api/special-attributes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/special-attributes.md b/src/api/special-attributes.md index 5dc0ad7962..961b57a6cd 100644 --- a/src/api/special-attributes.md +++ b/src/api/special-attributes.md @@ -2,7 +2,7 @@ ## key -- **Expects:** `number | string` +- **Expects:** `number | string | symbol ` The `key` special attribute is primarily used as a hint for Vue's virtual DOM algorithm to identify VNodes when diffing the new list of nodes against the old list. Without keys, Vue uses an algorithm that minimizes element movement and tries to patch/reuse elements of the same type in-place as much as possible. With keys, it will reorder elements based on the order change of keys, and elements with keys that are no longer present will always be removed/destroyed. From c180327b56907d9c0b27448c93165d5a28d9fe74 Mon Sep 17 00:00:00 2001 From: wxsm Date: Sun, 12 Sep 2021 13:25:39 +0800 Subject: [PATCH 018/103] update key-attribute.md (#1233) --- src/guide/migration/key-attribute.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/key-attribute.md b/src/guide/migration/key-attribute.md index 34bdf73f58..7042e07150 100644 --- a/src/guide/migration/key-attribute.md +++ b/src/guide/migration/key-attribute.md @@ -3,7 +3,7 @@ badges: - breaking --- -# `key` attribute +# `key` Attribute ## Overview From cde3fc63e5ac2785ee99531014c4ddddff9ef1ed Mon Sep 17 00:00:00 2001 From: wuchouchou Date: Sun, 12 Sep 2021 13:25:45 +0800 Subject: [PATCH 019/103] Update component-props.md (#1231) * Update component-props.md add description of condition about implied casting * Update src/guide/component-props.md Co-authored-by: Natalia Tepluhina Co-authored-by: Natalia Tepluhina --- src/guide/component-props.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guide/component-props.md b/src/guide/component-props.md index e8d2ee60dc..94e9505f82 100644 --- a/src/guide/component-props.md +++ b/src/guide/component-props.md @@ -61,6 +61,7 @@ In the two examples above, we happen to pass string values, but _any_ type of va ```html + From 5c4c07601191b66bc4b8421fcf67836caf471467 Mon Sep 17 00:00:00 2001 From: Alexander Shchukin Date: Sun, 12 Sep 2021 08:26:41 +0300 Subject: [PATCH 020/103] remove redundant (duplicate) code example (#1234) --- src/guide/component-custom-events.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/guide/component-custom-events.md b/src/guide/component-custom-events.md index f1b40e5b7b..68d340d405 100644 --- a/src/guide/component-custom-events.md +++ b/src/guide/component-custom-events.md @@ -89,9 +89,6 @@ app.component('my-component', { }) ``` -```html - -``` ## Multiple `v-model` bindings From 8e29e0f20cd634b9ba6f99f0f24c30c93db93f0d Mon Sep 17 00:00:00 2001 From: Yukon123 <82578034+Yukon123@users.noreply.github.com> Date: Sun, 12 Sep 2021 13:27:01 +0800 Subject: [PATCH 021/103] docs: change `is` prop to `is` attribute (#1236) --- src/guide/migration/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/introduction.md b/src/guide/migration/introduction.md index b9ca785008..b2d5c71151 100644 --- a/src/guide/migration/introduction.md +++ b/src/guide/migration/introduction.md @@ -93,7 +93,7 @@ The following consists a list of breaking changes from 2.x: ### Custom Elements - [Custom element checks are now performed during template compilation](/guide/migration/custom-elements-interop.html) -- [Special `is` prop usage is restricted to the reserved `` tag only](/guide/migration/custom-elements-interop.html#customized-built-in-elements) +- [Special `is` attribute usage is restricted to the reserved `` tag only](/guide/migration/custom-elements-interop.html#customized-built-in-elements) ### Other Minor Changes From de6e1f17b9f1d702bde65db51f7127d44a06c5b8 Mon Sep 17 00:00:00 2001 From: Yukon123 <82578034+Yukon123@users.noreply.github.com> Date: Sun, 12 Sep 2021 13:27:13 +0800 Subject: [PATCH 022/103] docs: Change `tag` prop to `tag` attribute (#1237) --- src/guide/migration/transition-group.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/guide/migration/transition-group.md b/src/guide/migration/transition-group.md index e6ca6ae29c..4137ae4d5f 100644 --- a/src/guide/migration/transition-group.md +++ b/src/guide/migration/transition-group.md @@ -8,11 +8,11 @@ badges: ## Overview -`` no longer renders a root element by default, but can still create one with the `tag` prop. +`` no longer renders a root element by default, but can still create one with the `tag` attribute. ## 2.x Syntax -In Vue 2, ``, like other custom components, needed a root element, which by default was a `` but was customizable via the `tag` prop. +In Vue 2, ``, like other custom components, needed a root element, which by default was a `` but was customizable via the `tag` attribute. ```html @@ -26,7 +26,7 @@ In Vue 2, ``, like other custom components, needed a root elem In Vue 3, we have [fragment support](/guide/migration/fragments.html), so components no longer _need_ a root node. Consequently, `` no longer renders one by default. -- If you already have the `tag` prop defined in your Vue 2 code, like in the example above, everything will work as before +- If you already have the `tag` attribute defined in your Vue 2 code, like in the example above, everything will work as before - If you didn't have one defined _and_ your styling or other behaviors relied on the presence of the `` root element to work properly, simply add `tag="span"` to the ``: ```html From b6b5af88376c50e1fa0986f9f4d5bda43928f961 Mon Sep 17 00:00:00 2001 From: Marvin Rudolph Date: Tue, 14 Sep 2021 19:36:13 +0200 Subject: [PATCH 023/103] chore: fix typo (#1241) --- src/guide/migration/attribute-coercion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/attribute-coercion.md b/src/guide/migration/attribute-coercion.md index 00696cb055..fd2dc94349 100644 --- a/src/guide/migration/attribute-coercion.md +++ b/src/guide/migration/attribute-coercion.md @@ -141,4 +141,4 @@ In 3.x, `null` or `undefined` should be used to explicitly remove an attribute. [Migration build flags:](migration-build.html#compat-configuration) - `ATTR_FALSE_VALUE` -- `ATTR_ENUMERATED_COERSION` +- `ATTR_ENUMERATED_COERCION` From f9e2868c3a3ebb3bff9d3a6dc56cd8b3bf9c39eb Mon Sep 17 00:00:00 2001 From: Sarah Drasner Date: Wed, 15 Sep 2021 09:03:57 -0600 Subject: [PATCH 024/103] put myself into emeritus status (#1242) --- .../components/community/team/emeriti.js | 71 ++++++------ .../components/community/team/members.js | 105 +++++++----------- 2 files changed, 82 insertions(+), 94 deletions(-) diff --git a/src/.vuepress/components/community/team/emeriti.js b/src/.vuepress/components/community/team/emeriti.js index fe7e1fb9f2..d1c343bf56 100644 --- a/src/.vuepress/components/community/team/emeriti.js +++ b/src/.vuepress/components/community/team/emeriti.js @@ -1,6 +1,27 @@ import { shuffle } from 'lodash' export default shuffle([ + { + name: 'Sarah Drasner', + city: 'Denver, CO, USA', + languages: ['en'], + work: { + role: 'Director of Engineering, Core Developer Web', + org: 'Google', + orgUrl: 'https://google.com/', + }, + github: 'sdras', + twitter: 'sarah_edo', + codepen: 'sdras', + reposOfficial: ['vuejs.org'], + reposPersonal: [ + 'vue-vscode-snippets', + 'intro-to-vue', + 'vue-vscode-extensionpack', + 'ecommerce-netlify', + ], + links: ['https://sarah.dev/'], + }, { name: 'Chris Fritz', title: 'Good Word Putter-Togetherer', @@ -9,11 +30,9 @@ export default shuffle([ github: 'chrisvfritz', twitter: 'chrisvfritz', work: { - role: 'Educator & Consultant' + role: 'Educator & Consultant', }, - reposPersonal: [ - 'vue-enterprise-boilerplate' - ] + reposPersonal: ['vue-enterprise-boilerplate'], }, { name: 'Blake Newman', @@ -23,10 +42,10 @@ export default shuffle([ work: { role: 'Software Engineer', org: 'Attest', - orgUrl: 'https://www.askattest.com/' + orgUrl: 'https://www.askattest.com/', }, github: 'blake-newman', - twitter: 'blakenewman' + twitter: 'blakenewman', }, { name: 'kingwl', @@ -36,12 +55,10 @@ export default shuffle([ work: { role: 'Software Development Engineer', org: 'Chaitin', - orgUrl: 'https://chaitin.cn/' + orgUrl: 'https://chaitin.cn/', }, github: 'kingwl', - reposOfficial: [ - 'vue' - ] + reposOfficial: ['vue'], }, { name: 'Alan Song', @@ -51,12 +68,10 @@ export default shuffle([ work: { role: 'Cofounder', org: 'Futurenda', - orgUrl: 'https://www.futurenda.com/' + orgUrl: 'https://www.futurenda.com/', }, github: 'fnlctrl', - reposOfficial: [ - 'vue-router' - ] + reposOfficial: ['vue-router'], }, { name: 'defcc', @@ -66,8 +81,8 @@ export default shuffle([ github: 'defcc', work: { org: 'zbj.com', - orgUrl: 'http://www.zbj.com/' - } + orgUrl: 'http://www.zbj.com/', + }, }, { name: 'gebilaoxiong', @@ -77,8 +92,8 @@ export default shuffle([ github: 'gebilaoxiong', work: { org: 'zbj.com', - orgUrl: 'http://www.zbj.com/' - } + orgUrl: 'http://www.zbj.com/', + }, }, { name: 'Denis Karabaza', @@ -90,8 +105,8 @@ export default shuffle([ work: { role: 'Software Engineer', org: 'Neolant', - orgUrl: 'http://neolant.ru/' - } + orgUrl: 'http://neolant.ru/', + }, }, { name: 'Edd Yerburgh', @@ -101,16 +116,10 @@ export default shuffle([ github: 'eddyerburgh', twitter: 'EddYerburgh', work: { - role: 'Full Stack Developer' + role: 'Full Stack Developer', }, - reposOfficial: [ - 'vue-test-utils' - ], - reposPersonal: [ - 'avoriaz' - ], - links: [ - 'https://www.eddyerburgh.me/' - ] - } + reposOfficial: ['vue-test-utils'], + reposPersonal: ['avoriaz'], + links: ['https://www.eddyerburgh.me/'], + }, ]) diff --git a/src/.vuepress/components/community/team/members.js b/src/.vuepress/components/community/team/members.js index 509c2779fd..d374aa1541 100644 --- a/src/.vuepress/components/community/team/members.js +++ b/src/.vuepress/components/community/team/members.js @@ -10,11 +10,11 @@ const members = [ twitter: 'youyuxi', work: { role: 'Creator', - org: 'Vue.js' + org: 'Vue.js', }, reposOfficial: ['vuejs/*', 'vuejs-templates/*'], - links: ['https://www.patreon.com/evanyou'] - } + links: ['https://www.patreon.com/evanyou'], + }, ].concat( shuffle([ { @@ -25,11 +25,11 @@ const members = [ github: 'posva', twitter: 'posva', work: { - role: 'Freelance Developer & Consultant' + role: 'Freelance Developer & Consultant', }, reposOfficial: ['vuefire', 'vue-router'], reposPersonal: ['vuex-mock-store', 'vue-promised', 'vue-motion'], - links: ['https://www.patreon.com/posva'] + links: ['https://www.patreon.com/posva'], }, { name: 'Sodatea', @@ -37,7 +37,7 @@ const members = [ languages: ['zh', 'en'], github: 'sodatea', twitter: 'haoqunjiang', - reposOfficial: ['vue-cli', 'vue-loader'] + reposOfficial: ['vue-cli', 'vue-loader'], }, { name: 'Pine Wu', @@ -46,9 +46,9 @@ const members = [ github: 'octref', twitter: 'octref', work: { - role: 'Nomad' + role: 'Nomad', }, - reposOfficial: ['vetur'] + reposOfficial: ['vetur'], }, { name: 'Jinjiang', @@ -61,8 +61,8 @@ const members = [ 'vue-a11y-utils', 'vue-mark-display', 'mark2slides', - 'vue-keyboard-over' - ] + 'vue-keyboard-over', + ], }, { name: 'Katashin', @@ -72,12 +72,12 @@ const members = [ work: { role: 'Software Engineer', org: 'ClassDo', - orgUrl: 'https://classdo.com/' + orgUrl: 'https://classdo.com/', }, github: 'ktsn', twitter: 'ktsn', reposOfficial: ['vuex', 'vue-class-component'], - reposPersonal: ['vue-designer'] + reposPersonal: ['vue-designer'], }, { name: 'Kazupon', @@ -89,7 +89,7 @@ const members = [ work: { role: 'Engineer', org: 'PLAID, Inc.', - orgUrl: 'https://plaid.co.jp/' + orgUrl: 'https://plaid.co.jp/', }, reposOfficial: ['vuejs.org', 'jp.vuejs.org'], reposPersonal: [ @@ -98,9 +98,9 @@ const members = [ 'vue-i18n-loader', 'eslint-plugin-vue-i18n', 'vue-i18n-extensions', - 'vue-cli-plugin-p11n' + 'vue-cli-plugin-p11n', ], - links: ['https://www.patreon.com/kazupon'] + links: ['https://www.patreon.com/kazupon'], }, { name: 'Rahul Kadyan', @@ -110,13 +110,13 @@ const members = [ work: { role: 'Software Engineer', org: 'Grammarly', - orgUrl: 'https://grammarly.com/' + orgUrl: 'https://grammarly.com/', }, github: 'znck', twitter: 'znck0', reposOfficial: ['rollup-plugin-vue', 'vue-next'], reposPersonal: ['vue-developer-experience', 'prop-types', 'grammarly'], - links: ['https://znck.me/'] + links: ['https://znck.me/'], }, { name: 'Linusborg', @@ -127,7 +127,7 @@ const members = [ twitter: 'Linus_Borg', reposOfficial: ['vuejs/*'], reposPersonal: ['portal-vue'], - links: ['https://forum.vuejs.org/'] + links: ['https://forum.vuejs.org/'], }, { name: 'Guillaume Chau', @@ -139,37 +139,16 @@ const members = [ work: { role: 'Frontend Developer', org: 'Livestorm', - orgUrl: 'https://livestorm.co/' + orgUrl: 'https://livestorm.co/', }, reposOfficial: ['vue-devtools', 'vue-cli', 'vue-curated'], reposPersonal: [ 'vue-apollo', 'vue-meteor', 'vue-virtual-scroller', - 'v-tooltip' - ], - links: ['http://patreon.com/akryum'] - }, - { - name: 'Sarah Drasner', - city: 'Denver, CO, USA', - languages: ['en'], - work: { - role: 'VP of Developer Experience', - org: 'Netlify', - orgUrl: 'https://url.netlify.com/HJ8X2mxP8' - }, - github: 'sdras', - twitter: 'sarah_edo', - codepen: 'sdras', - reposOfficial: ['vuejs.org'], - reposPersonal: [ - 'vue-vscode-snippets', - 'intro-to-vue', - 'vue-vscode-extensionpack', - 'ecommerce-netlify' + 'v-tooltip', ], - links: ['https://sarah.dev/'] + links: ['http://patreon.com/akryum'], }, { name: 'Damian Dulisz', @@ -179,10 +158,10 @@ const members = [ github: 'shentao', twitter: 'DamianDulisz', work: { - role: 'Consultant' + role: 'Consultant', }, reposOfficial: ['news.vuejs.org'], - reposPersonal: ['shentao/vue-multiselect', 'shentao/vue-global-events'] + reposPersonal: ['shentao/vue-multiselect', 'shentao/vue-global-events'], }, { name: 'Michał Sajnóg', @@ -193,10 +172,10 @@ const members = [ work: { role: 'Senior Frontend Developer / Team Leader', org: 'Netguru', - orgUrl: 'https://netguru.co/' + orgUrl: 'https://netguru.co/', }, reposOfficial: ['eslint-plugin-vue', 'vue-devtools'], - reposPersonal: ['vue-computed-helpers', 'vue-content-placeholders'] + reposPersonal: ['vue-computed-helpers', 'vue-content-placeholders'], }, { name: 'GU Yiling', @@ -205,7 +184,7 @@ const members = [ work: { role: 'Senior web developer', org: 'Baidu, inc.', - orgUrl: 'https://www.baidu.com/' + orgUrl: 'https://www.baidu.com/', }, github: 'Justineo', twitter: '_justineo', @@ -213,8 +192,8 @@ const members = [ reposPersonal: [ 'Justineo/vue-awesome', 'ecomfe/vue-echarts', - 'ecomfe/veui' - ] + 'ecomfe/veui', + ], }, { name: 'ULIVZ', @@ -223,11 +202,11 @@ const members = [ work: { role: 'Senior Frontend Developer', org: 'AntFinancial', - orgUrl: 'https://www.antfin.com/' + orgUrl: 'https://www.antfin.com/', }, github: 'ulivz', twitter: '_ulivz', - reposOfficial: ['vuepress'] + reposOfficial: ['vuepress'], }, { name: 'Phan An', @@ -239,11 +218,11 @@ const members = [ work: { role: 'Engineering Team Lead', org: 'InterNations', - orgUrl: 'https://www.internations.org/' + orgUrl: 'https://www.internations.org/', }, reposOfficial: ['vuejs.org'], reposPersonal: ['vuequery', 'vue-google-signin-button'], - links: ['https://vi.vuejs.org/', 'https://phanan.net/'] + links: ['https://vi.vuejs.org/', 'https://phanan.net/'], }, { name: 'Natalia Tepluhina', @@ -254,10 +233,10 @@ const members = [ work: { role: 'Staff Frontend Engineer', org: 'GitLab', - orgUrl: 'https://gitlab.com/' + orgUrl: 'https://gitlab.com/', }, github: 'NataliaTepluhina', - twitter: 'N_Tepluhina' + twitter: 'N_Tepluhina', }, { name: 'Yosuke Ota', @@ -268,9 +247,9 @@ const members = [ work: { role: 'Lead Web Engineer', org: 'Future Corporation', - orgUrl: 'https://www.future.co.jp/' + orgUrl: 'https://www.future.co.jp/', }, - reposOfficial: ['eslint-plugin-vue'] + reposOfficial: ['eslint-plugin-vue'], }, { name: 'Ben Hong', @@ -278,12 +257,12 @@ const members = [ languages: ['en', 'zh'], work: { role: 'Developer Experience (DX) Engineer', - org: 'Cypress.io' + org: 'Cypress.io', }, reposOfficial: ['vuejs.org', 'vuepress', 'vuejs/events'], github: 'bencodezen', twitter: 'bencodezen', - links: ['https://bencodezen.io/'] + links: ['https://bencodezen.io/'], }, { name: 'Kia King Ishii', @@ -293,12 +272,12 @@ const members = [ work: { role: 'Tech Talent', org: 'Global Brain', - orgUrl: 'https://globalbrains.com/' + orgUrl: 'https://globalbrains.com/', }, github: 'kiaking', twitter: 'KiaKing85', reposOfficial: ['vuex'], - reposPersonal: ['vuex-orm/*'] + reposPersonal: ['vuex-orm/*'], }, { name: 'Anthony Fu', @@ -308,8 +287,8 @@ const members = [ twitter: 'antfu7', reposOfficial: ['composition-api'], reposPersonal: ['vueuse', 'vue-demi', 'vue-reactivity/*'], - links: ['https://antfu.me/'] - } + links: ['https://antfu.me/'], + }, ]) ) From 5a4e18786f674948d98bfa6e3d4b0deabfe1af0c Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 17 Sep 2021 09:36:35 -0400 Subject: [PATCH 025/103] add browser config example for custom element check --- src/guide/web-components.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/guide/web-components.md b/src/guide/web-components.md index 20436165be..da1c3f51e5 100644 --- a/src/guide/web-components.md +++ b/src/guide/web-components.md @@ -14,6 +14,14 @@ By default, Vue will attempt to resolve a non-native HTML tag as a registered Vu If you are using Vue with a build setup, the option should be passed via build configs since it is a compile-time option. +#### Example In-Browser Config + +```js +// Only works if using in-browser compilation. +// If using build tools, see config examples below. +app.config.compilerOptions.isCustomElement = tag => tag.includes('-') +``` + #### Example Vite Config ```js From 20e3ae650c9c0e9da5b32d525c5e220210f45c72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 07:24:41 +0200 Subject: [PATCH 026/103] chore(deps): bump prismjs from 1.24.0 to 1.25.0 (#1252) Bumps [prismjs](https://github.com/PrismJS/prism) from 1.24.0 to 1.25.0. - [Release notes](https://github.com/PrismJS/prism/releases) - [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md) - [Commits](https://github.com/PrismJS/prism/compare/v1.24.0...v1.25.0) --- updated-dependencies: - dependency-name: prismjs dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2105db2d43..0f27ca96c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6280,9 +6280,9 @@ pretty-time@^1.1.0: integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prismjs@^1.13.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.24.0.tgz#0409c30068a6c52c89ef7f1089b3ca4de56be2ac" - integrity sha512-SqV5GRsNqnzCL8k5dfAjCNhUrF3pR0A9lTDSCUZeh/LIshheXJEaP0hwLz2t4XHivd2J/v2HR+gRnigzeKe3cQ== + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== process-nextick-args@~2.0.0: version "2.0.1" From feb467b1ea60113b965c26f4b972bcee390020a7 Mon Sep 17 00:00:00 2001 From: wxsm Date: Thu, 23 Sep 2021 21:58:13 +0800 Subject: [PATCH 027/103] remove unnecessary space (#1253) --- src/api/special-attributes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/special-attributes.md b/src/api/special-attributes.md index 961b57a6cd..e5222d1584 100644 --- a/src/api/special-attributes.md +++ b/src/api/special-attributes.md @@ -2,7 +2,7 @@ ## key -- **Expects:** `number | string | symbol ` +- **Expects:** `number | string | symbol` The `key` special attribute is primarily used as a hint for Vue's virtual DOM algorithm to identify VNodes when diffing the new list of nodes against the old list. Without keys, Vue uses an algorithm that minimizes element movement and tries to patch/reuse elements of the same type in-place as much as possible. With keys, it will reorder elements based on the order change of keys, and elements with keys that are no longer present will always be removed/destroyed. From a2bb521cd8fa35e1ff15e82f41723c28001083b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darjan=20Bari=C4=8Devi=C4=87?= <32953370+doksara@users.noreply.github.com> Date: Thu, 23 Sep 2021 16:02:01 +0200 Subject: [PATCH 028/103] Update global-api-treeshaking.md (#1254) --- src/guide/migration/global-api-treeshaking.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/global-api-treeshaking.md b/src/guide/migration/global-api-treeshaking.md index d730cf71e6..502a272334 100644 --- a/src/guide/migration/global-api-treeshaking.md +++ b/src/guide/migration/global-api-treeshaking.md @@ -107,7 +107,7 @@ export function render() { This essentially means the `Transition` component only gets imported when the application actually makes use of it. In other words, if the application doesn’t have any `` component, the code supporting this feature will not be present in the final bundle. -With global tree-shaking, the user only “pay” for the features they actually use. Even better, knowing that optional features won't increase the bundle size for applications not using them, framework size has become much less a concern for additional core features in the future, if at all. +With global tree-shaking, the users only “pay” for the features they actually use. Even better, knowing that optional features won't increase the bundle size for applications not using them, framework size has become much less a concern for additional core features in the future, if at all. ::: warning Important The above only applies to the [ES Modules builds](/guide/installation.html#explanation-of-different-builds) for use with tree-shaking capable bundlers - the UMD build still includes all features and exposes everything on the Vue global variable (and the compiler will produce appropriate output to use APIs off the global instead of importing). From 9a89e94380f1248864c5d173c5a4078f6058ab73 Mon Sep 17 00:00:00 2001 From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Sat, 25 Sep 2021 20:27:14 +0100 Subject: [PATCH 029/103] docs: add the expose option and expose function (#1251) --- src/api/composition-api.md | 28 +++++++++++++++++++- src/api/options-composition.md | 25 +++++++++++++++++- src/api/options-data.md | 36 +++++++++++++++++++++++++ src/guide/composition-api-setup.md | 42 +++++++++++++++++++++++++----- src/style-guide/README.md | 1 + 5 files changed, 123 insertions(+), 9 deletions(-) diff --git a/src/api/composition-api.md b/src/api/composition-api.md index 14405575f7..f4ce05ad02 100644 --- a/src/api/composition-api.md +++ b/src/api/composition-api.md @@ -41,6 +41,7 @@ A component option that is executed **before** the component is created, once th attrs: Data slots: Slots emit: (event: string, ...args: unknown[]) => void + expose: (exposed?: Record) => void } function setup(props: Data, context: SetupContext): Data @@ -89,12 +90,37 @@ A component option that is executed **before** the component is created, once th setup() { const readersNumber = ref(0) const book = reactive({ title: 'Vue 3 Guide' }) - // Please note that we need to explicitly expose ref value here + // Please note that we need to explicitly use ref value here return () => h('div', [readersNumber.value, book.title]) } } ``` + If you return a render function then you can't return any other properties. If you need to expose properties so that they can be accessed externally, e.g. via a `ref` in the parent, you can use `expose`: + + ```js + // MyBook.vue + + import { h } from 'vue' + + export default { + setup(props, { expose }) { + const reset = () => { + // Some reset logic + } + + // If you need to expose multiple properties they must all + // be included in the object passed to expose. expose can + // only be called once. + expose({ + reset + }) + + return () => h('div') + } + } + ``` + - **See also**: [Composition API `setup`](../guide/composition-api-setup.html) ## Lifecycle Hooks diff --git a/src/api/options-composition.md b/src/api/options-composition.md index 602534013f..03c2f3f00f 100644 --- a/src/api/options-composition.md +++ b/src/api/options-composition.md @@ -294,7 +294,7 @@ The `setup` function is a new component option. It serves as the entry point for The `props` object is immutable for userland code during development (will emit warning if user code attempts to mutate it). - The second argument provides a context object which exposes a selective list of properties that were previously exposed on `this`: + The second argument provides a context object which exposes various objects and functions that might be useful in `setup`: ```js const MyComponent = { @@ -302,10 +302,13 @@ The `setup` function is a new component option. It serves as the entry point for context.attrs context.slots context.emit + context.expose } } ``` + `attrs`, `slots`, and `emit` are equivalent to the instance properties [`$attrs`](/api/instance-properties.html#attrs), [`$slots`](/api/instance-properties.html#slots), and [`$emit`](/api/instance-methods.html#emit) respectively. + `attrs` and `slots` are proxies to the corresponding values on the internal component instance. This ensures they always expose the latest values even after updates so that we can destructure them without worrying about accessing a stale reference: ```js @@ -319,6 +322,26 @@ The `setup` function is a new component option. It serves as the entry point for } ``` + `expose`, added in Vue 3.2, is a function that allows specific properties to be exposed via the public component instance. By default, the public instance retrieved using refs, `$parent`, or `$root` is equivalent to the internal instance used by the template. Calling `expose` will create a separate public instance with the properties specified: + + ```js + const MyComponent = { + setup(props, { expose }) { + const count = ref(0) + const reset = () => count.value = 0 + const increment = () => count.value++ + + // Only reset will be available externally, e.g. via $refs + expose({ + reset + }) + + // Internally, the template has access to count and increment + return { count, increment } + } + } + ``` + There are a number of reasons for placing `props` as a separate first argument instead of including it in the context: - It's much more common for a component to use `props` than the other properties, and very often a component uses only `props`. diff --git a/src/api/options-data.md b/src/api/options-data.md index 7c5425563f..502516b075 100644 --- a/src/api/options-data.md +++ b/src/api/options-data.md @@ -301,3 +301,39 @@ ::: * **See also:** [Attribute Inheritance](../guide/component-attrs.html#attribute-inheritance) + +## expose + +- **Type:** `Array` + +- **Details:** + + A list of properties to expose on the public component instance. + + By default, the public instance accessed via [`$refs`](/api/instance-properties.html#refs), [`$parent`](/api/instance-properties.html#parent), or [`$root`](/api/instance-properties.html#root) is the same as the internal component instance that's used by the template. The `expose` option restricts the properties that can be accessed via the public instance. + + Properties defined by Vue itself, such as `$el` and `$parent`, will always be available on the public instance and don't need to be listed. + +- **Usage:** + + ```js + export default { + // increment will be exposed but count + // will only be accessible internally + expose: ['increment'], + + data() { + return { + count: 0 + } + }, + + methods: { + increment() { + this.count++ + } + } + } + ``` + +- **See also:** [defineExpose](/api/sfc-script-setup.html#defineexpose) diff --git a/src/guide/composition-api-setup.md b/src/guide/composition-api-setup.md index e9312fae08..a9791a346b 100644 --- a/src/guide/composition-api-setup.md +++ b/src/guide/composition-api-setup.md @@ -64,21 +64,24 @@ setup(props) { ### Context -The second argument passed to the `setup` function is the `context`. The `context` is a normal JavaScript object that exposes three component properties: +The second argument passed to the `setup` function is the `context`. The `context` is a normal JavaScript object that exposes other values that may be useful inside `setup`: ```js // MyBook.vue export default { setup(props, context) { - // Attributes (Non-reactive object) + // Attributes (Non-reactive object, equivalent to $attrs) console.log(context.attrs) - // Slots (Non-reactive object) + // Slots (Non-reactive object, equivalent to $slots) console.log(context.slots) - // Emit Events (Method) + // Emit events (Function, equivalent to $emit) console.log(context.emit) + + // Expose public properties (Function) + console.log(context.expose) } } ``` @@ -88,13 +91,15 @@ The `context` object is a normal JavaScript object, i.e., it is not reactive, th ```js // MyBook.vue export default { - setup(props, { attrs, slots, emit }) { + setup(props, { attrs, slots, emit, expose }) { ... } } ``` -`attrs` and `slots` are stateful objects that are always updated when the component itself is updated. This means you should avoid destructuring them and always reference properties as `attrs.x` or `slots.x`. Also note that unlike `props`, `attrs` and `slots` are **not** reactive. If you intend to apply side effects based on `attrs` or `slots` changes, you should do so inside an `onUpdated` lifecycle hook. +`attrs` and `slots` are stateful objects that are always updated when the component itself is updated. This means you should avoid destructuring them and always reference properties as `attrs.x` or `slots.x`. Also note that, unlike `props`, the properties of `attrs` and `slots` are **not** reactive. If you intend to apply side effects based on changes to `attrs` or `slots`, you should do so inside an `onBeforeUpdate` lifecycle hook. + +We'll explain the role of `expose` shortly. ## Accessing Component Properties @@ -157,12 +162,35 @@ export default { setup() { const readersNumber = ref(0) const book = reactive({ title: 'Vue 3 Guide' }) - // Please note that we need to explicitly expose ref value here + // Please note that we need to explicitly use ref value here return () => h('div', [readersNumber.value, book.title]) } } ``` +Returning a render function prevents us from returning anything else. Internally that shouldn't be a problem, but it can be problematic if we want to expose methods of this component to the parent component via template refs. + +We can solve this problem by calling `expose`, passing it an object that defines the properties that should be available on the external component instance: + +```js +import { h, ref } from 'vue' + +export default { + setup(props, { expose }) { + const count = ref(0) + const increment = () => ++count.value + + expose({ + increment + }) + + return () => h('div', count.value) + } +} +``` + +The `increment` method would then be available in the parent component via a template ref. + ## Usage of `this` **Inside `setup()`, `this` won't be a reference to the current active instance** Since `setup()` is called before other component options are resolved, `this` inside `setup()` will behave quite differently from `this` in other options. This might cause confusions when using `setup()` along other Options API. diff --git a/src/style-guide/README.md b/src/style-guide/README.md index 4dd04b91f2..f0ed0158c5 100644 --- a/src/style-guide/README.md +++ b/src/style-guide/README.md @@ -1284,6 +1284,7 @@ This is the default order we recommend for component options. They're split into - `inheritAttrs` - `props` - `emits` + - `expose` 6. **Composition API** (the entry point for using the Composition API) - `setup` From dd4598aed8a00be49cc017a66cf289678f63ea23 Mon Sep 17 00:00:00 2001 From: Michael Darko Date: Sat, 25 Sep 2021 19:29:53 +0000 Subject: [PATCH 030/103] fix irregular radius on code samples (#1256) --- src/.vuepress/theme/styles/code.styl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/.vuepress/theme/styles/code.styl b/src/.vuepress/theme/styles/code.styl index fe065d88f4..8ce6cc9b39 100644 --- a/src/.vuepress/theme/styles/code.styl +++ b/src/.vuepress/theme/styles/code.styl @@ -142,7 +142,7 @@ div.reactivecontent // @import 'http://github.com/~prismjs/themes/prism-tomorrow.css' -.token.punctuation +.token.punctuation color #a8a9cc .token.tag, .token.attr-name, .token.namespace, .token.deleted @@ -169,4 +169,6 @@ div.reactivecontent div[class*=language-].line-numbers-mode .line-numbers-wrapper, div[class*=language-].line-numbers-mode:after background-color #f6f6f6 color #c4c4c6 - border-right 1px solid #e7e6e6 \ No newline at end of file + border-right 1px solid #e7e6e6 + border-top-left-radius 6px + border-bottom-left-radius 6px From beecaad1bfd9fa3716b504a5a6d526c23b98ad4d Mon Sep 17 00:00:00 2001 From: Cagatay Civici Date: Sat, 25 Sep 2021 22:29:58 +0300 Subject: [PATCH 031/103] Add Sakai and Atlantis themes for PrimeVue (#1257) --- .../components/community/themes/theme-data.js | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/.vuepress/components/community/themes/theme-data.js b/src/.vuepress/components/community/themes/theme-data.js index 24732e3b0c..4604a5ea2e 100644 --- a/src/.vuepress/components/community/themes/theme-data.js +++ b/src/.vuepress/components/community/themes/theme-data.js @@ -131,18 +131,25 @@ export default [ seeMoreUrl: 'https://www.primefaces.org/primevue/#/?af_id=4218', products: [ { - name: 'Freya', + name: 'Sakai', + price: 0, + description: 'Free Admin Template', + url: 'https://www.primefaces.org/sakai-vue/#/?af_id=4218', + image: 'https://www.primefaces.org/vue-templates/sakai.jpg' + }, + { + name: 'Atlantis', price: 59, description: 'Premium Admin Template', - url: 'https://www.primefaces.org/layouts/freya-vue?af_id=4218', - image: 'https://www.primefaces.org/vue-templates/freya.jpg' + url: 'https://www.primefaces.org/layouts/atlantis-vue?af_id=4218', + image: 'https://www.primefaces.org/vue-templates/atlantis.jpg' }, { - name: 'Diamond', + name: 'Freya', price: 59, - description: 'PrimeOne Design Admin Template', - url: 'https://www.primefaces.org/layouts/diamond-vue?af_id=4218', - image: 'https://www.primefaces.org/vue-templates/diamond.jpg' + description: 'Premium Admin Template', + url: 'https://www.primefaces.org/layouts/freya-vue?af_id=4218', + image: 'https://www.primefaces.org/vue-templates/freya.jpg' }, { name: 'Ultima', @@ -151,6 +158,13 @@ export default [ url: 'https://www.primefaces.org/layouts/ultima-vue?af_id=4218', image: 'https://www.primefaces.org/vue-templates/ultima.jpg' }, + { + name: 'Diamond', + price: 59, + description: 'PrimeOne Design Admin Template', + url: 'https://www.primefaces.org/layouts/diamond-vue?af_id=4218', + image: 'https://www.primefaces.org/vue-templates/diamond.jpg' + }, { name: 'Sapphire', price: 49, @@ -199,13 +213,6 @@ export default [ description: 'Highly Customizable Admin Template', url: 'https://www.primefaces.org/layouts/prestige-vue?af_id=4218', image: 'https://www.primefaces.org/vue-templates/prestige.jpg' - }, - { - name: 'Sigma', - price: 0, - description: 'Free Admin Template', - url: 'https://www.primefaces.org/sigma-vue/#/?af_id=4218', - image: 'https://www.primefaces.org/vue-templates/sigma.jpg' } ] }, From e555fdfb6576522d951106f7bb879dac33cc40d6 Mon Sep 17 00:00:00 2001 From: wxsm Date: Sun, 26 Sep 2021 13:42:19 +0800 Subject: [PATCH 032/103] update v-model.md (#1259) --- src/guide/migration/v-model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/migration/v-model.md b/src/guide/migration/v-model.md index 680bc5d005..928a2b3169 100644 --- a/src/guide/migration/v-model.md +++ b/src/guide/migration/v-model.md @@ -86,7 +86,7 @@ Then the parent could listen to that event and update a local data property, if ``` -For convenience, we had a shorthand for this pattern with the .sync modifier: +For convenience, we had a shorthand for this pattern with the `.sync` modifier: ```html From 0b3b6c4cfa680d5cd6b09e2e7694ea56066a3fa0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 27 Sep 2021 09:14:02 -0400 Subject: [PATCH 033/103] chore: update sponsor image --- .../public/images/sponsors/hbuilder.png | Bin 17128 -> 16059 bytes src/.vuepress/theme/data/patreon-sponsors.js | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/.vuepress/public/images/sponsors/hbuilder.png b/src/.vuepress/public/images/sponsors/hbuilder.png index d39aadeb9aaeeace1eae05e9eeea01d2be600740..a2615f8e4418b13805ac41c4c4cbc2c65bd7ab3d 100644 GIT binary patch literal 16059 zcmd^m^+VI&_y6cFDQU!)Qi60h0@B^1L~?*5MyHh0BHc*GM#D%ah#)n(Q z-+#vUyWjSF-g}?to_p?z$2sSto{kzBF(WYm03cI;{mK9UzySgPSPF#rm?xDUA!Gmm zJ3#%FqLF{z(aKUP^FaRE?=U}PghUFn-b~tS7Kyax$-sTlSTFy%1n^^9iQYEc!f*sF zKamWUgs#G`RMW?DSg}++C##PmNeFsZ(~BnnFD5f=>cpaL7`9lzgTmGQIgWBv`fz zwL*U0jnclp{=oX#;y@CDEme`aJ0tlEh(;BzJ^F;sE^H6l9?RyI(Zz6%=DXI93dvz6 zOS1~>kY6}tV#QG~30j>^oQKe&Cx2Y-UYrDAMj;v+@%a%gs^MxrCN*g;`zPta9+iKv z0f2QgT>kZ3*9^rJ1RekoZa*U_gP148NC-f}Bm>cs>BzqE!!|=_7rkHqQ`f88L2vq0{1ukY>QlTD&>K^RiEj|5T*|!cPY~ zDCj}(@H=99ZQ*e4r~X)gICjnT#R)~nWIsCExfx`i4u()lY$bXC`&-Q7mN=%Fel(aD z+|f(M@{|f(mA+U2rSvivRa1g2mX)h?+HKT}um-&DT*`S2BKPNX&NNgpKgw+heRt&e7kh(I)}`?3>7ees#U{vCQH7;%@&bj?ou4Yzu zUAlm97Y0tSEIYXPi`M$$?6^ua30D%T%ky zb0#zA&Alx_mqRRLVYb-0(Af@?SrhH`Deka2S%NweqxLvZ)65$iQ9!iF7$dCPXbQmS zRHTv0AML&hK|n`MKp4ReG=H^v>F`-0D25j+zqBVW$7q)ric`7T! zvFXkL-Ja4x0B6US7o?p*lf zmGOU5F4B3I3LbJhdN_bMevqaAL{U1aOhonLJ;|?X>)59a3$9SHk`E6z5)7Axui!E1^@DhF-e`I@NroT4RM zA;FwE*eeNN_+)3>BxjTN1A?uP!<%CpBtOH(&wNE8s~!#kBbbd?5)?!V-plE|dj3{+ zy!E8k3iotV3Jkpo+`$N|Y1l_;%noLPW#^O&IvLECz5FxZ!C`MjN(Q(6&_YbyOH-65 zzETp}Tva?>a|s;6AG-CohcfZQ{a$Su#886l71x^L18YYw_Y=o^Gl$WIn?2$!E~(c^ zJyJU>70KJxp~+?}1D>N1iVWCk1P}i;6lnaYvJt}|SJeqws_Q|! zd8xr=G!&yTCb{F%?cT=(tZ;bgDu<)_tDnzzJF(U=sECX18NV;EEYzZGoum_C&fUB! z(7s&q%ym56;~V6TZul-FqRW>tAl~_v%hPN4ocxmXl^PRe5>C!cT$SPc8&N30BYpUmqMW;F{~Zk5bVKpl%{dBm=_QO?ARD7izLE z*EGu2Q9U4@rWc@|eA(zBWy4cdzm4*LH=kGWxppJ4GIHDuJ3HER>SKf_UxxKN_Mkhf z{Q>2w{+72!VS{T6PCRdJB5L?`MR!UCO{uFyo2}{450K|ftkq(1mJR2>dYTDX_Q`Gx zm{d|fC!6xICWU&G3v%j?&c0p!4u$uGjr2(^TS37S`P73S$54LzVrUky1e9mxTmm8x zuLAY8T6Jp)J{-vGL?odVNjmuVwW$JXUKrM0WQA=>F2fdY$KkXv7(PsgFrp?SM^%FP z$7H4WR{Io*m+x_qkZB>4HWf2@Y{}5D-N>5Af@`^$FtNi?sA;P-g~Pk?jAGJK*11Mw zHy(DP!ajelzD2!*mK+)3%i7?}!+0V2v*|sv^Y639TaZX7M8(7_P z#d0^WVMvyU;GI?6O}dx7*f%b*3jlszt(PX&M9N(xbe-PnZom6_BYyfTo8Cd-P_uI` z!~bfuA_rGgIOJsix~b%JrS9R@^1ATrjm_!s?8~w>^kDENw~L4)+no$6Tla)Wubrum zxX#aHI=bz5Hn$X~CEoEuX=YO0V_ZHg*F7^JAz@)@sd5{)Fz$zwYvlH4`Fop%{iDJC zg()G+LRq2zbia8VaNq!t=R>8#yx&mGukd@gW4TQ~cdRCS$rQ7M4yy#;5QBp$ET*47 ze@ENyU8<9K(JeRTDpjmS3Ga{ski9)IXOo5AgSmq4WCLKnI-y?21E)504^3U?BNT51 z9>4Y*|J3*6Slv4z5c;HIS0}NYR<)w=bCAv2XPeu7SaVRme)@}SvDotlY6en*$^Bde z#G>bB#BW+Gc4obZ2RGJ{%XO9 z_>Nke;^Sdld)c{8kr9BG_tbB|HvT)7lmDP@v`Hyyje1Ua2{k%LtWh9%rt6^@6=*WPElTg}%&B`$F|`4tu< z&-Q*SmZkWfD3JT;w+|o8(oGRXaBesE^p|O>1d@<2w@!|9z%DqnUur?qha)edyGGnM zT9hqqDyV&xKpUo0v{v1A?~DR|y0Z68G=KM4&QuFwGy4i5ZR&A<5ILX-oIGw*1JySk zkam=Ob^2v|H_`bxp%@=VUQBW_+#EF<@&?%P?cNe09tC%-p&>Sslu=a~%flC6M} z3TYd%IkE9iU^$x-6n)cfh=VxHnx%j8f53Y-Me#X^-7Eiv3sing3|Rg<#=MSpEEUT6 z-)@j)Bt2ljfGNCVK22!!R_TRRjlJz7N$9((Qfw1)-NvF(&A8J*-~+j2oN-gaceo+( zXHmXx%FAEa%uLRiz3V(33ZKdt?YoXVPy7-O=uWasc+1<7CJRrctnhlH7F7}Y$2%2Qmi?27VX|*1$7PTwb1!;4C zGlnJ{$pVbcP8}IDgUz6G@xd#s7t6t=OyRP^fpkvP@>vwmj2=iymN)t|MP2a)((iYx8eT40p{MZPh;PB}%1x#xo45 z^$4!zfa<~Lmuf4n9ck~bDUL_rMLDR{8JUD&iGv@pMcUWpD_nS6MY*#8V;3CQ(gVpF z_>*^+$kDtM_OWJ$c*67-&n4G5t@_f9;PbbS9cV%8i`y~;?;DGupRkyfFJn$8w%C(( ziePhWlG}FGJAdJz))(zE1@t7-GMhOi``PwvoekJ?E4+ShSb{y8=;<{)DtG;JHTWsh zR955Rj40%d4~y3e3IAkf+Ld^Jqu7Zs}%5|?b91a`&9m91~_TG zTyGahu@=vV3hryZ^!^c(>-vF<1HA&APSk&8GQ<<`;f16eKJVtCvIswP2)8Xm^Q%2D z6uEWEc+u@`oKM=_+v3m}mi_KCF3fDs69PX?e#CSTu)3*@Puxd}E$5;-VZ172lnq<+ za<2{f@SNsXv(nsv7;^LApn(qOE1dS#{3Er98ckuWG_#kY5IP0Vto~)RXvv;q1f4Gq ztR3dzzAbWeMATvZqS+<7uA@u1>EZM6jdaBD0CD@!g&hEC_jZyy+A3e?^}3Qdq~%#~ zrr%?(|C-ds_>|~*4xSCXlt$`NPTI5maL5{Uk1O|DIQi~!;^WL)ns~xV1pH$9(5c1! z>LWx14DtUQ(QCosQ~U*J3ir_cEueGOK(X1__!+eBwLG?VA-SWWhZS;&C?mrSl$wbv zXW*)lU3r%z3RGy|b72Z7(g51L&2sE#&vI2!&pCxl6=2kB(H|E~^p5sx)_h|6pl`Co z2+uN*XlJ)*V%-Q<{6qciEk9xY2AB4rUZ{iGFNnpJGB8BI8ONn($tYmK`jsON?4U^b9`?@z;~eye^_Yv<;u+dh#%O#5g3q3czNYf<1&YKI+Y zZT>P`z=PiD?{l9Bjk+G%0dZk(6*NHpX`}2d1Q^1M6!gB|Tv*v9+X=vHT)1AOGV_oX+wk>Q}( z{LeaeIf_r$@D+a}gAhO~0X;ztCj?sMn_wht;d`L9w+D`4X?$T_Kp=jAj|whes{#mu z8(HGe8w1j`F$UQS^WL%Jap2!)Lq=I4uuEF(aF=V5=BH>5@P&__2EBNicJcuqWt#ov z86&l#J)7ZsJzV4|fAI$(9!w6S+@>8V_}RJIWM#6~|0H8!)Asfg@uw7}V3-sE+x(*W zWXMrX{Lk^}7`Ed4x;vn@z2Lnj?YUr2e9F&+$iA654FKjO-&9*rh=3bnNC*)a-pnR& z?CO>>sL+puoUxW@VLUd-Tp|6`jA8D)*6+ybiP2L7i~t~eTl=4zJ^o@!L_k=`ph}^aw_sU)9SZ2%lITm6e(ta#p}zixj6S?d zAia&5Ewe>%yZQLaSex%eq=c)~yIEv__8P3e!RS1%QEok&zTI7u9p-v*CtpT~5GGdh zl5uTWyoUy>RaWf!aE9+*2yG9<;rgqEqA^V9C4@HCxaB2d#Xxxn94>Z`A6p zR+s6R8I`|?5jlXkOf$Z@7lgpzsx6u#U<~?DViM+4GnYDU9A`g0QO@A*okVaF3=rV@ z{n6f12bCo4sUv)zSNO|b{##$*WF~NxpWOD-r3Poo;K;(&@!&$ilH)%7#G3RALhU))VkYoo6B& z-gRx9K`T~OGpNR?rO)?Zy$rp@3I#UG+uW_tv8?0!tM~Xnoi@NR*qYJq?b z+8iV;w3eIc`}JubT;%TAUnyukjj?6X9%kjAQ{lW@2PW1yTGf`%wq1Cm#Z~^BLpU@om;za!;t-{$=hkGD*GBxU}dHS zI6CiWTw43Qt0T)Bj||ow8!5=h`Mi^9I5&5eopFLl%jW&c;k7c=L>Tap)n(E0HG68) zR%(`6cc2r4IDrC;?a$A`xRVEloJW6OPUZ&S!7zdO^bfW|mokt1gB%-vUf`008Tw6c zZ@iOD%ERANrqfMt`Bdw#yl2ARLWZC;mylGP8@0aLC5!{?kyl|=C zk%kZBM_Rwc&K{6>fj9t}&n-DI_L{97e5gUpOc9%I%zq^&+_xNXO8^DSZkG&(`(?X&*3z##p za?jJhz2F!9l)adc2Q5r*YQmCX)6#65!NQ=%+~X0mY6Z#z9cZl0D7ulIfgXHuDPvT( zj1A>!8wNrWFBx=D>yEk(?%BDW;314c+BmExrUXeGf^MLy;h-|@eLIT>hta~EnV=joN zQ^yO<*&eDBougcTUq#N&}CcxyCdzYpZ9w8O*OSwPZ{J--i)AvYz<(2 zhpC}*`KR;2T%E~=^9ZH%io=3?|MsKZu@LNfwLWpyEvKMqlo*mM+* zTLshZ`3TUznG^SaGj`!fb1fmRg4CTl{H9J#h6xX!xqXZ=pDX0_F7EGo$3N$NUFm%D zmz9qtGoq%Xn72HgjTrXXXQeA>n>>QVSg$|vU5M51OTjAvG!m+=oN2vL-e_zkE~7Ic ztSw?KO2+m>Rt>VUGdf;D#aas53XWRP>@actMR&`}yV%pCraAC4trru4eD7F|jspxK zjNq&pcDXo!Sc|iH2b7`iWo{I#p|?S2qC;)I8iqkGXU=-Oca}RUrXr!d+&fOAYgC_f zB!^iWkIC<#lY0qnrWyU2njf z-dWCambUiBU;|EJ=wsk?>tfFzLFI-lZr3&$xy`rvDOLVZSKi<6+-hsE-sp?p@ZG8a zRz45UrHyXAiEn>!$W1AUxU3HS6QaHGhgL}Qr^C7{s03>Y3hp@|po^ZJLCkEp<7(`N z6!K-twyx`RmQE$6CTdW4tOm=?3^BYeER>7s`=Gs*2nu- zZ?ujbS6eb=zpw+~%1q3I4Z(Jr_a2y-(y{6IQRlLY0n(+3 z>KU>SY%NPIZL0G-v)F}G8O@?JU`sUp%2k$&8CN7MhJW@c_O{TU_xA}vG#XE$#A-W> zd?&)!^}OB1lQ3gnD=U8(k#2;S6%+l1>EPZ{5dEJX$iP zT+y@xxv>@#t`_<{ggdUcmXg|Suh`G;_zgsV7?~0`_`bG0$>h#EVG(?isVy8RRR*pb z&t)5ESVqgFA=|#D&92S~F_XVlWi((@nPMCcEYSOG$2_bMgHe}*Z8~9^))F^edHM3Z zkP34-Q`wbOTeTV>AP&T1$GhDq)=bzg8Nr~?z0u_Tw71MkbZy+^_mjek=o*+?s|D|3 z_V1nZ!qHc$Xu?@{ZG^)*qcfz&atq;L{T!=`KA0 zZ&5RXrb666b|OnIr9F$evu5y2`lBfRo~O*74Dc8W7A_xSgjV`Z^_|o8b!OpE*u&`B z&%WajN#TduJdeCUnP_r@nikP|*WtRMt<53*u9e1=V67oTOs8zsFIwvv6f7((F#1p<>xoMOgBlW7Ve%xYMlIGP ze6O6#_)7Qn97D{(14L70yL})m$h=5yTIQRT6xeEM62mV0| z1{|NUXL{2DQho_+P>Hf1)ilV+L$qeIlx;`nh4x^@iXH&K>ie%2pqML-K6^A2 z@qKlAJE&yzm?tPa}yc~XOj8r&r&Kv_e%skOZ5L;IlNMykm& z#**mOdD)!Yra0>PMeauqY9JX5k2*?stC2&8aV9pr6GSgBWNnp_Bzw?WRlkfsFkm~Z zOMxLG&vNB;>F=(-C*LzT<5FXr4wbA7x&Drb;fT&RkQgVyr)XYsOgDB1w{C1`!0K$Q z=ds916t zh;lS-K0Xj;?c+0NSw(_vzDi*_5ODBy_Z*Vz`l~ZAcx`$UB^>O&f7v&HW!%)t9OnC; zBpHTdYD!RxXY*hXM8o(e@|E3Xnvz&UL0_lwT4W7Zu4YFnDVINN(2~dBYARwj02=53 zeO~KQX_a4^)3V^&O?9A7dFuU{I9Ln;9>62-8d-O@u3Wc4 z>R$=QP`|Bm)?wo3zLrjexPJQVRpt06MqR&Y;aN%192$R8mr5Sw!)5k;3OMmoE$&jE zma};5uS4SZ-w#fG^ESqrPc?BMC&B+2V6hn20{WY6Jtyk^bd<|ND|%_OoP!gqX1WPC z?uXj?n>&&?*UDXR-9ZHJpL$lLPb+D9@*D~!O26OUv4w)f_st#um7H~Ld0W2~GHw)w z?26q)o!=`3g$8t2Fd|aDr%^O5dPxmPbcwxNX?ZU`ed%*an;L-~u&gPpgcfEsa7nWD zB-=ouGH@MRi8_!S7qHHSVPmGYy}n*UL6iGYBPN{-&>DeY;E>q1{AzI)g(nw76X%#3 z1VAyE1)kcvXav`L;0l&RG&XTz+=Fo>@nw>8L!$#pJ(ws;<4N3qM8Ktv3=%+j zoGbRp<3a+O>}14D#S{}Umt1`eiGuB8Fec?asJ4FKS{9Co=Gd>mrr+hqR6Ed2J*1>3 zBhuYMwbB79sXp_|c2Y0&_(%%?0J&>I;GshlhekQg@#G1fLb`x4wYk=2a8TPo1Sd_rmU|d)MK1`OS>u**o zA)Kb71JvjuPDu t4h4=-mRPf0FGl2?2oU5EiUzwzqfs{3h+$>L+%hED7X&J%~M zub({@$b#bI5A+*EAstTd^5!mm7$hkE=^=)4YtKl1)v|739YS;*(Z5csA~1eH7eP|_;fr-Ti{JY9 zaFT%I-1P0>O(n$7=hw?OGOb2!hu1ja6?dw-z>hkbbLK0g5mrQgUS&9tVz zoxKd{$v9d*mvt}{3Olrf zUe`5F;@j2p?ZKH71HI7$;K({jnnpYt2Bjcuaf>&Z`{5FPKQ@~*HvjxmD9ZyR1U`a~Tuc3PpWV~KAK8W5#%>yEccJgoj^@2!T0cyqH4P%ou<3Q03%!21 z_&Dfd&++f_=>&2kc74Qj*DU2S!R+P}~=K1TCfF=|V#>b#+Z@rnm%fXVT9m?gN3MU@k zNX>ybn#j&BQ3mm&N54ZhD@){ zj$q0~z>{e#5*+T*Xn(n=s{mFteH)xLs^bK4saD~U&Kcj@k2ThH|FX3^qX4<5hIW_~ z(oe1KCk@w5kK@1JM7$rrD9wq1O0a4GE|27m%s7>r2-|_Ob|;QO z^NYnU_Zf`?jq+}(1r;e>vr3R-K6*_G{JE;y?)DtSqkpmG z`kGm@VlHFlxF8snHYmWV@orq&k&rFBhnk+p8%UC(QGu9hErI%obw{YJvE z6>?G@cZ#};cS)oKJMft@@x$cadHoT6QCdN2FTcQ`Nd_NP`Gv}vGS*$+5jOWp?LN{X z|2Po=!Y4k0Den_q3TqtXbd@`<1yth%6(EyeZ507-6$KWjZpGaTd zyqw+EmChA<{Kvr$?&rKNL|bb{aP71^_8Q1Ev?70}A?9acz-HXJQzmH0W(+Q$ntGyj z6I=W|(L&jgsi{OgJZyO(E$nvcW$6?;Ny*h|K0{Gvyzq91VE(qVeerPb)%8l`%Pl_& zd3r;=;OhJ7N)5@Bi0}6lR|*w9$8^6CI9&aKNnHd$(l049B4abvc@gh;hRcRjpz?`JuXjjICXT6@W(W8)J{3c8Gp<;?F~yKefQ*9$HWf% z=|4AHGmdXP9913FKnTX0Wc_f-wyE)yJN&1Pi#t0WnsRIR2Kap&p%b2Aw9A61HP_^O zw=9TXOS^uHTaRF-ngj0yrlc%?pQZoA=tvXpJT_nIqzw4T_lP5f_yFvIpdjZ zN-IVSvw%Z;(V}Z0xUY|Z^!YNCXK6Y0oGO$#MtPq+umti-=s?atcq!g2GW)t}0RxNl z3Rwy(LW{MT!F!%eEKPqy6Fna%ms9_Vk*yjq|JyP5)^R-LubY))+3&r3uT^~4SS+JEBRUkuS=Ude$!cx4MfJ3i@(Gr;wfz9euwF23;SszrJxhCv)WdgN$@mXk65*itRbkB=i?u?^F=Niaa9}gzTjj( zd9+6kz&7&Rqqy)h5jN)CH^Vi(={NVPiK@zuzZi}LoC7XY9vD2~ST&7bv^Z7xfbbF3WR!TcWw zub(E(<=h8Y+VokBq3ve)J`ASz3!a1|Erhbwn%|Ndz-+#bZ6Lm%I_ETe-rX5Eb;j8; ztFf?O#rh%iSoG&(G|vc4?~&e|2c#1Gt;v$k@9PT=w4*B(GyT+ek+;dWG^B=!R)j!=eY{kPxZNH#ReQw-;WfN+AS92+u`<0w$g(BaonDqD zQk*aB*j_i8VjXuCJJW+hx*vg;$Cdr317kCi(v2*S19FBw3}l>}Eg5N%E3Xd~x~DXd zshTg~OD@?GA_UiHVWrz*EbEkC3dA4__8i={4*C^Bj@f@dxUJ^0yD=1cb$PeBN*bU1 zib5a#ciG;%C}$gZnqx3;uMiKoNd3WY@d?j%x5LD4efCQv@tcevykIAbDdKD$LYiZs`5ZtGuDs!{0s6id_8bEN(}J1aX`h z9knt8Y+x2Lk?~3V2J=iT-SbeEXJv`Vu$s>0mXHT`r8B#%I^{TXWcQp3%CB6F42TqwY%HO&|d6$ zC)lLTEWknfXdnCNm$$NE0vKx9Bd^I&p3E9;a-tBiMFrO~d{59Eqh=dJ(BX{jpPK#r z$}46ZlD|o?H49DIkHU;;hyj`6WSS3%B7a7NpD#25BxW;AI^-H8wCK;PWoffc&7|Ju z*jHLn(i?!N+R7yo$9yd|mN-uDvyvNZ8Rp%1Jsev7UyFXyDHyb3ji`Z6wRT9=Lw}1s z1t?qDOZ*4M8nBqVcrJ!g;nxxPP@B_NZnvl<9CY(xKbMJo7VjDAGDBz2KdYAHuS8$@ z*H)dJg1{39zYFA|9?)2g6h!jppfXm7GoQm1>?~Ps1UB!i8~s;#?PZ*DMYCYDF8t+V zo1e!@L_2CZUIsKrui595Vv9`21MV;`W4$gjxXWP}A^Ow!rn+5VM`WaAHMT{NAc@4{ zQ@}u@OKfR1K7EVkc6Gs1{%UScmdtaMjLS=Se4udMkthLjbe2q(pOfJdJNn3{w-(iw zM11D5>GNNUB$AU182?wIbu^Uj!s+FH5JY*6B$J*ZTrIe6Bd(>lr6wX?16ygLBJ#QI zXzSF1o#8kozwr83O!)7))>dk{%9&xf4{Xn}+dS&3pkKt#ZySKW!-!iAZH`V>URbLg zstE6nG+613?dq2(c%|EmbC#!9jFum_yd>Qeo8ET7H}Fv|I_9Oz_QR*X@UEit_m+}T z$Ni*sn&smX9K(2VwJXH#71W`5zeD2>%2$DT-tmF=NleS(Pp@I%k0y^;UCS`#(Ml5& zvT)x3H2`m`F*b}c*8SUA(Ww%7G4C)S$l^wC!MbR05jsBS)63DZzc2F#^0l&FW)^(W za)F^F>OU7E-Dr|}duiv8pMAg28GcpIHXJ&V8xKAsvoinV)s%h#99)#>#gr*SfabHZ zi#nXZDuhL8O@Z>nsF6LH?Hf!=fc&V9DvR9EDniSR0Q}iwFEGoJb*-8QG8QuT?OwMv zLj(*Q+y9*;1SR)TcQ`5q=ayMMnIgL6GmkN!K=VrfPj0j}qGt|I zb7etWp2|!mTK?Ft+?^yFZgFhI@UNWO!`N1;SbKhPax6QRWv*0sSG_P+GiUYGSD6ecoIDL(dl|+bdf=tC?N#qZ2zz_r`q_ zXX$(abW%bI4y&y^~9d(56jw znana{jnFh8BQ|>(Nl6Ofd9wR7ys;@8)+(wfF2BU>1|xu~?0?^VV^NH`cP@~(Bk|hK zY)&DY6`Z$dM~f#+9rhdn5N@}M+2QZBpuYH%|FnTw7?aSaj(PzW$t@E8X|0T6w-}#!C+%Vs-xB`^Ksi^kDDcaZ8trHj ztk*g4Lri8!sNslGb)7hVG_XRQ342~-$98Bb^w~iv1ekhYGU(HL7!0Y~3L^Wr`~Iqs zhMplzBaa_4(D818x%|E z3$@rVjxWsp;iHs!bl22awKcJftvK|Li0vkIGD4?MXsGPwM>+(^XCY>P0dm!P&R8Bn^z0V{lS zrI}d-Dwr?unkfSvudT8zAofkc`S9e!QL|+(02nozWCQWH5i_3jtZp&o?Ain5aUr>* zYd4e#Q?-+&yO@~j7IsL_ZkC|#Mb^Fz@Mlxo40|}d@`QEYrR)7gXdnfO_#+ueJM@ph|sB=rqvo#7Ey?5?nTEB+PGc` z6{9*iPI0KNb$G%@w`4A;`h};%TPlLwLby4?C_k;m57GzT(BGBSyS#tQLLBiCs@Khx zciFNZakSW_-lh9kel})XwI}v>0I-e|xDyduZSD|GaC5f9|kX9m2z_+;|JR=!U~b?69m1q6@RAx8t|IsGB)3< zzq4_U23giv;k>6?|L&!Os$RE#lo}EPyR0HLy9Ot)|LWY_j1x-*&m6unR?b8Hphh3` z2iolZmf95n=2&dMCg|B|y&NK_YlGBx6SfQhIjes`t=j zqBSb%ZTc#dmm_R4>}wUMS&KcM$UIyaBt_`ClEiq8VUjQfXtVYFwy4p;DbFREEhtoH zM>bd!XR>q($Mgbt*22(G7f%2RB%L1ujNu9zzohLMnXX^uW$WsJekEm;YB>qW_qzIm zU-y>rmv^8vCr1-j7Y%%F=EB61vHae+f*`b<_J!fZ-+cVq9+QT76d9PeT|>LA{nTGv zblq=aJzSu`YStyX)qR4~p|^V4w=1CHA1@*$w5 zB#Z7W>l0T+d8rXCM8J2+=GzA&)1QuM=g#e&b~>pS zqHF#FDdc=l&24n^2h>8#VKzv6Q{pr$ZlyuYu~^U9ri-lkE7n-cPq@y<|J^;axZ?=c zHnsV>99kDqT~>ThC<+cK#u_o|{9_jRub=P>kHg70@%)s<-QQM|p3pDGb?AeyH?7u? z?2@x$Kb-vM^OHa5Yz_*{zD|0)51ZzGe~GqkZ!$c!|JNf(T=lAK7sH*xxs#dcT=UBd zQ;yT8R+krDVr%{ubD{cJxe3{)bF&$TeEF=-Iaaq8IJ3J|N$)L<>M@|do=G|>9p?J{ zWpIc8W+Ah6B>t5Qp%7?dJ;Z43S{PNy&BjmsMQyMpudxlv=$j2l?c2)>$8zFUjD?>f zxx@R{xyWzSlX`}^2}oC`zIULCJ~U|W@28l0dLOHK1~MBh`Q3q#}DI)fG5hay_& z+J5slI@JF@Zk$d5bg4RlsLlo687a@lFJ7O-O5F)m1&NE?)g$(O9@7e{<2Qt4!jMZy9D#bgc%*kOG3v6J=+x4=5pRJNq!KwNd3UKzW~(Bq zCE7f%)dG5Og4(*f4lYh=%yQ)kI#6P!UOmS)#b-o}K#Pm3tJ3RUGr4EE#6CQqxjS(o zbAG~fAXV$`?rT?0a4$4-_=}g!%4Q##z`8`IVY01IKy;rc9Y9ET@7@0IJ!t-54Iq~Y$!3>*^eC--&Z*e*?R@*z_7^C1~3`55-ODJqm!kH%l zVs+mR5@KrUA!`^h>8Mk2|Nfhg%qE~YKN*rgV=BcbKxF!LYV7?(wIQKj3-=FJEE3Gz zEar&e5+l49Eoo$? z_X=Qs3f_J_7oI;E(oJ`cdh%*?jB{dfU$6NYCi17k-aq6m zGNEh{UmT<{bJrOnKtumbf~0%x#B}`yi+jg!!@DyA3o_}$Zr6%xW5??Cm#?-8o4>SF zwblKTXw$05e;wGk?-8^BXz;UK{=zBlnDT`m$t|c2B&N(kwnZ&t;q0J|u`x94LcOX$n0!Z_rKk$tLVIfDcQdNKlLP?S^xk5 literal 17128 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 Date: Tue, 28 Sep 2021 18:08:24 +0300 Subject: [PATCH 034/103] Update options-lifecycle-hooks.md (#1262) --- src/api/options-lifecycle-hooks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/options-lifecycle-hooks.md b/src/api/options-lifecycle-hooks.md index dab2e2e36f..18f3fa22a2 100644 --- a/src/api/options-lifecycle-hooks.md +++ b/src/api/options-lifecycle-hooks.md @@ -140,7 +140,7 @@ All lifecycle hooks automatically have their `this` context bound to the instanc - **Details:** - Called after a component instance has been unmounted. When this hook is called, all directives of the component instance have been unbound, all event listeners have been removed, and all child component instance have also been unmounted. + Called after a component instance has been unmounted. When this hook is called, all directives of the component instance have been unbound, all event listeners have been removed, and all child component instances have also been unmounted. **This hook is not called during server-side rendering.** From a2878cb18544daeb0479fa1c7f3c21ffa1f477b3 Mon Sep 17 00:00:00 2001 From: Michael Darko Date: Fri, 1 Oct 2021 07:54:16 +0000 Subject: [PATCH 035/103] Fixed irregular code block borders (#1260) * fix irregular radius on code samples * fixed inconsistent radii on selected code blocks --- src/.vuepress/theme/styles/code.styl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.vuepress/theme/styles/code.styl b/src/.vuepress/theme/styles/code.styl index 8ce6cc9b39..a27e3b0f20 100644 --- a/src/.vuepress/theme/styles/code.styl +++ b/src/.vuepress/theme/styles/code.styl @@ -31,6 +31,7 @@ div[class*="language-"] background-color #f6f6f6 border-radius 6px .highlight-lines + border-radius 6px background-color #f6f6f6 color #3a385d user-select none From 174fa8af2912fb4714a809bd33dd319e033068ee Mon Sep 17 00:00:00 2001 From: Dmitriy Fishman Date: Fri, 1 Oct 2021 10:54:50 +0300 Subject: [PATCH 036/103] Update custom-directive.md (#1263) --- src/guide/custom-directive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/custom-directive.md b/src/guide/custom-directive.md index 47156b48dc..4d7a0a6152 100644 --- a/src/guide/custom-directive.md +++ b/src/guide/custom-directive.md @@ -214,4 +214,4 @@ app.component('my-component', { Unlike attributes, directives can't be passed to a different element with `v-bind="$attrs"`. -With [fragments](/guide/migration/fragments.html#overview) support, components can potentially have more than one root nodes. When applied to a multi-root component, directive will be ignored and the warning will be thrown. +With [fragments](/guide/migration/fragments.html#overview) support, components can potentially have more than one root node. When applied to a multi-root component, directive will be ignored and the warning will be thrown. From 4ca355fd7a640688cd21921de8fdc4eb0ca54f49 Mon Sep 17 00:00:00 2001 From: Hamid Bluri Date: Fri, 1 Oct 2021 11:25:07 +0330 Subject: [PATCH 037/103] add template refs to inaccessible data in setup (#1255) --- src/guide/composition-api-setup.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guide/composition-api-setup.md b/src/guide/composition-api-setup.md index a9791a346b..1e113308c8 100644 --- a/src/guide/composition-api-setup.md +++ b/src/guide/composition-api-setup.md @@ -115,6 +115,7 @@ In other words, you **will not have access** to the following component options: - `data` - `computed` - `methods` +- `refs` (template refs) ## Usage with Templates From 86bd604d9018f535d7cc36573e03ef625500623e Mon Sep 17 00:00:00 2001 From: wxsm Date: Wed, 6 Oct 2021 05:29:45 +0800 Subject: [PATCH 038/103] Update composition-api.md (#1266) --- src/api/composition-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/composition-api.md b/src/api/composition-api.md index f4ce05ad02..7101d40b74 100644 --- a/src/api/composition-api.md +++ b/src/api/composition-api.md @@ -109,9 +109,9 @@ A component option that is executed **before** the component is created, once th // Some reset logic } - // If you need to expose multiple properties they must all - // be included in the object passed to expose. expose can - // only be called once. + // Expose can only be called once. + // If you need to expose multiple properties, they must all + // be included in the object passed to expose. expose({ reset }) From ce2c8dd5970f5cc93182285e392ff4a8dd439543 Mon Sep 17 00:00:00 2001 From: Lucas Viana Date: Tue, 5 Oct 2021 23:50:32 -0300 Subject: [PATCH 039/103] Add missing closing parenthesis to the Vue ESM builds' descriptions (#1271) --- src/guide/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/installation.md b/src/guide/installation.md index f6c7adeaa6..ba0c63a31e 100644 --- a/src/guide/installation.md +++ b/src/guide/installation.md @@ -138,7 +138,7 @@ Global builds are not [UMD](https://github.com/umdjs/umd) builds. They are built #### `vue(.runtime).esm-browser(.prod).js`: -- For usage via native ES modules imports (in browser via ` ``` ### `entry-client.js` -The client entry creates the application using the root component factory and mounts it to the DOM: +The client entry creates the application using the `App.vue` component and mounts it to the DOM: ```js -import createApp from './app' +import { createSSRApp } from 'vue' +import App from './App.vue' // client-specific bootstrapping logic... -const { app } = createApp({ - // here we can pass additional arguments to app factory -}) +const app = createSSRApp(App) // this assumes App.vue template root element has `id="app"` app.mount('#app') @@ -122,12 +118,11 @@ app.mount('#app') The server entry uses a default export which is a function that can be called repeatedly for each render. At this moment, it doesn't do much other than returning the app instance - but later we will perform server-side route matching and data pre-fetching logic here. ```js -import createApp from './app' +import { createSSRApp } from 'vue' +import App from './App.vue' -export default function() { - const { app } = createApp({ - /*...*/ - }) +export default function () { + const app = createSSRApp(Vue) return { app From 965d3304327ded3f93aa3d18d012808aa6c99a12 Mon Sep 17 00:00:00 2001 From: Stanislav Lashmanov Date: Wed, 27 Oct 2021 07:49:51 +0300 Subject: [PATCH 046/103] Add an example on why singletones are bad (#1298) Co-authored-by: Natalia Tepluhina --- src/guide/ssr/structure.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/guide/ssr/structure.md b/src/guide/ssr/structure.md index 7c1095be20..281eb446d1 100644 --- a/src/guide/ssr/structure.md +++ b/src/guide/ssr/structure.md @@ -4,7 +4,32 @@ When writing client-only code, we can assume that our code will be evaluated in a fresh context every time. However, a Node.js server is a long-running process. When our code is first imported by the process, it will be evaluated once and then stay in memory. This means that if you create a singleton object, it will be shared between every incoming request, with the risk of cross-request state pollution. -Therefore, we need to **create a new root Vue instance for each request.** In order to do that, we need to write a factory function that can be repeatedly executed to create fresh app instances for each request, so our server code now becomes: +```js +// bad +import app from './app.js' + +server.get('*', async (req, res) => { + // the app is now shared amongst all users + const result = await renderToString(app) + // ... +}) +``` + +```js +// good +function createApp() { + return createSSRApp(/* ... */) +} + +server.get('*', async (req, res) => { + // each user gets its own app + const app = createApp() + const result = await renderToString(app) + // ... +}) +``` + +Therefore, we need to **create a new root Vue instance for each request.** In order to do that, we need to write a factory function that can be repeatedly executed to create fresh app instances for each request: ```js // server.js From ae715336503436dd9fe2971fad54d54dd098f02c Mon Sep 17 00:00:00 2001 From: Georges Gomes Date: Fri, 29 Oct 2021 17:02:42 +0200 Subject: [PATCH 047/103] Adding Components.studio and WebComponents.dev... (#1299) ... in list of Online Playgrounds. Components.studio supports standard Vue SFC component while WebComponents.dev supports Web Components wrapper via the `.ce.vue` as defined by Vue. Thanks --- src/api/sfc-tooling.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/api/sfc-tooling.md b/src/api/sfc-tooling.md index f38bc59292..bd5bdf7c72 100644 --- a/src/api/sfc-tooling.md +++ b/src/api/sfc-tooling.md @@ -10,6 +10,8 @@ You don't need to install anything on your machine to try out Vue SFCs - there a - [Vue on Repl.it](https://replit.com/@templates/VueJS-with-Vite) - [Vue on Codepen](https://codepen.io/pen/editor/vue) - [Vue on StackBlitz](https://stackblitz.com/fork/vue) +- [Vue on Components.studio](https://components.studio/create/vue3) +- [Vue on WebComponents.dev](https://webcomponents.dev/create/cevue) It is also recommended to use these online playgrounds to provide reproductions when reporting bugs. From 7607848284fb3c22565a83f44befffe491e11215 Mon Sep 17 00:00:00 2001 From: Deepansh Mathur Date: Fri, 29 Oct 2021 20:35:17 +0530 Subject: [PATCH 048/103] Update debugging-in-vscode.md (#1270) * Update debugging-in-vscode.md * DEL: removed any reference to debugger extensions --- src/cookbook/debugging-in-vscode.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/cookbook/debugging-in-vscode.md b/src/cookbook/debugging-in-vscode.md index 274831d34c..2694ce379f 100644 --- a/src/cookbook/debugging-in-vscode.md +++ b/src/cookbook/debugging-in-vscode.md @@ -6,10 +6,7 @@ This recipe shows how to debug [Vue CLI](https://github.com/vuejs/vue-cli) appli ## Prerequisites -Make sure you have VS Code and the browser of your choice installed, and the latest version of the corresponding Debugger extension installed and enabled: - -- [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) -- [Debugger for Firefox](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-firefox-debug) +Make sure you have VS Code and the browser of your choice installed. Install and create a project with the [vue-cli](https://github.com/vuejs/vue-cli), following the instructions in the [Vue CLI Guide](https://cli.vuejs.org/). Change into the newly created application directory and open VS Code. From 7a9ad0653dc3db4f600f8ec38b186563bdb13752 Mon Sep 17 00:00:00 2001 From: Leyth Adan Date: Fri, 29 Oct 2021 08:11:32 -0700 Subject: [PATCH 049/103] Fixed possessive pronouns (#1303) --- src/guide/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/introduction.md b/src/guide/introduction.md index b5d1a43fb5..a9fc1b0287 100644 --- a/src/guide/introduction.md +++ b/src/guide/introduction.md @@ -100,7 +100,7 @@ Here we're encountering something new. The `v-bind` attribute you're seeing is c ## Handling User Input -To let users interact with your app, we can use the `v-on` directive to attach event listeners that invoke methods on our instances: +To let users interact with our app, we can use the `v-on` directive to attach event listeners that invoke methods on our instances: ```html
From eef29e0d623e5426ae627dbba83ac9e22eb93409 Mon Sep 17 00:00:00 2001 From: Leyth Adan Date: Fri, 29 Oct 2021 08:13:14 -0700 Subject: [PATCH 050/103] fixed missing commas (#1302) * fixed missing commas * Update src/guide/introduction.md Co-authored-by: Natalia Tepluhina --- src/guide/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/introduction.md b/src/guide/introduction.md index a9fc1b0287..93cef89efb 100644 --- a/src/guide/introduction.md +++ b/src/guide/introduction.md @@ -96,7 +96,7 @@ Vue.createApp(AttributeBinding).mount('#bind-attribute') -Here we're encountering something new. The `v-bind` attribute you're seeing is called a **directive**. Directives are prefixed with `v-` to indicate that they are special attributes provided by Vue, and as you may have guessed, they apply special reactive behavior to the rendered DOM. Here we are basically saying "_keep this element's `title` attribute up-to-date with the `message` property on the current active instance._" +Here we're encountering something new. The `v-bind` attribute you're seeing is called a **directive**. Directives are prefixed with `v-` to indicate that they are special attributes provided by Vue, and as you may have guessed, they apply special reactive behavior to the rendered DOM. Here, we're basically saying "_keep this element's `title` attribute up-to-date with the `message` property on the current active instance._" ## Handling User Input From d026fc225da4a32236c925d1452bf0f9e1745e1f Mon Sep 17 00:00:00 2001 From: wxsm Date: Sat, 30 Oct 2021 20:25:07 +0800 Subject: [PATCH 051/103] Update introduction.md (#1306) remove strange markups --- src/guide/ssr/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/ssr/introduction.md b/src/guide/ssr/introduction.md index 86a50a4142..b8a1ee1c92 100644 --- a/src/guide/ssr/introduction.md +++ b/src/guide/ssr/introduction.md @@ -40,7 +40,7 @@ If you're using [webpack](https://webpack.js.org/), you can add prerendering wit This guide will be very in-depth and assumes you are already familiar with Vue.js itself, and have a decent working knowledge of Node.js and webpack. -[//]: # 'If you prefer a higher-level solution that provides a smooth out-of-the-box experience, you should probably give [Nuxt.js](https://nuxtjs.org/) a try. It's built upon the same Vue stack but abstracts away a lot of the boilerplate, and provides some extra features such as static site generation. However, it may not suit your use case if you need more direct control of your app's structure. Regardless, it would still be beneficial to read through this guide to understand better how things work together.' +If you prefer a higher-level solution that provides a smooth out-of-the-box experience, you should probably give [Nuxt.js](https://nuxtjs.org/) a try. It's built upon the same Vue stack but abstracts away a lot of the boilerplate, and provides some extra features such as static site generation. However, it may not suit your use case if you need more direct control of your app's structure. Regardless, it would still be beneficial to read through this guide to understand better how things work together. [//]: # 'TODO: As you read along, it would be helpful to refer to the official [HackerNews Demo](https://github.com/vuejs/vue-hackernews-2.0/), which makes use of most of the techniques covered in this guide' From f4311edd022a936e8edf9998c96815267616bf40 Mon Sep 17 00:00:00 2001 From: Miguel-Bento-Github <51338450+Miguel-Bento-Github@users.noreply.github.com> Date: Sun, 31 Oct 2021 09:08:14 +0100 Subject: [PATCH 052/103] Update deprecated app.config.isCustomElement (#1307) `app.config.isCustomElement` is deprecated and should be replaced with `app.config.compilerOptions.isCustomElement` --- src/guide/migration/custom-elements-interop.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/guide/migration/custom-elements-interop.md b/src/guide/migration/custom-elements-interop.md index 766aa3ebff..845d326a25 100644 --- a/src/guide/migration/custom-elements-interop.md +++ b/src/guide/migration/custom-elements-interop.md @@ -52,11 +52,11 @@ Vue.config.ignoredElements = ['plastic-button'] ] ``` -- If using on-the-fly template compilation, pass it via `app.config.isCustomElement`: +- If using on-the-fly template compilation, pass it via `app.config.compilerOptions.isCustomElement`: ```js const app = Vue.createApp({}) - app.config.isCustomElement = tag => tag === 'plastic-button' + app.config.compilerOptions.isCustomElement = tag => tag === 'plastic-button' ``` It's important to note the runtime config only affects runtime template compilation - it won't affect pre-compiled templates. @@ -125,6 +125,6 @@ With the behavior change of `is`, a `vue:` prefix is now required to resolve the ## Migration Strategy -- Replace `config.ignoredElements` with either `vue-loader`'s `compilerOptions` (with the build step) or `app.config.isCustomElement` (with on-the-fly template compilation) +- Replace `config.ignoredElements` with either `vue-loader`'s `compilerOptions` (with the build step) or `app.config.compilerOptions.isCustomElement` (with on-the-fly template compilation) - Change all non-`` tags with `is` usage to `` (for SFC templates) or prefix it with `vue:` (for in-DOM templates). From 5ddaf3516b4286c08fa397f4f11913c70b3e97be Mon Sep 17 00:00:00 2001 From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Wed, 3 Nov 2021 14:58:36 +0000 Subject: [PATCH 053/103] fix: use createSSRApp instead of createApp (#1311) --- src/guide/ssr/routing.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/guide/ssr/routing.md b/src/guide/ssr/routing.md index e52fd982ec..e78314bed9 100644 --- a/src/guide/ssr/routing.md +++ b/src/guide/ssr/routing.md @@ -25,14 +25,14 @@ And update our client and server entries: ```js // entry-client.js -import { createApp } from 'vue' +import { createSSRApp } from 'vue' import { createWebHistory } from 'vue-router' import createRouter from './router.js' import App from './App.vue' // ... -const app = createApp(App) +const app = createSSRApp(App) const router = createRouter(createWebHistory()) @@ -50,7 +50,7 @@ import createRouter from './router.js' import App from './App.vue' export default function () { - const app = createSSRApp(Vue) + const app = createSSRApp(App) const router = createRouter(createMemoryHistory()) app.use(router) @@ -79,16 +79,16 @@ const routes = [ ] ``` -On both client and server we need to wait for the router to resolve async route components ahead of time in order to properly invoke in-component hooks. For this we will be using [router.isReady](https://next.router.vuejs.org/api/#isready) method Let's update our client entry: +On both client and server we need to wait for the router to resolve async route components ahead of time in order to properly invoke in-component hooks. For this we will be using the [router.isReady](https://next.router.vuejs.org/api/#isready) method. Let's update our client entry: ```js // entry-client.js -import { createApp } from 'vue' +import { createSSRApp } from 'vue' import { createWebHistory } from 'vue-router' import createRouter from './router.js' import App from './App.vue' -const app = createApp(App) +const app = createSSRApp(App) const router = createRouter(createWebHistory()) From 563ed2715dabe2eedfbd521c0ceb851d969ffa6c Mon Sep 17 00:00:00 2001 From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Wed, 3 Nov 2021 14:59:22 +0000 Subject: [PATCH 054/103] docs: expand the explanation about using VNodes with (#1310) --- src/api/built-in-components.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/api/built-in-components.md b/src/api/built-in-components.md index 31b7c03c6b..0f1e4bb398 100644 --- a/src/api/built-in-components.md +++ b/src/api/built-in-components.md @@ -20,7 +20,7 @@ import { KeepAlive, Teleport, Transition, TransitionGroup } from 'vue' - **Props:** - - `is` - `string | Component` + - `is` - `string | Component | VNode` - **Usage:** @@ -41,6 +41,8 @@ import { KeepAlive, Teleport, Transition, TransitionGroup } from 'vue' ``` +- **Usage with built-in components:** + The built-in components `KeepAlive`, `Transition`, `TransitionGroup`, and `Teleport` can all be passed to `is`, but you must register them if you want to pass them by name. For example: ```js @@ -62,15 +64,15 @@ import { KeepAlive, Teleport, Transition, TransitionGroup } from 'vue' Registration is not required if you pass the component itself to `is` rather than its name. -- **key:** +- **Usage with VNodes:** -When using and passing vnode of the same type, you need to provide keys: - -```html - -``` + In advanced use cases, it can sometimes be useful to render an existing VNode via a template. Using a `` makes this possible, but it should be seen as an escape hatch, used to avoid rewriting the entire template as a `render` function. + + ```html + + ``` -Otherwise, you are passing two compiled vnodes of the same type to the renderer. Because they are compiled as completely static, they will not be updated at all. + A caveat of mixing VNodes and templates in this way is that you need to provide a suitable `key` attribute. The VNode will be considered static, so any updates will be ignored unless the `key` changes. The `key` can be on the VNode or the `` tag, but either way it must change every time you want the VNode to re-render. This caveat doesn't apply if the nodes have different types, e.g. changing a `span` to a `div`. - **See also:** [Dynamic Components](../guide/component-dynamic-async.html) From 3d84cff19037e6c95fb04f5b04f10e3ab9d31bc7 Mon Sep 17 00:00:00 2001 From: Calvin Zheng Date: Sat, 6 Nov 2021 05:15:07 +0800 Subject: [PATCH 055/103] Fix typo (#1315) When executing command `npm run build:server` got an error: "ERROR Build failed with errors." --- src/guide/ssr/structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/ssr/structure.md b/src/guide/ssr/structure.md index 281eb446d1..0a938039cd 100644 --- a/src/guide/ssr/structure.md +++ b/src/guide/ssr/structure.md @@ -147,7 +147,7 @@ import { createSSRApp } from 'vue' import App from './App.vue' export default function () { - const app = createSSRApp(Vue) + const app = createSSRApp(App) return { app From 009706511b33add39286ad423ce0fac4c937f963 Mon Sep 17 00:00:00 2001 From: Razvan Stoenescu Date: Sun, 7 Nov 2021 22:09:15 +0200 Subject: [PATCH 056/103] chore: Update partners on myself (#1318) --- src/.vuepress/components/community/team/partners.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/.vuepress/components/community/team/partners.js b/src/.vuepress/components/community/team/partners.js index 5e1dd97968..2caeb13211 100644 --- a/src/.vuepress/components/community/team/partners.js +++ b/src/.vuepress/components/community/team/partners.js @@ -211,15 +211,14 @@ export default shuffle([ github: 'rstoenescu', twitter: 'quasarframework', work: { - role: 'Developer', + role: 'Author', org: 'Quasar Framework', - orgUrl: 'http://quasar-framework.org/' + orgUrl: 'http://quasar.dev/' }, reposPersonal: [ - 'quasarframework/quasar', - 'quasarframework/quasar-cli', - 'quasarframework/quasar-play' - ] + 'quasarframework/quasar' + ], + links: ['https://quasar.dev/'] }, { name: 'Jilson Thomas', From 4fae0d0d6539f58ef952ad0d6c9d21d7d61fd135 Mon Sep 17 00:00:00 2001 From: Daniel Kelly Date: Tue, 9 Nov 2021 19:51:22 -0600 Subject: [PATCH 057/103] =?UTF-8?q?add=20vue=20school=20links=20to=20suppl?= =?UTF-8?q?ement=20component=20documentation=20with=20video=E2=80=A6=20(#1?= =?UTF-8?q?119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add vue school links to supplement component documentation with video courses * link sfc doc to sfc intro lesson instead of course since only first lesson is free --- src/guide/component-basics.md | 2 ++ src/guide/component-props.md | 2 ++ src/guide/component-registration.md | 2 ++ src/guide/component-slots.md | 2 ++ src/guide/single-file-component.md | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/guide/component-basics.md b/src/guide/component-basics.md index fa9f4312dc..9d647f4c71 100644 --- a/src/guide/component-basics.md +++ b/src/guide/component-basics.md @@ -1,5 +1,7 @@ # Components Basics +Learn component basics with a free video course on Vue School + ## Base Example Here's an example of a Vue component: diff --git a/src/guide/component-props.md b/src/guide/component-props.md index 94e9505f82..c38a42dad2 100644 --- a/src/guide/component-props.md +++ b/src/guide/component-props.md @@ -2,6 +2,8 @@ > This page assumes you've already read the [Components Basics](component-basics.md). Read that first if you are new to components. +Learn how component props work with a free lesson on Vue School + ## Prop Types So far, we've only seen props listed as an array of strings: diff --git a/src/guide/component-registration.md b/src/guide/component-registration.md index 0f561af5df..d7c17eb642 100644 --- a/src/guide/component-registration.md +++ b/src/guide/component-registration.md @@ -1,5 +1,7 @@ # Component Registration +Learn how component registration works with a free lesson on Vue School + > This page assumes you've already read the [Components Basics](component-basics.md). Read that first if you are new to components. ## Component Names diff --git a/src/guide/component-slots.md b/src/guide/component-slots.md index 154d4f8a8d..8c62adcbbf 100644 --- a/src/guide/component-slots.md +++ b/src/guide/component-slots.md @@ -2,6 +2,8 @@ > This page assumes you've already read the [Components Basics](component-basics.md). Read that first if you are new to components. +Learn slot basics with a free lesson on Vue School + ## Slot Content Vue implements a content distribution API inspired by the [Web Components spec draft](https://github.com/w3c/webcomponents/blob/gh-pages/proposals/Slots-Proposal.md), using the `` element to serve as distribution outlets for content. diff --git a/src/guide/single-file-component.md b/src/guide/single-file-component.md index 5078f7823a..55c7b8a07a 100644 --- a/src/guide/single-file-component.md +++ b/src/guide/single-file-component.md @@ -1,5 +1,7 @@ # Single File Components +Learn about single file components with a free video lesson on Vue School + ## Introduction Vue Single File Components (aka `*.vue` files, abbreviated as **SFC**) is a special file format that allows us to encapsulate the template, logic, **and** styling of a Vue component in a single file. Here's an example SFC: From 3c97d52e2cb457fd2208133be316a185843dd57c Mon Sep 17 00:00:00 2001 From: Xuqian Date: Wed, 10 Nov 2021 13:39:38 +0800 Subject: [PATCH 058/103] Update description about .number modifier (#1285) * Update description about .number modifier * Update src/guide/forms.md Co-authored-by: Natalia Tepluhina --- src/guide/forms.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/guide/forms.md b/src/guide/forms.md index d32402cb2e..41571c86a3 100644 --- a/src/guide/forms.md +++ b/src/guide/forms.md @@ -269,10 +269,10 @@ By default, `v-model` syncs the input with the data after each `input` event (wi If you want user input to be automatically typecast as a number, you can add the `number` modifier to your `v-model` managed inputs: ```html - + ``` -This is often useful, because even with `type="number"`, the value of HTML input elements always returns a string. If the value cannot be parsed with `parseFloat()`, then the original value is returned. +This is often useful when the input type is `text`. If the input type is `number`, Vue can automatically convert the raw string value to a number, and you don't need to add the `.number` modifier to `v-model`. If the value cannot be parsed with `parseFloat()`, then the original value is returned. ### `.trim` From 45b9049d4c5382c60f58c6c3a80a767446bb87d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20L=C3=BCnborg?= Date: Wed, 10 Nov 2021 06:40:25 +0100 Subject: [PATCH 059/103] fix: Explain usage of custom directives with script-setup (#1319) * fix: Explain usage of custom directives with script-setup * Update src/api/sfc-script-setup.md Co-authored-by: skirtle <65301168+skirtles-code@users.noreply.github.com> * Update src/api/sfc-script-setup.md Co-authored-by: skirtle <65301168+skirtles-code@users.noreply.github.com> Co-authored-by: skirtle <65301168+skirtles-code@users.noreply.github.com> --- src/api/sfc-script-setup.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/api/sfc-script-setup.md b/src/api/sfc-script-setup.md index cfb7b2b3c6..4d7d4e55aa 100644 --- a/src/api/sfc-script-setup.md +++ b/src/api/sfc-script-setup.md @@ -131,6 +131,31 @@ import * as Form from './form-components' ``` +## Using Custom Directives + +Globally registered custom directives just work as expected, and local ones can be used directly in the template, much like we explained above for components. + +But there's one restriction to be aware of: You must name local custom directives according to the following schema: `vNameOfDirective` in order for them to be directly usable in the template. + +```html + + +``` +```html + +``` + ## `defineProps` and `defineEmits` To declare `props` and `emits` in ` + + diff --git a/src/.vuepress/theme/components/BannerTop.vue b/src/.vuepress/theme/components/BannerTop.vue index 6e18821d4a..db0688dbda 100644 --- a/src/.vuepress/theme/components/BannerTop.vue +++ b/src/.vuepress/theme/components/BannerTop.vue @@ -1,40 +1,47 @@ + + diff --git a/src/.vuepress/theme/components/BannerTop.vue b/src/.vuepress/theme/components/BannerTop.vue index 87c0f0684d..6e3e1a9eba 100644 --- a/src/.vuepress/theme/components/BannerTop.vue +++ b/src/.vuepress/theme/components/BannerTop.vue @@ -10,12 +10,13 @@ Access to all Vue Courses at Vue School
- Black Friday 40% OFF + Cyber Monday 40% OFF - Closes Soon
Get Discount
+ Extended
Close @@ -55,7 +56,11 @@ $topBannerHeightMobile ?= 5rem z-index: 100 line-height: 1 height: $topBannerHeightMobile + background-image: url(http://github.com/images/vueschool/vueschool_banner_mobile.png) + background-size: cover + background-repeat: no-repeat @media (min-width: 680px) + background-image: none height: $topBannerHeight justify-content: center @@ -65,8 +70,10 @@ $topBannerHeightMobile ?= 5rem background: linear-gradient(261deg, #e61463 100%, #db5248 3%) .vs-core - display: flex - align-items: center + display: none + @media (min-width: 680px) + align-items: center + display: flex .vs-slogan font-family: Archivo @@ -100,13 +107,19 @@ $topBannerHeightMobile ?= 5rem @media (min-width: 680px) margin-right: 0 padding: 8px 24px - margin-left: 32px - @media (min-width: 680px) + margin-left: 20px + @media (min-width: 1024px) margin-left: 69px + .vs-tag + margin-left: 10px + @media (min-width: 1024px) + margin-left: 30px + .vs-close right: 6px position: absolute + z-index: 10 @media (min-width: 680px) padding: 10px right: 20px From 56eff3442fbc4e2250e83041b5ed9d0544f670f2 Mon Sep 17 00:00:00 2001 From: Simon Legner Date: Tue, 30 Nov 2021 20:43:17 +0100 Subject: [PATCH 073/103] docs: add indonesia translation url (#1357) --- .../components/guide/contributing/translations-data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/.vuepress/components/guide/contributing/translations-data.js b/src/.vuepress/components/guide/contributing/translations-data.js index 82b5ba206b..aef5d0ef29 100644 --- a/src/.vuepress/components/guide/contributing/translations-data.js +++ b/src/.vuepress/components/guide/contributing/translations-data.js @@ -13,7 +13,7 @@ export const labels = { export const repos = [ { lang: 'en-us', owner: 'vuejs', repo: 'docs', branch: 'master', url: 'https://v3.vuejs.org/' }, { lang: 'fr', owner: 'demahom18', repo: 'docs-next', branch: 'master', url: 'https://vue3-fr.netlify.app/' }, - { lang: 'id', owner: 'vuejs-id', repo: 'docs-next', branch: 'indonesian' }, + { lang: 'id', owner: 'vuejs-id', repo: 'docs-next', branch: 'indonesian', url: 'https://v3-vuejsid-docs.netlify.app/' }, { lang: 'ja', owner: 'vuejs-jp', repo: 'ja.vuejs.org', branch: 'lang-ja', url: 'https://v3.ja.vuejs.org/' }, { lang: 'ko', owner: 'vuejs-kr', repo: 'docs-next', branch: 'rootKoKr', url: 'https://v3.ko.vuejs.org/' }, { lang: 'pt-br', owner: 'vuejs-br', repo: 'docs-next', branch: 'master', url: 'https://vuejsbr-docs-next.netlify.app/' }, From 334ea378617b385c886a84d30132d5bf9e79bb87 Mon Sep 17 00:00:00 2001 From: wxsm Date: Wed, 1 Dec 2021 03:50:53 +0800 Subject: [PATCH 074/103] update transitions-overview.md (#1352) --- src/guide/transitions-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guide/transitions-overview.md b/src/guide/transitions-overview.md index eb98a33ee0..a1f772b961 100644 --- a/src/guide/transitions-overview.md +++ b/src/guide/transitions-overview.md @@ -176,7 +176,7 @@ Easing can also convey the quality of material being animated. Take this pen for -You can get a lot of unique effects and make your animation very stylish by adjusting your easing. CSS allows you to modify this by adjusting a cubic bezier property, [this playground](https://cubic-bezier.com/#.17,.67,.83,.67) by Lea Verou is very helpful for exploring this. +You can get a lot of unique effects and make your animation very stylish by adjusting your easing. CSS allows you to modify this by adjusting a cubic-bezier property, [this playground](https://cubic-bezier.com/#.17,.67,.83,.67) by Lea Verou is very helpful for exploring this. Though you can achieve great effects for simple animation with the two handles the cubic-bezier ease offers, JavaScript allows multiple handles, and therefore, allows for much more variance. From 12071a76f3fb83d12c5401a877c19ff9ede67234 Mon Sep 17 00:00:00 2001 From: wxsm Date: Wed, 1 Dec 2021 17:12:09 +0800 Subject: [PATCH 075/103] use camelCase (#1338) --- src/guide/component-custom-events.md | 2 +- src/guide/migration/vnode-lifecycle-events.md | 2 +- src/guide/render-function.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/guide/component-custom-events.md b/src/guide/component-custom-events.md index 68d340d405..4b91982257 100644 --- a/src/guide/component-custom-events.md +++ b/src/guide/component-custom-events.md @@ -4,7 +4,7 @@ ## Event Names -Like components and props, event names provide an automatic case transformation. If you emit an event from the child component in camel case, you will be able to add a kebab-cased listener in the parent: +Like components and props, event names provide an automatic case transformation. If you emit an event from the child component in camelCase, you will be able to add a kebab-cased listener in the parent: ```js this.$emit('myEvent') diff --git a/src/guide/migration/vnode-lifecycle-events.md b/src/guide/migration/vnode-lifecycle-events.md index 25202ae338..8ad0b231b9 100644 --- a/src/guide/migration/vnode-lifecycle-events.md +++ b/src/guide/migration/vnode-lifecycle-events.md @@ -31,7 +31,7 @@ In Vue 3, the event name is prefixed with `vnode-`: ``` -Or just `vnode` if you're using camel case: +Or just `vnode` if you're using camelCase: ```html