diff --git a/benchmark/browser/scenarios/table-cell/index.js b/benchmark/browser/scenarios/table-cell/index.js new file mode 100644 index 00000000000000..498ef636936e86 --- /dev/null +++ b/benchmark/browser/scenarios/table-cell/index.js @@ -0,0 +1,38 @@ +import * as React from 'react'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; + +const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; +const rows = Array.from(new Array(100)).map(() => data); + +export default function TableCellCase() { + return ( + + + + Dessert (100g serving) + Calories + Fat (g) + Carbs (g) + Protein (g) + + + + {rows.map((row, index) => ( + + + {row.name} + + {row.calories} + {row.fat} + {row.carbs} + {row.protein} + + ))} + +
+ ); +} diff --git a/benchmark/browser/scripts/benchmark.js b/benchmark/browser/scripts/benchmark.js index 8c354db609788a..64b0c0ae86573d 100644 --- a/benchmark/browser/scripts/benchmark.js +++ b/benchmark/browser/scripts/benchmark.js @@ -154,6 +154,10 @@ async function run() { name: 'noop (baseline)', path: './noop/index.js', }, + { + name: 'Table', + path: './table-cell/index.js', + }, // Test the cost of React primitives { name: 'React primitives', diff --git a/docs/pages/performance/table-component.js b/docs/pages/performance/table-component.js index 0e7803746ff27a..ae2e28f669a913 100644 --- a/docs/pages/performance/table-component.js +++ b/docs/pages/performance/table-component.js @@ -25,7 +25,7 @@ const TableBody = createComponent('tbody'); const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableComponent() { +export default function TableComponent() { return ( @@ -55,5 +55,3 @@ function TableComponent() { ); } - -export default TableComponent; diff --git a/docs/pages/performance/table-emotion.js b/docs/pages/performance/table-emotion.js index 00350540001e8d..2884168bdff9fb 100644 --- a/docs/pages/performance/table-emotion.js +++ b/docs/pages/performance/table-emotion.js @@ -31,7 +31,7 @@ const TableBody = createComponent('tbody'); const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableEmotion() { +export default function TableEmotion() { return (
@@ -61,5 +61,3 @@ function TableEmotion() { ); } - -export default TableEmotion; diff --git a/docs/pages/performance/table-hook.js b/docs/pages/performance/table-hook.js index 4c4a852960501a..b74bab759f34c9 100644 --- a/docs/pages/performance/table-hook.js +++ b/docs/pages/performance/table-hook.js @@ -33,7 +33,7 @@ const TableBody = createComponent('tbody'); const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableHook() { +export default function TableHook() { return (
@@ -63,5 +63,3 @@ function TableHook() { ); } - -export default TableHook; diff --git a/docs/pages/performance/table-mui.js b/docs/pages/performance/table-mui.js index f7e8f08ee7f9e5..d1c3031cb422a8 100644 --- a/docs/pages/performance/table-mui.js +++ b/docs/pages/performance/table-mui.js @@ -9,7 +9,7 @@ import TableRow from '@material-ui/core/TableRow'; const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableMui() { +export default function TableMui() { return (
@@ -39,5 +39,3 @@ function TableMui() { ); } - -export default TableMui; diff --git a/docs/pages/performance/table-raw.js b/docs/pages/performance/table-raw.js index 9deab04893efdb..825d77898a01bf 100644 --- a/docs/pages/performance/table-raw.js +++ b/docs/pages/performance/table-raw.js @@ -4,7 +4,7 @@ import NoSsr from '@material-ui/core/NoSsr'; const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableRaw() { +export default function TableRaw() { return (
@@ -32,5 +32,3 @@ function TableRaw() { ); } - -export default TableRaw; diff --git a/docs/pages/performance/table-styled-components.js b/docs/pages/performance/table-styled-components.js index 51fec54b3b40d2..b47b3ab184743c 100644 --- a/docs/pages/performance/table-styled-components.js +++ b/docs/pages/performance/table-styled-components.js @@ -28,7 +28,7 @@ const TableBody = createComponent('tbody'); const data = { name: 'Frozen yoghurt', calories: 159, fat: 6.0, carbs: 24, protein: 4.0 }; const rows = Array.from(new Array(100)).map(() => data); -function TableStyledComponents() { +export default function TableStyledComponents() { return (
@@ -58,5 +58,3 @@ function TableStyledComponents() { ); } - -export default TableStyledComponents; diff --git a/packages/material-ui-styles/src/getThemeProps/getThemeProps.js b/packages/material-ui-styles/src/getThemeProps/getThemeProps.js index 5e6b6de2032c44..434d367d67a7cf 100644 --- a/packages/material-ui-styles/src/getThemeProps/getThemeProps.js +++ b/packages/material-ui-styles/src/getThemeProps/getThemeProps.js @@ -11,16 +11,18 @@ export default function getThemeProps(params) { return props; } + const output = { ...props }; + // Resolve default props, code borrow from React source. // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221 const defaultProps = theme.components[name].defaultProps; let propName; for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; + if (output[propName] === undefined) { + output[propName] = defaultProps[propName]; } } - return props; + return output; } diff --git a/packages/material-ui/src/Modal/Modal.js b/packages/material-ui/src/Modal/Modal.js index 72f967fdb10874..f3c334db36ffb1 100644 --- a/packages/material-ui/src/Modal/Modal.js +++ b/packages/material-ui/src/Modal/Modal.js @@ -55,7 +55,7 @@ export const styles = (theme) => ({ */ const Modal = React.forwardRef(function Modal(inProps, ref) { const theme = useTheme(); - const props = getThemeProps({ name: 'MuiModal', props: { ...inProps }, theme }); + const props = getThemeProps({ name: 'MuiModal', props: inProps, theme }); const { BackdropComponent = SimpleBackdrop, BackdropProps, diff --git a/packages/material-ui/src/SwipeableDrawer/SwipeableDrawer.js b/packages/material-ui/src/SwipeableDrawer/SwipeableDrawer.js index a224784e370d00..cfda2c0db22bd4 100644 --- a/packages/material-ui/src/SwipeableDrawer/SwipeableDrawer.js +++ b/packages/material-ui/src/SwipeableDrawer/SwipeableDrawer.js @@ -135,7 +135,7 @@ const transitionDurationDefault = { enter: duration.enteringScreen, exit: durati const SwipeableDrawer = React.forwardRef(function SwipeableDrawer(inProps, ref) { const theme = useTheme(); - const props = getThemeProps({ name: 'MuiSwipeableDrawer', props: { ...inProps }, theme }); + const props = getThemeProps({ name: 'MuiSwipeableDrawer', props: inProps, theme }); const { anchor = 'left', disableBackdropTransition = false, diff --git a/packages/material-ui/src/styles/useThemeProps.js b/packages/material-ui/src/styles/useThemeProps.js index 2187292b2053e1..336d382bac21ec 100644 --- a/packages/material-ui/src/styles/useThemeProps.js +++ b/packages/material-ui/src/styles/useThemeProps.js @@ -2,19 +2,14 @@ import { getThemeProps } from '@material-ui/styles'; import useTheme from './useTheme'; import defaultTheme from './defaultTheme'; -export default function useThemeProps({ props: inputProps, name }) { - const props = { ...inputProps }; - +export default function useThemeProps({ props, name }) { const contextTheme = useTheme() || defaultTheme; - const more = getThemeProps({ theme: contextTheme, name, props }); - const theme = more.theme || contextTheme; - const isRtl = theme.direction === 'rtl'; return { theme, - isRtl, + isRtl: theme.direction === 'rtl', ...more, }; } diff --git a/packages/material-ui/src/withWidth/withWidth.js b/packages/material-ui/src/withWidth/withWidth.js index 84a5af2255bdc2..49597edd1ae572 100644 --- a/packages/material-ui/src/withWidth/withWidth.js +++ b/packages/material-ui/src/withWidth/withWidth.js @@ -37,7 +37,7 @@ const withWidth = (options = {}) => (Component) => { const { initialWidth, width, ...other } = getThemeProps({ theme, name: 'MuiWithWidth', - props: { ...props }, + props, }); const [mountedState, setMountedState] = React.useState(false); diff --git a/packages/typescript-to-proptypes/test/getThemeProps/input.js b/packages/typescript-to-proptypes/test/getThemeProps/input.js index e58e9b85bc292a..c250de424ba14a 100644 --- a/packages/typescript-to-proptypes/test/getThemeProps/input.js +++ b/packages/typescript-to-proptypes/test/getThemeProps/input.js @@ -1,5 +1,5 @@ export default function Modal(inProps) { - const props = getThemeProps({ props: { ...inProps } }); + const props = getThemeProps({ props: inProps }); const { onKeyDown, ...other } = props; function handleKeyDown(event) { diff --git a/packages/typescript-to-proptypes/test/getThemeProps/output.js b/packages/typescript-to-proptypes/test/getThemeProps/output.js index 14ea3477ffc3d5..8ed85a950c19b4 100644 --- a/packages/typescript-to-proptypes/test/getThemeProps/output.js +++ b/packages/typescript-to-proptypes/test/getThemeProps/output.js @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; function Modal(inProps) { - const props = getThemeProps({ props: { ...inProps } }); + const props = getThemeProps({ props: inProps }); const { onKeyDown, ...other } = props; function handleKeyDown(event) {