三元运算符在几毫秒内显示真实的部分,即使它是假的
Ternary operator shows for milliseconds the truthy part even when it's false
(对不起我的英文)
我是 Reactjs 的新手,我正在尝试做一个用户可以创建抽认卡的应用程序。
抽认卡必须有一个类别,所以当用户进入菜单列出和创建抽认卡时,如果没有创建任何类别,我想在类别菜单之前显示一个短语供用户访问以创建类别。
为此,我列出抽认卡的组件会收到一个带有类别列表的 Prop,如果列表为空,它会显示横幅,如果没有,它会显示组件的其余部分:
type Props = {
categorias: Categoria[];
};
const TarjetasList = ({ categorias }: Props) => { ...
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
<>
<TarjetaFilter onSubmitFilter={handleSubmitFilter} />
<div>
{page?.content.map((tarjeta) => (
<div key={tarjeta.id}>
<TarjetaCard tarjeta={tarjeta} onDelete={getTarjetas} />
</div>
))}
</div>
<Pagination
pageCount={page ? page?.totalPages : 0}
range={2}
onChange={handlePageChange}
/>
</>
)}
</>
);
};
问题是,当用户访问列出卡片的菜单时,它会显示带有短语“您必须创建类别”的横幅几毫秒,即使“!categoria.length”是假的,然后它停止显示它并显示它应该显示的组件的其余部分,但即使只有几毫秒,我也想避免这种情况。可能吗?
我做错了什么?
这是打开卡片列表的菜单组件的代码:
const Tarjetas = () => {
const [categorias, setCategorias] = useState<Categoria[]>([]);
const getCategorias = useCallback(() => {
const config: AxiosRequestConfig = {
method: "GET",
url: "/categorias",
withCredentials: true,
};
requestBackend(config).then((response) => {
setCategorias(response.data.content);
});
}, []);
useEffect(() => {
getCategorias();
}, [getCategorias]);
return (
<Routes>
<Route index element={<TarjetasList categorias={categorias} />} />
<Route path=":tarjetaId" element={<TarjetasForm />} />
</Routes>
);
};
下面是TarjetasList组件的完整代码:
type ControlComponentsData = {
activePage: number;
filterData: TarjetaFilterData;
};
type Props = {
categorias: Categoria[];
};
const TarjetasList = ({ categorias }: Props) => {
const [page, setPage] = useState<SpringPage<Tarjeta>>();
const [controlComponentsData, setControlComponentsData] =
useState<ControlComponentsData>({
activePage: 0,
filterData: { texto: "", categoria: null },
});
const getTarjetas = useCallback(() => {
const config: AxiosRequestConfig = {
method: "GET",
url: "/tarjetas",
withCredentials: true,
params: {
page: controlComponentsData.activePage,
size: 3,
categoriaId: controlComponentsData.filterData.categoria?.id,
texto: controlComponentsData.filterData.texto,
},
};
requestBackend(config).then((response) => {
setPage(response.data);
});
}, [controlComponentsData]);
useEffect(() => {
getTarjetas();
}, [getTarjetas]);
const handlePageChange = (pageNumber: number) => {
setControlComponentsData({
activePage: pageNumber,
filterData: controlComponentsData.filterData,
});
};
const handleSubmitFilter = (data: TarjetaFilterData) => {
setControlComponentsData({
activePage: 0,
filterData: data,
});
};
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
<>
<TarjetaFilter onSubmitFilter={handleSubmitFilter} />
<div>
{page?.content.map((tarjeta) => (
<div key={tarjeta.id}>
<TarjetaCard tarjeta={tarjeta} onDelete={getTarjetas} />
</div>
))}
</div>
<Pagination
pageCount={page ? page?.totalPages : 0}
range={2}
onChange={handlePageChange}
/>
</>
)}
</>
);
};
您的类别 categorias
最初是空的。在加载它们之前,您将显示文本。
最简单的解决方案不是将 categorias
初始化为空列表,而是 null
:
const [categorias, setCategorias] = useState<Categoria[] | null>(null);
然后您可以添加额外的渲染状态,直到 categorias
被加载:
if (!categorias) {
return <h1>Cargando…</h1>
}
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
...
但是,理想情况下,您将使用类似于以下的复杂结构来处理加载状态:
{ isLoading: true, error: null, categorias: [] }
这样你就可以正确区分什么时候显示加载提示,什么时候显示加载错误
(对不起我的英文)
我是 Reactjs 的新手,我正在尝试做一个用户可以创建抽认卡的应用程序。
抽认卡必须有一个类别,所以当用户进入菜单列出和创建抽认卡时,如果没有创建任何类别,我想在类别菜单之前显示一个短语供用户访问以创建类别。
为此,我列出抽认卡的组件会收到一个带有类别列表的 Prop,如果列表为空,它会显示横幅,如果没有,它会显示组件的其余部分:
type Props = {
categorias: Categoria[];
};
const TarjetasList = ({ categorias }: Props) => { ...
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
<>
<TarjetaFilter onSubmitFilter={handleSubmitFilter} />
<div>
{page?.content.map((tarjeta) => (
<div key={tarjeta.id}>
<TarjetaCard tarjeta={tarjeta} onDelete={getTarjetas} />
</div>
))}
</div>
<Pagination
pageCount={page ? page?.totalPages : 0}
range={2}
onChange={handlePageChange}
/>
</>
)}
</>
);
};
问题是,当用户访问列出卡片的菜单时,它会显示带有短语“您必须创建类别”的横幅几毫秒,即使“!categoria.length”是假的,然后它停止显示它并显示它应该显示的组件的其余部分,但即使只有几毫秒,我也想避免这种情况。可能吗? 我做错了什么?
这是打开卡片列表的菜单组件的代码:
const Tarjetas = () => {
const [categorias, setCategorias] = useState<Categoria[]>([]);
const getCategorias = useCallback(() => {
const config: AxiosRequestConfig = {
method: "GET",
url: "/categorias",
withCredentials: true,
};
requestBackend(config).then((response) => {
setCategorias(response.data.content);
});
}, []);
useEffect(() => {
getCategorias();
}, [getCategorias]);
return (
<Routes>
<Route index element={<TarjetasList categorias={categorias} />} />
<Route path=":tarjetaId" element={<TarjetasForm />} />
</Routes>
);
};
下面是TarjetasList组件的完整代码:
type ControlComponentsData = {
activePage: number;
filterData: TarjetaFilterData;
};
type Props = {
categorias: Categoria[];
};
const TarjetasList = ({ categorias }: Props) => {
const [page, setPage] = useState<SpringPage<Tarjeta>>();
const [controlComponentsData, setControlComponentsData] =
useState<ControlComponentsData>({
activePage: 0,
filterData: { texto: "", categoria: null },
});
const getTarjetas = useCallback(() => {
const config: AxiosRequestConfig = {
method: "GET",
url: "/tarjetas",
withCredentials: true,
params: {
page: controlComponentsData.activePage,
size: 3,
categoriaId: controlComponentsData.filterData.categoria?.id,
texto: controlComponentsData.filterData.texto,
},
};
requestBackend(config).then((response) => {
setPage(response.data);
});
}, [controlComponentsData]);
useEffect(() => {
getTarjetas();
}, [getTarjetas]);
const handlePageChange = (pageNumber: number) => {
setControlComponentsData({
activePage: pageNumber,
filterData: controlComponentsData.filterData,
});
};
const handleSubmitFilter = (data: TarjetaFilterData) => {
setControlComponentsData({
activePage: 0,
filterData: data,
});
};
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
<>
<TarjetaFilter onSubmitFilter={handleSubmitFilter} />
<div>
{page?.content.map((tarjeta) => (
<div key={tarjeta.id}>
<TarjetaCard tarjeta={tarjeta} onDelete={getTarjetas} />
</div>
))}
</div>
<Pagination
pageCount={page ? page?.totalPages : 0}
range={2}
onChange={handlePageChange}
/>
</>
)}
</>
);
};
您的类别 categorias
最初是空的。在加载它们之前,您将显示文本。
最简单的解决方案不是将 categorias
初始化为空列表,而是 null
:
const [categorias, setCategorias] = useState<Categoria[] | null>(null);
然后您可以添加额外的渲染状态,直到 categorias
被加载:
if (!categorias) {
return <h1>Cargando…</h1>
}
return (
<>
{!categorias.length ? (
<h1>Debe crear una categoria</h1>
) : (
...
但是,理想情况下,您将使用类似于以下的复杂结构来处理加载状态:
{ isLoading: true, error: null, categorias: [] }
这样你就可以正确区分什么时候显示加载提示,什么时候显示加载错误