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:
committed by
Facebook GitHub Bot
parent
67412bfb43
commit
f07d898a35
@@ -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 (
|
||||
|
||||
@@ -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>;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user