Eu tenho um problema em que a re-renderização do estado causa problemas de interface do usuário e foi sugerido apenas atualizar um valor específico dentro do meu redutor para reduzir a quantidade de re-renderização em uma página.
este é um exemplo do meu estado
{
name: "some name",
subtitle: "some subtitle",
contents: [
{title: "some title", text: "some text"},
{title: "some other title", text: "some other text"}
]
}
e atualmente estou atualizando assim
case 'SOME_ACTION':
return { ...state, contents: action.payload }
onde action.payload
é uma matriz inteira contendo novos valores. Mas agora eu só preciso atualizar o texto do segundo item na matriz de conteúdo, e algo como isso não funciona
case 'SOME_ACTION':
return { ...state, contents[1].text: action.payload }
onde action.payload
está agora um texto que preciso para atualização.
javascript
reactjs
redux
Ilja
fonte
fonte
kolodny/immutability-helper
, agora éyarn add immutability-helper
eimport update from 'immutability-helper';
Você pode usar
map
. Aqui está um exemplo de implementação:fonte
Você não precisa fazer tudo em uma linha:
fonte
Muito tarde para a festa, mas aqui está uma solução genérica que funciona com todos os valores de índice.
Você cria e espalha um novo array, do antigo até o
index
que deseja alterar.Adicione os dados que você deseja.
Crie e espalhe um novo array a partir do que
index
você deseja alterar até o final do arrayAtualizar:
Fiz um pequeno módulo para simplificar o código, então você só precisa chamar uma função:
Para mais exemplos, dê uma olhada no repositório
assinatura da função:
fonte
Eu acredito que quando você precisa deste tipo de operação em seu estado Redux, o operador spread é seu amigo e este princípio se aplica a todas as crianças.
Vamos fingir que este é o seu estado:
E você deseja adicionar 3 pontos à Corvinal
Ao usar o operador de propagação, você pode atualizar apenas o novo estado, deixando todo o resto intacto.
Exemplo retirado deste artigo incrível , você pode encontrar quase todas as opções possíveis com ótimos exemplos.
fonte
No meu caso fiz algo assim, com base na resposta do Luis:
fonte
Foi assim que fiz para um dos meus projetos:
fonte
Temo que usar o
map()
método de um array pode ser caro, uma vez que o array inteiro deve ser iterado. Em vez disso, eu combino uma nova matriz que consiste em três partes:Aqui está o exemplo que usei no meu código (NgRx, mas o macanismo é o mesmo para outras implementações do Redux):
fonte