Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nuxt-community/nuxt-property-decorator

Property decorators for Nuxt (base on vue-property-decorator)
https://github.com/nuxt-community/nuxt-property-decorator

nuxt nuxt-decorators vue vue-decorators

Last synced: about 4 hours ago
JSON representation

Property decorators for Nuxt (base on vue-property-decorator)

Awesome Lists containing this project

README

        

# Nuxt Property Decorator













Handy ES / TypeScript decorators for class-style Vue components in Nuxt (based on [Vue class component](https://github.com/vuejs/vue-class-component)) and Property decorators for Vue (bases on [Vue Property Decorator](https://github.com/kaorun343/vue-property-decorator)) and Vuex (based on [Vuex Class](https://github.com/ktsn/vuex-class/))

This library fully depends on [vue-class-component](https://github.com/vuejs/vue-class-component).

## License

MIT License

## Install

Installation is very easy

```bash
npm i -S nuxt-property-decorator
```

or

```bash
yarn add nuxt-property-decorator
```

### Nuxt JS Instructions

It works out of the box with Nuxt JS.

### Nuxt TS Instructions

It works out of the box with Nuxt TS.

## Decorators and helpers

There are following decorators:

- **Nuxt specific decorators**
- `@Off` - decorator of \$off
- `@On`- decorator of \$on
- `@Once`- decorator of \$once
- `@NextTick` -decorator of \$nextTick

- **exported from** [`vue-class-component`](https://github.com/vuejs/vue-class-component)
- `@Component`
- **exported from** [`vue-property-decorator`](https://github.com/kaorun343/vue-property-decorator)

- [`@Emit`](https://github.com/kaorun343/vue-property-decorator/#Emit)
- [`@Inject`](https://github.com/kaorun343/vue-property-decorator/#Provide)
- [`@InjectReactive`](https://github.com/kaorun343/vue-property-decorator/#ProvideReactive)
- [`@Model`](https://github.com/kaorun343/vue-property-decorator/#Model)
- [`@ModelSync`](https://github.com/kaorun343/vue-property-decorator#-modelsyncpropname-string-event-string-options-propoptions--constructor--constructor---decorator)
- [`@Prop`](https://github.com/kaorun343/vue-property-decorator/#Prop)
- [`@PropSync`](https://github.com/kaorun343/vue-property-decorator/#PropSync)
- [`@Provide`](https://github.com/kaorun343/vue-property-decorator/#Provide)
- [`@ProvideReactive`](https://github.com/kaorun343/vue-property-decorator/#ProvideReactive)
- [`@Ref`](https://github.com/kaorun343/vue-property-decorator/#Ref)
- [`@VModel`](https://github.com/kaorun343/vue-property-decorator#-vmodelpropsargs-propoptions-decorator)
- [`@Watch`](https://github.com/kaorun343/vue-property-decorator/#Watch)

- **exported from** [`vuex-class`](https://github.com/ktsn/vuex-class)

- `@State`
- `@Getter`
- `@Action`
- `@Mutation`

- **exported from** [`vuex-module-decorators`](https://github.com/championswimmer/vuex-module-decorators)
- Module,
- getModule,
- VuexModule,
- VuexMutation (`Mutation` from original renamed to avoid conflict with 'vuex-class' one),
- MutationAction,
- VuexAction (`Action` from original renamed to avoid conflict with 'vuex-class' one),

### Other exports

- `namespace `
- `mixins`
- `Vue`

## Hooks

### Vue Router hooks

- `beforeRouteEnter`
- `beforeRouteUpdate`
- `beforeRouteLeave`

### Nuxt hooks

- `asyncData`
- `fetch`
- `fetchOnServer`
- `head`
- `key`
- `layout`
- `loading`
- `middleware`
- `scrollToTop`
- `transition`
- `validate`
- `watchQuery`
- `meta`

### Vue-class Hooks

- `data`
- `beforeCreate`
- `created`
- `beforeMount`
- `mounted`
- `beforeDestroy`
- `destroyed`
- `beforeUpdate`
- `updated`
- `activated`
- `deactivated`
- `render`
- `errorCaptured`
- `serverPrefetch`

## Usage

```typescript
import {
Component,
Inject,
Model,
Prop,
Provide,
Vue,
Watch,
} from "nuxt-property-decorator"

const s = Symbol("baz")

@Component({
components: { comp },
})
export class MyComponent extends Vue {
@Inject() foo!: string
@Inject("bar") bar!: string
@Inject(s) baz!: string

@Model("change") checked!: boolean

@Prop()
propA!: number

@Prop({ default: "default value" })
propB!: string

@Prop([String, Boolean])
propC!: string | boolean

@Prop({ type: null })
propD!: any

@Provide() foo = "foo"
@Provide("bar") baz = "bar"

@Watch("child")
onChildChanged(val: string, oldVal: string) {}

@Watch("person", { immediate: true, deep: true })
onPersonChanged(val: Person, oldVal: Person) {}

beforeRouteLeave(to, from, next) {
// called when the route that renders this component is about to
// be navigated away from.
// has access to `this` component instance.
}
}
```

is equivalent to

```js
const s = Symbol("baz")

export const MyComponent = Vue.extend({
name: "MyComponent",
components: { comp },
inject: {
foo: "foo",
bar: "bar",
[s]: s,
},
model: {
prop: "checked",
event: "change",
},
props: {
checked: Boolean,
propA: Number,
propB: {
type: String,
default: "default value",
},
propC: [String, Boolean],
propD: { type: null },
},
data() {
return {
foo: "foo",
baz: "bar",
}
},
provide() {
return {
foo: this.foo,
bar: this.baz,
}
},
methods: {
onChildChanged(val, oldVal) {},
onPersonChanged(val, oldVal) {},
},
beforeRouteLeave(to, from, next) {
// called when the route that renders this component is about to
// be navigated away from.
// has access to `this` component instance.
},
watch: {
child: {
handler: "onChildChanged",
immediate: false,
deep: false,
},
person: {
handler: "onPersonChanged",
immediate: true,
deep: true,
},
},
})
```

As you can see at `propA` and `propB`, the type can be inferred automatically when it's a simple type. For more complex types like enums you do need to specify it specifically.
Also this library needs to have `emitDecoratorMetadata` set to `true` for this to work.

## Useful links

See also:

- [Vue Property Decorator](https://github.com/kaorun343/vue-property-decorator)
- [Vue class component](https://github.com/vuejs/vue-class-component)
- [Vuex Class](https://github.com/ktsn/vuex-class/)
- [Nuxt Class Component](https://github.com/nuxt-community/nuxt-class-component)