options-test.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import Vue from "../index";
  2. import { AsyncComponent, ComponentOptions, FunctionalComponentOptions } from "../index";
  3. import { CreateElement } from "../vue";
  4. interface Component extends Vue {
  5. a: number;
  6. }
  7. Vue.component('sub-component', {
  8. components: {
  9. a: Vue.component(""),
  10. b: {}
  11. }
  12. });
  13. Vue.component('prop-component', {
  14. props: {
  15. size: Number,
  16. name: {
  17. type: String,
  18. default: '0',
  19. required: true,
  20. }
  21. },
  22. data() {
  23. return {
  24. fixedSize: this.size.toFixed(),
  25. capName: this.name.toUpperCase()
  26. }
  27. }
  28. });
  29. Vue.component('string-prop', {
  30. props: ['size', 'name'],
  31. data() {
  32. return {
  33. fixedSize: this.size.whatever,
  34. capName: this.name.isany
  35. }
  36. }
  37. });
  38. class User {
  39. private u: number
  40. }
  41. class Cat {
  42. private u: number
  43. }
  44. Vue.component('union-prop', {
  45. props: {
  46. primitive: [String, Number],
  47. object: [Cat, User],
  48. regex: RegExp,
  49. mixed: [RegExp, Array],
  50. union: [User, Number] as {new(): User | Number}[] // requires annotation
  51. },
  52. data() {
  53. this.primitive;
  54. this.object;
  55. this.union;
  56. this.regex.compile;
  57. this.mixed;
  58. return {
  59. fixedSize: this.union,
  60. }
  61. }
  62. });
  63. Vue.component('component', {
  64. data() {
  65. this.$mount
  66. this.size
  67. return {
  68. a: 1
  69. }
  70. },
  71. props: {
  72. size: Number,
  73. name: {
  74. type: String,
  75. default: '0',
  76. required: true,
  77. }
  78. },
  79. propsData: {
  80. msg: "Hello"
  81. },
  82. computed: {
  83. aDouble(): number {
  84. return this.a * 2;
  85. },
  86. aPlus: {
  87. get(): number {
  88. return this.a + 1;
  89. },
  90. set(v: number) {
  91. this.a = v - 1;
  92. },
  93. cache: false
  94. }
  95. },
  96. methods: {
  97. plus() {
  98. this.a++;
  99. this.aDouble.toFixed();
  100. this.aPlus = 1;
  101. this.size.toFixed();
  102. }
  103. },
  104. watch: {
  105. 'a': function(val: number, oldVal: number) {
  106. console.log(`new: ${val}, old: ${oldVal}`);
  107. },
  108. 'b': 'someMethod',
  109. 'c': {
  110. handler(val, oldVal) {
  111. this.a = val
  112. },
  113. deep: true
  114. }
  115. },
  116. el: "#app",
  117. template: "<div>{{ message }}</div>",
  118. render(createElement) {
  119. return createElement("div", {
  120. attrs: {
  121. id: "foo"
  122. },
  123. props: {
  124. myProp: "bar"
  125. },
  126. domProps: {
  127. innerHTML: "baz"
  128. },
  129. on: {
  130. click: new Function
  131. },
  132. nativeOn: {
  133. click: new Function
  134. },
  135. class: {
  136. foo: true,
  137. bar: false
  138. },
  139. style: {
  140. color: 'red',
  141. fontSize: '14px'
  142. },
  143. key: 'myKey',
  144. ref: 'myRef'
  145. }, [
  146. createElement(),
  147. createElement("div", "message"),
  148. createElement(Vue.component("component")),
  149. createElement({} as ComponentOptions<Vue>),
  150. createElement({
  151. functional: true,
  152. render(c: CreateElement) {
  153. return createElement()
  154. }
  155. }),
  156. createElement(() => Vue.component("component")),
  157. createElement(() => ( {} as ComponentOptions<Vue> )),
  158. createElement((resolve, reject) => {
  159. resolve({} as ComponentOptions<Vue>);
  160. reject();
  161. }),
  162. "message",
  163. [createElement("div", "message")]
  164. ]);
  165. },
  166. staticRenderFns: [],
  167. beforeCreate() {
  168. (this as any).a = 1;
  169. },
  170. created() {},
  171. beforeDestroy() {},
  172. destroyed() {},
  173. beforeMount() {},
  174. mounted() {},
  175. beforeUpdate() {},
  176. updated() {},
  177. activated() {},
  178. deactivated() {},
  179. errorCaptured() {
  180. return true
  181. },
  182. directives: {
  183. a: {
  184. bind() {},
  185. inserted() {},
  186. update() {},
  187. componentMounted() {},
  188. unbind() {}
  189. },
  190. b(el, binding, vnode, oldVnode) {
  191. el.textContent;
  192. binding.name;
  193. binding.value;
  194. binding.oldValue;
  195. binding.expression;
  196. binding.arg;
  197. binding.modifiers["modifier"];
  198. }
  199. },
  200. components: {
  201. a: Vue.component(""),
  202. b: {} as ComponentOptions<Vue>
  203. },
  204. transitions: {},
  205. filters: {
  206. double(value: number) {
  207. return value * 2;
  208. }
  209. },
  210. parent: new Vue,
  211. mixins: [Vue.component(""), ({} as ComponentOptions<Vue>)],
  212. name: "Component",
  213. extends: {} as ComponentOptions<Vue>,
  214. delimiters: ["${", "}"]
  215. });
  216. Vue.component('provide-inject', {
  217. provide: {
  218. foo: 1
  219. },
  220. inject: {
  221. injectFoo: 'foo',
  222. injectBar: Symbol(),
  223. injectBaz: { from: 'baz' },
  224. injectQux: { default: 1 },
  225. injectQuux: { from: 'quuz', default: () => ({ value: 1 })}
  226. }
  227. })
  228. Vue.component('provide-function', {
  229. provide: () => ({
  230. foo: 1
  231. })
  232. })
  233. Vue.component('component-with-scoped-slot', {
  234. render (h) {
  235. interface ScopedSlotProps {
  236. msg: string
  237. }
  238. return h('div', [
  239. h('child', [
  240. // default scoped slot as children
  241. (props: ScopedSlotProps) => [h('span', [props.msg])]
  242. ]),
  243. h('child', {
  244. scopedSlots: {
  245. // named scoped slot as vnode data
  246. item: (props: ScopedSlotProps) => [h('span', [props.msg])]
  247. }
  248. })
  249. ])
  250. },
  251. components: {
  252. child: {
  253. render (this: Vue, h: CreateElement) {
  254. return h('div', [
  255. this.$scopedSlots['default']({ msg: 'hi' }),
  256. this.$scopedSlots['item']({ msg: 'hello' })
  257. ])
  258. }
  259. }
  260. }
  261. })
  262. Vue.component('functional-component', {
  263. props: ['prop'],
  264. functional: true,
  265. inject: ['foo'],
  266. render(createElement, context) {
  267. context.props;
  268. context.children;
  269. context.slots();
  270. context.data;
  271. context.parent;
  272. return createElement("div", {}, context.children);
  273. }
  274. });
  275. Vue.component('functional-component-object-inject', {
  276. functional: true,
  277. inject: {
  278. foo: 'foo',
  279. bar: Symbol(),
  280. baz: { from: 'baz' },
  281. qux: { default: 1 },
  282. quux: { from: 'quuz', default: () => ({ value: 1 })}
  283. },
  284. render(h) {
  285. return h('div')
  286. }
  287. })
  288. Vue.component("async-component", ((resolve, reject) => {
  289. setTimeout(() => {
  290. resolve(Vue.component("component"));
  291. }, 0);
  292. return new Promise((resolve) => {
  293. resolve({ functional: true });
  294. })
  295. }));
  296. Vue.component('async-es-module-component', () => import('./es-module'))