simple-cell v0.4.1
Simple Cell
A React package to simplify the rendering logic of your components. Inspired by RedwoodJS Cells and react-cell. Unlike those libraries, simple-cell doesn't include any data fetching logic.
Install
npm i simple-cell
# or
yarn add simple-cellBefore
const Animals = () => {
const { data, loading, error } = useQuery(getAnimalsQuery)
if (loading) return <>Loading...</>
if (error) return <>Something went wrong</>
if (!data?.getAnimals) return <>No animals here</>
return data?.getAnimals.map(a => <div key={a.id}>{a.name}</div>)
}After
import { makeCell } from 'simple-cell'
const AnimalsCell = makeCell({
Success: ({ data: animals }) => animals.map(a => <div key={a.id}>{a.name}</div>),
Loading: () => <>Loading...</>,
Failure: ({ error }) => <>Something went wrong: {error.message}</>,
Empty: () => <>No animals here</>,
})
const Animals = () => {
const { data, loading, error } = useQuery(getAnimalsQuery)
return <AnimalsCell data={data?.getAnimals} loading={loading} error={error} />
}Note that if data is an array, the Empty component will be shown if its length is 0.
Extra Props
Props are passed along to all the components, so you can do:
const Cell = makeCell({
Success: ({ whatever }) => <>{whatever}</>,
})
// ...
<Cell whatever={'whatever'} />Deferred Loading
By default, the loading component is deferred by 300ms. This is a technique to make the UI feel more reactive by not showing a loading state if the loading is fast enough to "feel instantaneous". You can disable or customize that duration with the loadingDelay prop.
<Cell loadingDelay={0} />If you want to use simple-cell's deferred mechanism outside of makeCell, you can import directly the useDeferredLoading hook or the DeferredLoading component:
import { useDeferredLoading, DeferredLoading } from 'simple-cell'
const LoadingWithHook = () => {
const show = useDeferredLoading(200)
return show ? <>Loading...</> : null
}
const LoadingWithComponent = () => <DeferredLoading delay={200}>Loading...</DeferredLoading>Conditional rendering
You may want to render only if some condition is met. Use the renderIf prop to do so:
<Cell renderIf={isSomethingReady} />