Skip to content

Commit

Permalink
feat(functional): add scopedSlots to context in functional components (
Browse files Browse the repository at this point in the history
  • Loading branch information
posva authored and yyx990803 committed Jan 9, 2019
1 parent 5d52262 commit fb6aa06
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/core/vdom/create-functional-component.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export function FunctionalRenderContext (
this.children = children
this.parent = parent
this.listeners = data.on || emptyObject
this.scopedSlots = data.scopedSlots || emptyObject
this.injections = resolveInject(options.inject, parent)
this.slots = () => resolveSlots(children, parent)

Expand Down
17 changes: 17 additions & 0 deletions test/unit/features/options/functional.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,23 @@ describe('Options functional', () => {
document.body.removeChild(vm.$el)
})

it('should expose data.scopedSlots as scopedSlots', () => {
const vm = new Vue({
template: '<div><wrap><p slot-scope="a">{{ a }}</p></wrap></div>',
components: {
wrap: {
functional: true,
render (h, { scopedSlots, data }) {
expect(data.scopedSlots).toBe(scopedSlots)
return data.scopedSlots.default('a')
}
}
}
}).$mount()

expect(vm.$el.textContent).toBe('a')
})

it('should support returning more than one root node', () => {
const vm = new Vue({
template: `<div><test></test></div>`,
Expand Down
3 changes: 2 additions & 1 deletion types/options.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Vue, CreateElement, CombinedVueInstance } from "./vue";
import { VNode, VNodeData, VNodeDirective } from "./vnode";
import { VNode, VNodeData, VNodeDirective, ScopedSlot } from "./vnode";

type Constructor = {
new (...args: any[]): any;
Expand Down Expand Up @@ -140,6 +140,7 @@ export interface RenderContext<Props=DefaultProps> {
data: VNodeData;
parent: Vue;
listeners: { [key: string]: Function | Function[] };
scopedSlots: { [key: string]: ScopedSlot };
injections: any
}

Expand Down
1 change: 1 addition & 0 deletions types/test/options-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ Vue.component('functional-component', {
context.slots();
context.data;
context.parent;
context.scopedSlots;
context.listeners.click;
return createElement("div", {}, context.children);
}
Expand Down

0 comments on commit fb6aa06

Please sign in to comment.