-
-
Notifications
You must be signed in to change notification settings - Fork 327
Open
Open
Copy link
Labels
priority-0-criticalMust be resolved and released immediately.Must be resolved and released immediately.release-patchWarrents a patch releaseWarrents a patch release
Description
Current Situation
This issue was first discovered while trying to develop reactive-python/reactpy-django#226
I created a component that simulates a list
of conditionally rendered children. Each child in the list contains a unique key
. However, the use_effect
unmount method does not always appear to be called when the component is dismounted.
Here is a minimum viable example:
from uuid import uuid4
from reactpy import component, hooks, html, run
@component
def child():
ownership_uuid = hooks.use_memo(lambda: uuid4().hex)
@hooks.use_effect(dependencies=[])
async def unmount_manager():
print("registering new unmount func")
def unmount():
# FIXME: This is not working as expected. Dismount is not always called.
print("unmount func called")
return unmount
return ownership_uuid
@component
def root():
components = hooks.use_ref([child(key=uuid4().hex)])
reload_trigger, set_reload_trigger = hooks.use_state(True)
async def add_front_child(event):
components.current.insert(0, child(key=uuid4().hex))
set_reload_trigger(not reload_trigger)
async def add_end_child(event):
components.current.append(child(key=uuid4().hex))
set_reload_trigger(not reload_trigger)
async def remove_front_child(event):
if components.current:
components.current.pop(0)
set_reload_trigger(not reload_trigger)
async def remove_end_child(event):
if components.current:
components.current.pop()
set_reload_trigger(not reload_trigger)
return html.div(
html.div(
html.button({"on_click": add_front_child}, "Add End"),
html.button({"on_click": add_end_child}, "Add Front"),
html.button({"on_click": remove_front_child}, "Remove End"),
html.button({"on_click": remove_end_child}, "Remove Front"),
),
html.div(f"Components: {components.current}"),
components.current,
)
run(root)
You can demo this by adding a bunch of children, then removing them. If you look at terminal, you'll notice that unmount
was only called once despite multiple children being unloaded.
Proposed Actions
No response
Metadata
Metadata
Assignees
Labels
priority-0-criticalMust be resolved and released immediately.Must be resolved and released immediately.release-patchWarrents a patch releaseWarrents a patch release