|
11 | 11 | from idom import html
|
12 | 12 | from idom.config import IDOM_DEBUG_MODE
|
13 | 13 | from idom.core.dispatcher import render_json_patch
|
14 |
| -from idom.core.hooks import use_effect |
| 14 | +from idom.core.hooks import use_effect, use_state |
15 | 15 | from idom.core.layout import LayoutEvent
|
16 | 16 | from idom.testing import (
|
17 | 17 | HookCatcher,
|
@@ -877,3 +877,49 @@ def SomeComponent():
|
877 | 877 |
|
878 | 878 | assert element_static_handler.target in layout._event_handlers
|
879 | 879 | assert component_static_handler.target not in layout._event_handlers
|
| 880 | + |
| 881 | + |
| 882 | +async def test_switching_component_definition(): |
| 883 | + toggle_component = idom.Ref() |
| 884 | + first_used_state = idom.Ref(None) |
| 885 | + second_used_state = idom.Ref(None) |
| 886 | + |
| 887 | + @idom.component |
| 888 | + def Root(): |
| 889 | + toggle, toggle_component.current = use_toggle(True) |
| 890 | + if toggle: |
| 891 | + return FirstComponent() |
| 892 | + else: |
| 893 | + return SecondComponent() |
| 894 | + |
| 895 | + @idom.component |
| 896 | + def FirstComponent(): |
| 897 | + first_used_state.current = use_state("first")[0] |
| 898 | + # reset state after unmount |
| 899 | + use_effect(lambda: lambda: first_used_state.set_current(None)) |
| 900 | + return html.div() |
| 901 | + |
| 902 | + @idom.component |
| 903 | + def SecondComponent(): |
| 904 | + second_used_state.current = use_state("second")[0] |
| 905 | + # reset state after unmount |
| 906 | + use_effect(lambda: lambda: second_used_state.set_current(None)) |
| 907 | + return html.div() |
| 908 | + |
| 909 | + with idom.Layout(Root()) as layout: |
| 910 | + await layout.render() |
| 911 | + |
| 912 | + assert first_used_state.current == "first" |
| 913 | + assert second_used_state.current is None |
| 914 | + |
| 915 | + toggle_component.current() |
| 916 | + await layout.render() |
| 917 | + |
| 918 | + assert first_used_state.current is None |
| 919 | + assert second_used_state.current == "second" |
| 920 | + |
| 921 | + toggle_component.current() |
| 922 | + await layout.render() |
| 923 | + |
| 924 | + assert first_used_state.current == "first" |
| 925 | + assert second_used_state.current is None |
0 commit comments