Skip to content

Commit 4669c1b

Browse files
Merge pull request #72 from 92green/feature/branch-react-keying
fix: remount Branch component if base form changes
2 parents baf0830 + 93523ca commit 4669c1b

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

packages/dendriform/src/Dendriform.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ export class Dendriform<V,P extends Plugins = undefined> {
962962
const renderer = aIsRenderer ? a : b;
963963
const deps = aIsRenderer ? b : c;
964964
const form = aIsRenderer ? this : this.branch(a);
965-
return <Branch renderer={() => renderer(form)} deps={deps} />;
965+
return <Branch key={form.id} renderer={() => renderer(form)} deps={deps} />;
966966
}
967967

968968
renderAll<K1 extends Key<V>, K2 extends keyof Val<V,K1>, K3 extends keyof Val<Val<V,K1>,K2>, K4 extends keyof Val<Val<Val<V,K1>,K2>,K3>, W extends Val<Val<Val<V,K1>,K2>,K3>[K4]>(path: [K1, K2, K3, K4], renderer: Renderer<Dendriform<BranchableChild<W>,P>>, deps?: unknown[]): React.ReactElement;
@@ -988,7 +988,7 @@ export class Dendriform<V,P extends Plugins = undefined> {
988988
});
989989
};
990990

991-
return <Branch renderer={containerRenderer} deps={deps} />;
991+
return <Branch key={form.id} renderer={containerRenderer} deps={deps} />;
992992
}
993993
}
994994

packages/dendriform/test/Dendriform.test.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ type MyComponentProps<V> = {
2121
form: Dendriform<V>;
2222
};
2323

24+
type MyComponentIndexProps<V> = {
25+
foo: number;
26+
bar?: number;
27+
form: Dendriform<V>;
28+
index: number;
29+
};
30+
2431
type NotSetTestValue = {
2532
foo?: string;
2633
bar?: string;
@@ -1121,6 +1128,24 @@ describe(`Dendriform`, () => {
11211128
expect(renderer).toHaveBeenCalledTimes(2);
11221129
});
11231130

1131+
test(`should render one level with changing form`, () => {
1132+
const form = new Dendriform(['A','B','C']);
1133+
1134+
const renderer = jest.fn(form => <div className="branch">{form.value}</div>);
1135+
1136+
const MyComponent = (props: MyComponentIndexProps<string[]>) => {
1137+
return props.form.render(props.index, renderer, [props.foo]);
1138+
};
1139+
1140+
const wrapper = mount(<MyComponent form={form} foo={1} bar={1} index={0} />);
1141+
1142+
expect(renderer).toHaveBeenCalledTimes(1);
1143+
1144+
// should update if base form change
1145+
wrapper.setProps({foo: 1, bar: 1, form, index: 1});
1146+
expect(renderer).toHaveBeenCalledTimes(2);
1147+
});
1148+
11241149
test(`should render multiple levels with deps`, () => {
11251150
const form = new Dendriform([[['A','B']]]);
11261151

0 commit comments

Comments
 (0)