react-loading-skeleton,react中skeleton的简单应用

648 阅读2分钟

## Basic Usage

Install via one of:

yarn add react-loading-skeleton
npm install react-loading-skeleton
import Skeleton from 'react-loading-skeleton'
import 'react-loading-skeleton/dist/skeleton.css'

<Skeleton /> // Simple, single-line loading skeleton
<Skeleton count={5} /> // Five-line loading skeleton
function BlogPost(props) {
  return (
    <div>
      <h1>{props.title || <Skeleton />}</h1>
      {props.body || <Skeleton count={10} />}
    </div>
  );
}

Theming

Customize individual skeletons with props, or render a SkeletonTheme to style all skeletons below it in the React hierarchy:

import Skeleton, { SkeletonTheme } from 'react-loading-skeleton';

return (
  <SkeletonTheme baseColor="#202020" highlightColor="#444">
    <p>
      <Skeleton count={3} />
    </p>
  </SkeletonTheme>
);

Props Reference

Skeleton only

PropDescriptionDefault
count?: numberThe number of lines of skeletons to render. If count is a decimal number like 3.5, three full skeletons and one half-width skeleton will be rendered.1
wrapper?: React.FunctionComponent <PropsWithChildren<unknown>>A custom wrapper component that goes around the individual skeleton elements.
circle?: booleanMakes the skeleton circular by setting border-radius to 50%.false
className?: stringA custom class name for the individual skeleton elements which is used alongside the default class, react-loading-skeleton.
containerClassName?: stringA custom class name for the <span> that wraps the individual skeleton elements.
containerTestId?: stringA string that is added to the container element as a data-testid attribute. Use it with screen.getByTestId('...') from React Testing Library.
style?: React.CSSPropertiesThis is an escape hatch for advanced use cases and is not the preferred way to style the skeleton. Props (e.g. widthborderRadius) take priority over this style object.

Skeleton and SkeletonTheme

PropDescriptionDefault
baseColor?: stringThe background color of the skeleton.#ebebeb
highlightColor?: stringThe highlight color in the skeleton animation.#f5f5f5
`width?: stringnumber`The width of the skeleton.100%
`height?: stringnumber`The height of each skeleton line.The font size
`borderRadius?: stringnumber`The border radius of the skeleton.0.25rem
inline?: booleanBy default, a <br /> is inserted after each skeleton so that each skeleton gets its own line. When inline is true, no line breaks are inserted.false
duration?: numberThe length of the animation in seconds.1.5
`direction?: 'ltr''rtl'`The direction of the animation, either left-to-right or right-to-left.'ltr'
enableAnimation?: booleanWhether the animation should play. The skeleton will be a solid color when this is false. You could use this prop to stop the animation if an error occurs.true

Examples

Custom Wrapper

There are two ways to wrap a skeleton in a container:

function Box({ children }: PropsWithChildren<unknown>) {
  return (
    <div
      style={{
        border: '1px solid #ccc',
        display: 'block',
        lineHeight: 2,
        padding: '1rem',
        marginBottom: '0.5rem',
        width: 100,
      }}
    >
      {children}
    </div>
  );
}

// Method 1: Use the wrapper prop
const wrapped1 = <Skeleton wrapper={Box} count={5} />;

// Method 2: Do it "the normal way"
const wrapped2 = (
  <Box>
    <Skeleton />
  </Box>
);

Troubleshooting

The skeleton width is 0 when the parent has display: flex!

In the example below, the width of the skeleton will be 0:

<div style={{ display: 'flex' }}>
  <Skeleton />
</div>

This happens because the skeleton has no intrinsic width. You can fix it by applying flex: 1 to the skeleton container via the containerClassName prop.

For example, if you are using Tailwind, your code would look like this:

<div style={{ display: 'flex' }}>
  <Skeleton containerClassName="flex-1" />
</div>

The height of my container is off by a few pixels!

In the example below, the height of the <div> will be slightly larger than 30 even though the react-loading-skeleton element is exactly 30px.

<div>
  <Skeleton height={30} />
</div>