Use fragments instead of arrays when returning elements

Summary: Returning arrays from render kills react-reconciliation and produces missing key warnings. Turned all array rendering methods to use Fragments, where I could find them.

Reviewed By: jknoxville

Differential Revision: D21178253

fbshipit-source-id: 85ddf8adfa79732ccbe68409fdcf150399455983
This commit is contained in:
Michel Weststrate
2020-04-23 03:45:43 -07:00
committed by Facebook GitHub Bot
parent 67412bfb43
commit f07d898a35
5 changed files with 73 additions and 57 deletions

View File

@@ -188,20 +188,22 @@ function renderToolbar(section: ToolbarSection) {
</Button>
);
case 'input':
return [
<Label>{item.label}</Label>,
<Select
options={item.options.reduce(
(obj: {[key: string]: string}, item) => {
obj[item] = item;
return obj;
},
{},
)}
selected={item.value}
onChange={() => {}}
/>,
];
return (
<>
<Label>{item.label}</Label>
<Select
options={item.options.reduce(
(obj: {[key: string]: string}, item) => {
obj[item] = item;
return obj;
},
{},
)}
selected={item.value}
onChange={() => {}}
/>
</>
);
}
});
return (

View File

@@ -566,12 +566,17 @@ class DataDescriptionContainer extends Component<{
return <UndefinedValue>(not set)</UndefinedValue>;
} else if (colorInfo) {
const {a, b, g, r} = colorInfo;
return [
<ColorBox key="color-box" color={`rgba(${r}, ${g}, ${b}, ${a})`} />,
<ColorValue key="value">
rgba({r}, {g}, {b}, {a === 1 ? '1' : a.toFixed(2)})
</ColorValue>,
];
return (
<>
<ColorBox
key="color-box"
color={`rgba(${r}, ${g}, ${b}, ${a})`}
/>
<ColorValue key="value">
rgba({r}, {g}, {b}, {a === 1 ? '1' : a.toFixed(2)})
</ColorValue>
</>
);
} else {
return <span>Malformed color</span>;
}
@@ -583,12 +588,17 @@ class DataDescriptionContainer extends Component<{
return <UndefinedValue>(not set)</UndefinedValue>;
} else if (colorInfo) {
const {a, b, g, r} = colorInfo;
return [
<ColorBox key="color-box" color={`rgba(${r}, ${g}, ${b}, ${a})`} />,
<ColorValue key="value">
rgba({r}, {g}, {b}, {a === 1 ? '1' : a.toFixed(2)})
</ColorValue>,
];
return (
<>
<ColorBox
key="color-box"
color={`rgba(${r}, ${g}, ${b}, ${a})`}
/>
<ColorValue key="value">
rgba({r}, {g}, {b}, {a === 1 ? '1' : a.toFixed(2)})
</ColorValue>
</>
);
} else {
return <span>Malformed color</span>;
}

View File

@@ -22,7 +22,7 @@ import styled from '@emotion/styled';
import debounce from 'lodash.debounce';
import ToggleButton from '../ToggleSwitch';
import React from 'react';
import VerticalContainer from '../Layout';
import Layout from '../Layout';
const SearchBar = styled(Toolbar)({
height: 42,
@@ -466,7 +466,7 @@ const Searchable = (
render() {
const {placeholder, actions, ...props} = this.props;
return (
<VerticalContainer scrollable>
<Layout>
<SearchBar position="top" key="searchbar">
<SearchBox tabIndex={-1}>
<SearchIcon
@@ -534,7 +534,7 @@ const Searchable = (
bodySearchEnabled={this.state.bodySearchEnabled}
filters={this.state.filters}
/>
</VerticalContainer>
</Layout>
);
}
};

View File

@@ -1038,10 +1038,12 @@ export default class DatabasesPlugin extends FlipperPlugin<
};
renderStructure() {
return [
renderDatabaseColumns(this.state.currentStructure),
renderDatabaseIndexes(this.state.currentStructure),
];
return (
<>
{renderDatabaseColumns(this.state.currentStructure)}
{renderDatabaseIndexes(this.state.currentStructure)}
</>
);
}
renderSidebar = (table: QueriedTable) => {

View File

@@ -299,30 +299,32 @@ class ImageGrid extends PureComponent<{
return null;
}
return [
<ImageGridHeader
key="header"
title={this.props.title}
subtitle={this.props.subtitle}
onClear={this.props.onClear}
/>,
<ImageGrid.Content key="content">
{images.map((imageId) => (
<ImageItem
imageId={imageId}
image={this.props.imagesMap[imageId]}
key={imageId}
selected={selectedImage != null && selectedImage === imageId}
onSelected={onImageSelected}
size={this.props.size}
numberOfRequests={
this.props.events.filter((e) => e.imageIds.includes(imageId))
.length
}
/>
))}
</ImageGrid.Content>,
];
return (
<>
<ImageGridHeader
key="header"
title={this.props.title}
subtitle={this.props.subtitle}
onClear={this.props.onClear}
/>
<ImageGrid.Content key="content">
{images.map((imageId) => (
<ImageItem
imageId={imageId}
image={this.props.imagesMap[imageId]}
key={imageId}
selected={selectedImage != null && selectedImage === imageId}
onSelected={onImageSelected}
size={this.props.size}
numberOfRequests={
this.props.events.filter((e) => e.imageIds.includes(imageId))
.length
}
/>
))}
</ImageGrid.Content>
</>
);
}
}