import Vue from "../index"; import { AsyncComponent, ComponentOptions, FunctionalComponentOptions } from "../index"; import { CreateElement } from "../vue"; interface Component extends Vue { a: number; } Vue.component('sub-component', { components: { a: Vue.component(""), b: {} } }); Vue.component('prop-component', { props: { size: Number, name: { type: String, default: '0', required: true, } }, data() { return { fixedSize: this.size.toFixed(), capName: this.name.toUpperCase() } } }); Vue.component('string-prop', { props: ['size', 'name'], data() { return { fixedSize: this.size.whatever, capName: this.name.isany } } }); class User { private u: number } class Cat { private u: number } Vue.component('union-prop', { props: { primitive: [String, Number], object: [Cat, User], regex: RegExp, mixed: [RegExp, Array], union: [User, Number] as {new(): User | Number}[] // requires annotation }, data() { this.primitive; this.object; this.union; this.regex.compile; this.mixed; return { fixedSize: this.union, } } }); Vue.component('component', { data() { this.$mount this.size return { a: 1 } }, props: { size: Number, name: { type: String, default: '0', required: true, } }, propsData: { msg: "Hello" }, computed: { aDouble(): number { return this.a * 2; }, aPlus: { get(): number { return this.a + 1; }, set(v: number) { this.a = v - 1; }, cache: false } }, methods: { plus() { this.a++; this.aDouble.toFixed(); this.aPlus = 1; this.size.toFixed(); } }, watch: { 'a': function(val: number, oldVal: number) { console.log(`new: ${val}, old: ${oldVal}`); }, 'b': 'someMethod', 'c': { handler(val, oldVal) { this.a = val }, deep: true } }, el: "#app", template: "
{{ message }}
", render(createElement) { return createElement("div", { attrs: { id: "foo" }, props: { myProp: "bar" }, domProps: { innerHTML: "baz" }, on: { click: new Function }, nativeOn: { click: new Function }, class: { foo: true, bar: false }, style: { color: 'red', fontSize: '14px' }, key: 'myKey', ref: 'myRef' }, [ createElement(), createElement("div", "message"), createElement(Vue.component("component")), createElement({} as ComponentOptions), createElement({ functional: true, render(c: CreateElement) { return createElement() } }), createElement(() => Vue.component("component")), createElement(() => ( {} as ComponentOptions )), createElement((resolve, reject) => { resolve({} as ComponentOptions); reject(); }), "message", [createElement("div", "message")] ]); }, staticRenderFns: [], beforeCreate() { (this as any).a = 1; }, created() {}, beforeDestroy() {}, destroyed() {}, beforeMount() {}, mounted() {}, beforeUpdate() {}, updated() {}, activated() {}, deactivated() {}, directives: { a: { bind() {}, inserted() {}, update() {}, componentMounted() {}, unbind() {} }, b(el, binding, vnode, oldVnode) { el.textContent; binding.name; binding.value; binding.oldValue; binding.expression; binding.arg; binding.modifiers["modifier"]; } }, components: { a: Vue.component(""), b: {} as ComponentOptions }, transitions: {}, filters: { double(value: number) { return value * 2; } }, parent: new Vue, mixins: [Vue.component(""), ({} as ComponentOptions)], name: "Component", extends: {} as ComponentOptions, delimiters: ["${", "}"] }); Vue.component('component-with-scoped-slot', { render (h) { interface ScopedSlotProps { msg: string } return h('div', [ h('child', [ // default scoped slot as children (props: ScopedSlotProps) => [h('span', [props.msg])] ]), h('child', { scopedSlots: { // named scoped slot as vnode data item: (props: ScopedSlotProps) => [h('span', [props.msg])] } }) ]) }, components: { child: { render (this: Vue, h: CreateElement) { return h('div', [ this.$scopedSlots['default']({ msg: 'hi' }), this.$scopedSlots['item']({ msg: 'hello' }) ]) } } } }) Vue.component('functional-component', { props: ['prop'], functional: true, inject: ['foo'], render(createElement, context) { context.props; context.children; context.slots(); context.data; context.parent; return createElement("div", {}, context.children); } }); Vue.component('functional-component-object-inject', { functional: true, inject: { foo: 'bar', baz: Symbol() }, render(h) { return h('div') } }) Vue.component("async-component", ((resolve, reject) => { setTimeout(() => { resolve(Vue.component("component")); }, 0); return new Promise((resolve) => { resolve({ functional: true }); }) })); Vue.component('async-es-module-component', () => import('./es-module'))