Skip to content

Commit

Permalink
feat(react): add context cleaner to FormProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
janryWang committed Apr 28, 2021
1 parent 4fef95a commit b1eab98
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
8 changes: 5 additions & 3 deletions packages/react/src/components/FormProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import React from 'react'
import { useAttach } from '../hooks/useAttach'
import { FormContext } from '../shared'
import { FormContext, ContextCleaner } from '../shared'
import { IProviderProps } from '../types'

export const FormProvider: React.FC<IProviderProps> = props => {
export const FormProvider: React.FC<IProviderProps> = (props) => {
const form = useAttach(props.form)
return (
<FormContext.Provider value={form}>{props.children}</FormContext.Provider>
<ContextCleaner>
<FormContext.Provider value={form}>{props.children}</FormContext.Provider>
</ContextCleaner>
)
}

Expand Down
18 changes: 17 additions & 1 deletion packages/react/src/shared/context.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import { createContext } from 'react'
import React, { createContext } from 'react'
import { Schema } from '@formily/json-schema'
import { ISchemaFieldFactoryOptions } from '../types'

const createContextCleaner = <T>(...contexts: React.Context<T>[]) => {
return ({ children }) => {
return contexts.reduce((buf, ctx) => {
return React.createElement(ctx.Provider, { value: undefined }, buf)
}, children)
}
}

export const FormContext = createContext<Formily.Core.Models.Form>(null)
export const FieldContext = createContext<Formily.Core.Types.GeneralField>(null)
export const SchemaMarkupContext = createContext<Schema>(null)
Expand All @@ -10,3 +18,11 @@ export const SchemaExpressionScopeContext = createContext<any>(null)
export const SchemaOptionsContext = createContext<ISchemaFieldFactoryOptions>(
null
)

export const ContextCleaner = createContextCleaner(
FieldContext,
SchemaMarkupContext,
SchemaContext,
SchemaExpressionScopeContext,
SchemaOptionsContext
)

0 comments on commit b1eab98

Please sign in to comment.