Options API: Kompozice
provide
Poskytujte hodnoty, které mohou být implementovány potomky komponent.
Typ
tsinterface ComponentOptions { provide?: object | ((this: ComponentPublicInstance) => object) }
Podrobnosti
provide
ainject
se používají společně, aby umožnili komponentě předka fungovat jako injektor závislostí pro všechny své potomky, bez ohledu na to, jak hluboká je hierarchie komponent, dokud jsou ve stejném rodičovském řetězci.Volba
provide
by měla být buď objekt nebo funkce, která vrací objekt. Tento objekt obsahuje vlastnosti, které jsou dostupné pro vkládání do komponent potomků. V tomto objektu můžete použít klíče typu Symbol.Příklad
Základní použití:
jsconst s = Symbol() export default { provide: { foo: 'foo', [s]: 'bar' } }
Použití funkce pro poskytování stavu pro každou komponentu:
jsexport default { data() { return { msg: 'foo' } } provide() { return { msg: this.msg } } }
Mějte na paměti, že výše uvedená poskytnutá hodnota
msg
nebude reaktivní. Pro více informací se podívejte na Práci s reaktivitou.Viz také: Provide / Inject
inject
Deklaruje vlastnosti, které se mají implementovat do aktuální komponenty vyhledáváním z poskytovatelů v hierarchii předků.
Typ
tsinterface ComponentOptions { inject?: ArrayInjectOptions | ObjectInjectOptions } type ArrayInjectOptions = string[] type ObjectInjectOptions = { [key: string | symbol]: | string | symbol | { from?: string | symbol; default?: any } }
Podrobnosti
Volba
inject
by měla být buď:- Pole řetězců, nebo
- Objekt, kde klíče jsou názvy místních vazeb a hodnota je buď:
- Klíč (string nebo Symbol), který se má vyhledat v dostupných injections, nebo
- Objekt, kde:
- Vlastnost
from
je klíč (string nebo Symbol), který se má vyhledat v dostupných injections, a - Vlastnost
default
se používá jako fallback hodnota. Podobně jako u výchozích hodnot props, pro objektové typy je třeba použít tovární funkci, aby se zabránilo sdílení hodnot mezi více instancemi komponent.
- Vlastnost
Implementovaná vlastnost bude
undefined
, pokud nebyla poskytnuta odpovídající vlastnost ani výchozí hodnota.Všimněte si, že vazby implemetovaných hodnot nejsou reaktivní. To je záměrné. Nicméně, pokud je vložená hodnota reaktivní objekt, vlastnosti tohoto objektu zůstávají reaktivní. Pro více informací se podívejte na Práci s reaktivitou.
Příklad
Základní použití:
jsexport default { inject: ['foo'], created() { console.log(this.foo) } }
Použití implementované hodnoty jako výchozí hodnoty pro vlastnost (prop):
jsconst Child = { inject: ['foo'], props: { bar: { default() { return this.foo } } } }
Použití implementované hodnoty jako vstupu do dat:
jsconst Child = { inject: ['foo'], data() { return { bar: this.foo } } }
Implementace může být volitelná s výchozí hodnotou:
jsconst Child = { inject: { foo: { default: 'foo' } } }
Pokud je třeba implementovat hodnotu z vlastnosti s jiným názvem, použijte pro označení zdrojové vlastnosti
from
:jsconst Child = { inject: { foo: { from: 'bar', default: 'foo' } } }
Podobně jako u výchozích hodnot vlastností, pro neprimitivní hodnoty je třeba použít tovární funkci:
jsconst Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }
Viz také: Provide / Inject
mixins
Pole objektů s možnostmi (options), které se mají smíchat do aktuální komponenty.
Typ
tsinterface ComponentOptions { mixins?: ComponentOptions[] }
Detaily
Volba
mixins
přijímá pole mixin objektů. Tyto objekty mohou obsahovat volby instance (instance options) jako normální objekty instance (instance objects) a budou sloučeny do konečné podoby pomocí určité logiky sloučení volby. Například, pokud váš mixin obsahujecreated
hook a sama komponenta také, budou volány obě funkce.Hooks pro mixins jsou volány v pořadí, v jakém jsou poskytnuty, a před hooks samotného komponentu.
Už není doporučeno
V Vue 2 byly mixinové funkce hlavním mechanismem pro vytváření znovupoužitelných částí logiky komponenty. Ačkoli jsou mixinové funkce ve Vue 3 nadále podporovány, nyní jsou preferovaným přístupem pro znovupoužití kódu mezi komponentami composable funkce pomocí Composition API.
- Příklad
jsconst mixin = { created() { console.log(1) } } createApp({ created() { console.log(2) }, mixins: [mixin] }) // => 1 // => 2
extends
„Základní třída“ komponenty, ze které se dědí.
- Typ
ts
interface ComponentOptions {
extends?: ComponentOptions
}
Detaily
Umožňuje jedné komponentě rozšířit jinou a zdědit její možnosti.
Z implementačního hlediska je
extends
téměř identické jakomixins
. S komponentou specifikovanou pomocíextends
bude zacházeno tak, jako by byla prvním mixinem.Nicméně,
extends
amixins
vyjadřují různé záměry. Volbamixins
se především používá k sestavování částí funkcionality, zatímcoextends
se především zabývá dědičností.Stejně jako u
mixins
budou jakékoli možnosti (kroměsetup()
) sloučeny pomocí příslušné strategie pro sloučení.Příklad
js
const CompA = { ... }
const CompB = {
extends: CompA,
...
}
Nedoporučeno pro Composition API
extends
je navrženo pro Options API a neřeší sloučení hooku setup()
.
V Composition API je preferovaný mentální model pro znovupoužití logiky „kompozice“ před „dědičností“. Pokud máte logiku z komponenty, kterou chcete znovu použít v jiné komponentě, zvažte extrakci příslušné logiky do composable objektu.
Pokud stále chcete „rozšířit“ komponentu pomocí Composition API, můžete zavolat setup()
základní komponenty v setup()
rozšiřující komponenty:
js
import Base from './Base.js'
export default {
extends: Base,
setup(props, ctx) {
return {
...Base.setup(props, ctx),
// místní vazby
}
}
}