Tenho um aplicativo ReactJS com Redux e alguns createSelector, mas gostaria de alterar alguns deles.
Aqui estão alguns exemplos dos seletores atuais:
export const getAppData = createSelector(
(state: RootState): AppDataState => state[`appData-${getUniquishModuleId()}`],
(appData: AppDataState): AppDataState => appData,
);
export const getNextPageToRender = createSelector(
[
(state: RootState): PageSlug[] =>
state[`appData-${getUniquishModuleId()}`].pagesToRender,
(_: RootState, currentPageSlug: PageSlug): PageSlug => currentPageSlug,
],
(pagesToRender: PageSlug[], currentPageSlug: PageSlug): PageSlug => {
const currentPageIndex: number = pagesToRender.findIndex(
(page: PageSlug) => page === currentPageSlug
);
return pagesToRender[currentPageIndex + 1];
},
);
Agora o que eu gostaria de fazer é getNextPageToRender
usar também o getAppData
seletor.
Eu tentei:
export const getNextPageToRender = createSelector(
getAppData,
[
(appData: AppDataState): PageSlug[] =>
getContextRelatedAppData(appData).pagesToRender,
(_: AppDataState, currentPageSlug: PageSlug): PageSlug => currentPageSlug,
],
(pagesToRender: PageSlug[], currentPageSlug: PageSlug): PageSlug => {
const currentPageIndex: number = pagesToRender.findIndex(
(page: PageSlug) => page === currentPageSlug
);
return pagesToRender[currentPageIndex + 1];
},
);
E eu também tentei:
export const getNextPageToRender = createSelector(
[
getAppData,
(appData: AppDataState): PageSlug[] =>
getContextRelatedAppData(appData).pagesToRender,
(_: AppDataState, currentPageSlug: PageSlug): PageSlug => currentPageSlug,
],
(pagesToRender: PageSlug[], currentPageSlug: PageSlug): PageSlug => {
const currentPageIndex: number = pagesToRender.findIndex(
(page: PageSlug) => page === currentPageSlug
);
return pagesToRender[currentPageIndex + 1];
},
);
Mas essa sintaxe parece não funcionar.
Alguém pode ajudar? O que estou fazendo errado?
O primeiro argumento
createSelector
é uma matriz de funções de seletor de entrada, e o segundo argumento é a função de seletor de saída, onde os argumentos da função são os resultados dos seletores de entrada.Substitua a primeira função do seletor de entrada por
getAppData
e acesse apagesToRender
propriedade apropriada.Usar
createSelector
e declarar uma função de saída que retorna a entrada, ou sejavalue => value
, é antipadrão. Veja Identity Function Check para detalhes.Selecionar o
appData
é um seletor simples. Também é fortemente sugerido usar uma convenção de nomenclatura consistente ao criar funções seletoras, por exemplo, usando umselect-
prefixo.Crie um seletor intermediário que receba o
selectAppData
seletor e emita opagesToRender
valor.