Então, eu quero passar adereços para um componente Vue, mas espero que eles mudem no futuro de dentro desse componente, por exemplo, quando eu atualizar esse componente Vue de dentro usando AJAX. Portanto, eles são apenas para inicialização do componente.
cars-list
Elemento de componente My Vue onde passo adereços com propriedades iniciais para single-car
:
// cars-list.vue
<script>
export default {
data: function() {
return {
cars: [
{
color: 'red',
maxSpeed: 200,
},
{
color: 'blue',
maxSpeed: 195,
},
]
}
},
}
</script>
<template>
<div>
<template v-for="car in cars">
<single-car :initial-properties="car"></single-car>
</template>
</div>
</template>
A maneira que eu fazê-lo agora que dentro do meu single-car
componente estou atribuindo this.initialProperties
ao meu this.data.properties
no created()
gancho de inicialização. E funciona e é reativo.
// single-car.vue
<script>
export default {
data: function() {
return {
properties: {},
}
},
created: function(){
this.data.properties = this.initialProperties;
},
}
</script>
<template>
<div>Car is in {{properties.color}} and has a max speed of {{properties.maxSpeed}}</div>
</template>
Mas meu problema com isso é que não sei se essa é uma maneira correta de fazer isso. Isso não vai me causar alguns problemas ao longo da estrada? Ou existe uma maneira melhor de fazer isso?
javascript
vue.js
Dominik Serafin
fonte
fonte
data
estátwo-way
vinculado, mas você não pode passardata
para componentes, você passaprops
, mas não pode alterar o recebidoprops
nem converterprops
paradata
. Então o que? Uma coisa que aprendi é que você deve transmitirprops
e disparar eventos. Ou seja, se o componente quiser alterar oprops
recebido, deve chamar um evento e ser "renderizado". Mas então você fica com umaone-way
ligação exatamente como React e não vejo utilidade paradata
ela. Muito confuso.Respostas:
Graças a https://github.com/vuejs/vuejs.org/pull/567 eu sei a resposta agora.
Método 1
Passe a proposta inicial diretamente para os dados. Como o exemplo em documentos atualizados:
Mas tenha em mente que se o prop passado for um objeto ou array usado no estado do componente pai, qualquer modificação nesse prop resultará na mudança no estado do componente pai.
Aviso : este método não é recomendado. Isso tornará seus componentes imprevisíveis. Se você precisar definir dados pai de componentes filhos, use o gerenciamento de estado como Vuex ou use o "modelo v". https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components
Método 2
Se o seu prop inicial é um objeto ou matriz e se você não quer que as mudanças no estado filho se propaguem para o estado pai, então use, por exemplo,
Vue.util.extend
[1] para fazer uma cópia dos props, em vez de apontá-lo diretamente para os dados dos filhos, como este:Método 3
Você também pode usar o operador de propagação para clonar os adereços. Mais detalhes na resposta do Igor: https://stackoverflow.com/a/51911118/3143704
Mas ter em mente que os operadores de spread não são suportados em navegadores mais antigos e para melhor compatibilidade você precisa transpile o código de exemplo usando
babel
.Notas de rodapé
[1] Tenha em mente que este é um utilitário interno do Vue e pode mudar com novas versões. Você pode usar outros métodos para copiar esse objeto , consulte " Como faço para clonar corretamente um objeto JavaScript? ".
Meu violino onde estava testando: https://jsfiddle.net/sm4kx7p9/3/
fonte
{ ok: 1, notOk: { meh: 2 } }
se definido como um dado interno com qualquer um dos métodos de clonagem anterior, ainda mudaria o suportenotOk.meh
initial
apenas para poder usá-los dentro do meu comp. Seria muito mais limpo se pudéssemos apenas passar um prop chamadodata
para qualquer comp e fazer com que ele propagasse automaticamente os dados localizados sem toda essainitialPropName
loucura.prop --> comp.data
para usar o Vue-Stash para todos os dados (ou o Vuex também funcionaria). Mas agora estou apenas devolvendo meus dados dowindow
objeto, como costumava fazer antes que os frameworks JS "modernos" impusessem sua opinião sobre mim. Portanto, levanta a questão: Qual é o objetivo da propriedade comp.data afinal?Acompanhando a resposta de @domik-serafin:
Caso você esteja passando um objeto, você pode cloná-lo facilmente usando o operador spread (sintaxe ES6):
Mas o mais importante é lembrar de usar opt. 2 caso você esteja passando um valor calculado, ou mais do que um valor assíncrono. Caso contrário, o valor local não será atualizado.
Demo:
https://jsfiddle.net/nomikos3/eywraw8t/281070/
fonte
recordLocal: [...this.record]
(no meu caso, o registro é uma matriz) não funcionou para mim - depois de carregar e inspecionar o componente vue,record
contém os itens erecordLocal
era uma matriz vazia.computed
Eu acredito que você está fazendo certo porque é o que está declarado nos documentos.
https://vuejs.org/guide/components.html#One-Way-Data-Flow
fonte
window
objeto.