155
}),
156
);
157
} else if (unconditionalBlocks.has(block.id)) {
158
- errors.pushDiagnostic(
159
- CompilerDiagnostic.create({
160
- category: ErrorCategory.RenderSetState,
161
- reason:
162
- 'Calling setState during render may trigger an infinite loop',
163
- description:
164
- 'Calling setState during render will trigger another render, and can lead to infinite loops. (https://react.dev/reference/react/useState)',
165
- suggestions: null,
166
- }).withDetails({
167
- kind: 'error',
168
- loc: callee.loc,
169
- message: 'Found setState() in render',
170
- }),
171
- );
158
+ const enableUseKeyedState = fn.env.config.enableUseKeyedState;
159
+ if (enableUseKeyedState) {
160
+ errors.pushDiagnostic(
161
+ CompilerDiagnostic.create({
162
+ category: ErrorCategory.RenderSetState,
163
+ reason: 'Cannot call setState during render',
164
+ description:
165
+ 'Calling setState during render may trigger an infinite loop.\n' +
166
+ '* To reset state when other state/props change, use `const [state, setState] = useKeyedState(initialState, key)` to reset `state` when `key` changes.\n' +
167
+ '* To derive data from other state/props, compute the derived data during render without using state',
168
+ suggestions: null,
169
+ }).withDetails({
170
+ kind: 'error',
171
+ loc: callee.loc,
172
+ message: 'Found setState() in render',
173
+ }),
174
+ );
175
+ } else {
176
+ errors.pushDiagnostic(
177
+ CompilerDiagnostic.create({
178
+ category: ErrorCategory.RenderSetState,
179
+ reason: 'Cannot call setState during render',
180
+ description:
181
+ 'Calling setState during render may trigger an infinite loop.\n' +
182
+ '* To reset state when other state/props change, store the previous value in state and update conditionally: https://react.dev/reference/react/useState#storing-information-from-previous-renders\n' +
183
+ '* To derive data from other state/props, compute the derived data during render without using state',
184
+ suggestions: null,
185
+ }).withDetails({
186
+ kind: 'error',
187
+ loc: callee.loc,
188
+ message: 'Found setState() in render',
189
+ }),
190
+ );
191
+ }
192
}
193
}
194
break;