Skip to content

Allowing custom reconciler host-context in React 18  #24138

Description

@drcmda

in a custom renderer we would like to do something like this:

<inject foo="bar">
  <group>
    <group>
      <obj />
    </group>
  </group>
</inject>

✅ obj is supposed to know it is within inject, this is possible

❌ inject is supposed to make its props (foo="bar") the host context for all of its nested contents, obj should be able to access it. this is not possible

we create a host context like this:

getRootHostContext(rootContainer) { return {} }
getChildHostContext(parentHostContext, type, rootContainer) {
 if (type === "inject") {}
 else return parentHostContext

when getChildHostContext gets called for inject, we only have access to string type, not props. i thought i can return an empty object {} and fill it later in:

finalizeInitialChildren(instance, type, props, rootContainer, hostContext) {
  if (type === "inject) hostContext.props = props

but when finalizeInitialChildren is called for inject it refers to root context, it can't refer to its own host context that was created by getChildHostContext.

i find this puzzling, we don't seem to have any relation between a host context and the element that created it.

solution

if we can access the current context it would be very useful to create a richer host context, that will also update.

finalizeInitialChildren(instance, type, props, rootContainer, hostContext, currentContext)
prepareUpdate(instance, type, oldProps, newProps, rootContainer, hostContext, currentContext)

alternatively, allowing us to receive props would at least allow for a static host context that doesn't update but at least carrier some deeper information.

getChildHostContext(parentHostContext, type, rootContainer, props)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    React 18Bug reports, questions, and general feedback about React 18Type: Discussion

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions