Skip to content

Commit 5a0d2d2

Browse files
lijunleJasonGore
authored andcommitted
Picker and Suggestions: Move the styled call out of render call. (#8834)
* Move the styled call out of render call. - It breaks type check on React reconciliation. * Add change file. * Remove debugging code. * Update the API doc. * Polish the typing.
1 parent 243b646 commit 5a0d2d2

File tree

4 files changed

+27
-28
lines changed

4 files changed

+27
-28
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "office-ui-fabric-react",
5+
"comment": "Fix the picker suggestion items flashing issue.",
6+
"type": "patch"
7+
}
8+
],
9+
"packageName": "office-ui-fabric-react",
10+
"email": "[email protected]"
11+
}

packages/office-ui-fabric-react/etc/office-ui-fabric-react.api.md

-2
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,6 @@ export class BasePicker<T, P extends IBasePickerProps<T>> extends BaseComponent<
350350
// (undocumented)
351351
protected suggestionElement: React.RefObject<ISuggestions<T>>;
352352
// (undocumented)
353-
protected SuggestionOfProperType: new (props: ISuggestionsProps<T>) => Suggestions<T>;
354-
// (undocumented)
355353
protected suggestionStore: SuggestionsController<T>;
356354
// (undocumented)
357355
protected updateSuggestions(suggestions: any[]): void;

packages/office-ui-fabric-react/src/components/pickers/BasePicker.tsx

+8-12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ export type IPickerAriaIds = {
4848

4949
const getClassNames = classNamesFunction<IBasePickerStyleProps, IBasePickerStyles>();
5050

51+
const StyledSuggestions = styled<ISuggestionsProps<any>, ISuggestionsStyleProps, ISuggestionsStyles>(
52+
Suggestions,
53+
suggestionsStyles,
54+
undefined,
55+
{ scope: 'Suggestions' }
56+
);
57+
5158
export class BasePicker<T, P extends IBasePickerProps<T>> extends BaseComponent<P, IBasePickerState> implements IBasePicker<T> {
5259
// Refs
5360
protected root = React.createRef<HTMLDivElement>();
@@ -57,7 +64,6 @@ export class BasePicker<T, P extends IBasePickerProps<T>> extends BaseComponent<
5764

5865
protected selection: Selection;
5966
protected suggestionStore: SuggestionsController<T>;
60-
protected SuggestionOfProperType = Suggestions as new (props: ISuggestionsProps<T>) => Suggestions<T>;
6167
protected currentPromise: PromiseLike<any> | undefined;
6268
protected _ariaMap: IPickerAriaIds;
6369
private _id: string;
@@ -277,17 +283,7 @@ export class BasePicker<T, P extends IBasePickerProps<T>> extends BaseComponent<
277283
}
278284

279285
protected renderSuggestions(): JSX.Element | null {
280-
const TypedSuggestions = this.SuggestionOfProperType;
281-
282-
// TODO:
283-
// Move this styled component in a separate file and make it available to the public API.
284-
// This should be done after rewriting pickers to use a composition pattern instead of inheritance.
285-
const StyledTypedSuggestions = styled<ISuggestionsProps<T>, ISuggestionsStyleProps, ISuggestionsStyles>(
286-
TypedSuggestions,
287-
suggestionsStyles,
288-
undefined,
289-
{ scope: 'Suggestions' }
290-
);
286+
const StyledTypedSuggestions: React.StatelessComponent<ISuggestionsProps<T>> = StyledSuggestions;
291287

292288
return this.state.suggestionsVisible && this.input ? (
293289
<Callout

packages/office-ui-fabric-react/src/components/pickers/Suggestions/Suggestions.tsx

+8-14
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@ export interface ISuggestionsState {
1818
selectedActionType: SuggestionActionType;
1919
}
2020

21+
const StyledSuggestionsItem = styled<ISuggestionItemProps<any>, ISuggestionsItemStyleProps, ISuggestionsItemStyles>(
22+
SuggestionsItem,
23+
suggestionsItemStyles,
24+
undefined,
25+
{ scope: 'SuggestionItem' }
26+
);
27+
2128
export class Suggestions<T> extends BaseComponent<ISuggestionsProps<T>, ISuggestionsState> {
2229
protected _forceResolveButton = React.createRef<IButton>();
2330
protected _searchForMoreButton = React.createRef<IButton>();
2431
protected _selectedElement = React.createRef<HTMLDivElement>();
25-
private SuggestionsItemOfProperType = SuggestionsItem as new (props: ISuggestionItemProps<T>) => SuggestionsItem<T>;
2632
private activeSelectedElement: HTMLDivElement | null;
2733
private _classNames: Partial<IProcessedStyleSet<ISuggestionsStyles>>;
2834

@@ -307,19 +313,7 @@ export class Suggestions<T> extends BaseComponent<ISuggestionsProps<T>, ISuggest
307313

308314
let { suggestions } = this.props;
309315

310-
const TypedSuggestionsItem = this.SuggestionsItemOfProperType;
311-
312-
// TODO:
313-
// Move this styled component in a separate file and make it available to the public API.
314-
// This should be done after rewriting pickers to use a composition pattern instead of inheritance.
315-
const StyledTypedSuggestionsItem = styled<ISuggestionItemProps<T>, ISuggestionsItemStyleProps, ISuggestionsItemStyles>(
316-
TypedSuggestionsItem,
317-
suggestionsItemStyles,
318-
undefined,
319-
{
320-
scope: 'SuggestionItem'
321-
}
322-
);
316+
const StyledTypedSuggestionsItem: React.StatelessComponent<ISuggestionItemProps<T>> = StyledSuggestionsItem;
323317

324318
let selectedIndex = -1;
325319
suggestions.some((element, index) => {

0 commit comments

Comments
 (0)