]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: adjust render fn signature
authorEvan You <yyx990803@gmail.com>
Wed, 3 Oct 2018 17:00:13 +0000 (13:00 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 3 Oct 2018 17:00:13 +0000 (13:00 -0400)
packages/core/__tests__/attrsFallthrough.spec.ts
packages/core/src/component.ts
packages/core/src/componentOptions.ts
packages/core/src/componentUtils.ts
packages/core/src/createRenderer.ts
packages/core/src/errorHandling.ts

index dae88be147f1acc16acac0d7258ea6f658504551..73ef657e249b6eff2e5b94da4e943b9b416ace55 100644 (file)
@@ -31,14 +31,14 @@ describe('attribute fallthrough', () => {
       updated() {
         childUpdated()
       }
-      render(props: any) {
+      render() {
         return h(
           'div',
           {
             class: 'c2',
             style: { fontWeight: 'bold' }
           },
-          props.foo
+          this.$props.foo
         )
       }
     }
@@ -103,14 +103,14 @@ describe('attribute fallthrough', () => {
       updated() {
         childUpdated()
       }
-      render(props: any) {
+      render() {
         return h(
           'div',
           {
             class: 'c2',
             style: { fontWeight: 'bold' }
           },
-          props.foo
+          this.$props.foo
         )
       }
     }
index d8ff5ebd42cc089c638622c9901707524929617a..3cd9ea97ec468c1bae5eb8a55946a00c097e51c5 100644 (file)
@@ -1,11 +1,13 @@
 import { EMPTY_OBJ } from './utils'
+import { createElement } from './h'
 import { VNode, Slots, RenderNode, MountedVNode } from './vdom'
 import {
   Data,
   RenderFunction,
   ComponentOptions,
   ComponentPropsOptions,
-  WatchOptions
+  WatchOptions,
+  RenderContext
 } from './componentOptions'
 import { setupWatcher } from './componentWatch'
 import { Autorun, DebuggerEvent, ComputedGetter } from '@vue/observer'
@@ -40,7 +42,7 @@ export interface MountedComponent<D = Data, P = Data>
   $children: MountedComponent[]
   $options: ComponentOptions<D, P>
 
-  render(props: P, slots: Slots, attrs: Data): any
+  render(h: createElement, ctx: RenderContext<P>): any
   renderError?(e: Error): any
   renderTracked?(e: DebuggerEvent): void
   renderTriggered?(e: DebuggerEvent): void
index 4cdfcb3e33ed0731580e30bbf4ecb2b842322608..800ce63b23c98943ba0349f94d2c4f1d88e8ad86 100644 (file)
@@ -1,10 +1,17 @@
+import { createElement } from './h'
 import { Slots } from './vdom'
 import { MountedComponent } from './component'
 
 export type Data = Record<string, any>
 
+export interface RenderContext<P> {
+  props: P
+  slots: Slots
+  attrs: Data
+}
+
 export interface RenderFunction<P = Data> {
-  (props: P, slots: Slots, attrs: Data): any
+  (h: createElement, ctx: RenderContext<P>): any
 }
 
 export interface ComponentOptions<D = Data, P = Data> {
index 8456988fcbaf0c417df9dfe9a8bf8e9633921b3c..1a3075105065b6b6c25af7bfec223cf2b91dea79 100644 (file)
@@ -56,12 +56,11 @@ export function createComponentInstance(
 export function renderInstanceRoot(instance: MountedComponent): VNode {
   let vnode
   try {
-    vnode = instance.render.call(
-      instance.$proxy,
-      instance.$props,
-      instance.$slots,
-      instance.$attrs
-    )
+    vnode = instance.render.call(instance.$proxy, h, {
+      props: instance.$props,
+      slots: instance.$slots,
+      attrs: instance.$attrs
+    })
   } catch (e1) {
     handleError(e1, instance, ErrorTypes.RENDER)
     if (__DEV__ && instance.renderError) {
index d737ea1a90e3b8afc7f9249d15000c343df14686..aee6bd1c7f29d349196269fb81b4955393edf00f 100644 (file)
@@ -1,3 +1,4 @@
+import { h } from './h'
 import { autorun, stop } from '@vue/observer'
 import { queueJob } from '@vue/scheduler'
 import { VNodeFlags, ChildrenFlags } from './flags'
@@ -237,7 +238,11 @@ export function createRenderer(options: RendererOptions) {
     const render = tag as FunctionalComponent
     const { props, attrs } = resolveProps(data, render.props)
     const subTree = (vnode.children = normalizeComponentRoot(
-      render(props, slots || EMPTY_OBJ, attrs || EMPTY_OBJ),
+      render(h, {
+        props,
+        slots: slots || EMPTY_OBJ,
+        attrs: attrs || EMPTY_OBJ
+      }),
       vnode,
       attrs,
       render.inheritAttrs
@@ -525,7 +530,11 @@ export function createRenderer(options: RendererOptions) {
     if (shouldUpdate) {
       const { props, attrs } = resolveProps(nextData, render.props)
       const nextTree = (nextVNode.children = normalizeComponentRoot(
-        render(props, nextSlots || EMPTY_OBJ, attrs || EMPTY_OBJ),
+        render(h, {
+          props,
+          slots: nextSlots || EMPTY_OBJ,
+          attrs: attrs || EMPTY_OBJ
+        }),
         nextVNode,
         attrs,
         render.inheritAttrs
index 464f628ec35b31fb7c486380c420844404db906f..9294ab5023941cb69dd41245a8e5450d62f646ed 100644 (file)
@@ -58,10 +58,8 @@ export function handleError(
 function logError(err: Error, instance: MountedComponent, type: ErrorTypes) {
   if (__DEV__) {
     const info = ErrorTypeStrings[type]
-    console.warn(
-      `Unhandled error${info ? ` in ${info}` : ``}: "${err.toString()}"`,
-      instance
-    )
+    console.warn(`Unhandled error${info ? ` in ${info}` : ``}:`)
+    console.error(err)
   } else {
     throw err
   }