Se você está tentando descobrir qual dessas duas grandes estruturas escolher, leia a opinião do proponente do Vue sobre esse assunto, que eu traduzi e suplementei.Traduzido com suporte da plataforma de nuvem Mail.ru Cloud Solutions .Então, você é um desenvolvedor do React e decidiu experimentar o Vue. Vamos começar!React e Vue são Coca-Cola e Pepsi. Muito do que você pode fazer com o React também pode ser feito com o Vue. Ao mesmo tempo, existem várias diferenças, algumas das quais refletem o impacto da estrutura angular no Vue.Este artigo se concentra nas diferenças, para que você mergulhe imediatamente no mundo do Vue e veja os benefícios.Quanto o React e o Vue diferem?
React e Vue têm mais semelhanças que diferenças:- Estas são duas bibliotecas para criar uma interface do usuário;
- rápido e leve;
- ter uma arquitetura orientada a componentes;
- use a abordagem DOM virtual;
- ambos podem ser conectados diretamente no arquivo HTML ou como um módulo em um sistema de compilação mais complexo no Webpack;
- ambos têm bibliotecas de terceiros separadas, mas amplamente usadas para roteamento e gerenciamento de estado.
As diferenças visíveis são que o Vue normalmente usa arquivos de modelo HTML e o React usa apenas arquivos JavaScript. A biblioteca do Vue também possui um estado mutável e um sistema de redesenho automático de modelos chamado reatividade.Componentes
Na biblioteca do Vue, os componentes são conectados usando um método de API .component
que aceita argumentos de ID e um objeto com variáveis de definição. O desenvolvedor do React provavelmente notará os aspectos familiares e não familiares da definição dos componentes do Vue neste código:Vue.component('my-component', {
props: [ 'myprop' ],
data() {
return {
firstName: 'John',
lastName: 'Smith'
}
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
}
},
template: `
<div>
<p>Vue components typically have string templates.
<p>Here's some local state: {{ firstName }}
<p>Here's a computed value: {{ fullName }}
<p>Here's a prop passed down from the parent: {{ myprop }}
</div>
`,
created() {
setTimeout(() => {
this.message = 'Goodbye World'
}, 2000);
}
});
Modelo
Como você pode ver, o componente possui uma propriedade template
, que é uma sequência com marcação HTML. A biblioteca do Vue inclui um compilador que transforma essa string em uma função de renderização em tempo de execução. Essas funções de renderização usam o mecanismo DOM virtual.Você não pode usar a propriedade template
se, em vez disso, decidir criar sua própria função de renderização. Você pode até usar a marcação JSX no mundo React. Mas seria estranho mudar para Vue e fazê-lo desta maneira - como chegar à Itália e recusar pizza ...Ganchos de ciclo de vida
Os componentes do Vue têm métodos de ciclo de vida semelhantes aos dos componentes do React. Por exemplo, o gancho created
do exemplo acima inicia quando o estado ( state
) do componente está pronto , mas antes que o componente seja anexado à página. Reagir do mundo - getDerivedStateFromProps
.Mas há uma grande diferença: na biblioteca Vue, não há análogo da biblioteca React shouldComponentUpdate
. Isso não é necessário devido ao sistema de reatividade Vue.Redesenho de componentes
Uma das etapas para inicializar um componente é exibir todas as suas propriedades e transformá-las em getters e setters. Como você pode ver, a propriedade message
retirada dos dados originais ( props
) recebeu dois métodos adicionais - get
e set
:O Vue anexa essas funções para ativar o rastreamento de dependências e as notificações de alteração de propriedade quando um programa o lê ou altera.Estado mutável
Para alterar o estado no Vue, você não precisa chamar um método separado this.setState
, como é feito no React. Você acabou de escrever as alterações diretamente:
this.setState({ message: 'Hello World' });
this.message = 'Hello World';
Quando o valor do estado é alterado dessa maneira, o método set
desse valor é iniciado (veja acima). Set
escreve um novo valor, mas ele também tem mais uma tarefa: ele notifica a biblioteca de que esse valor foi alterado e que parte do layout, que depende do valor dessa variável no estado, pode precisar ser redesenhada.Se a variável for message
lançada mais como property ( prop
) nos componentes filhos, a biblioteca se lembrará disso e os componentes filhos também serão redesenhados automaticamente. É por isso que a biblioteca Vue não precisa de um método de ciclo de vida semelhante ao React shouldComponentUpdate
.Modelo principal
Em relação ao arquivo principal do modelo do projeto, o Vue é mais parecido com o Angular. Como no React, o modelo do Vue precisa ser montado em algum lugar da página:<body>
<div id="root"></div>
</body>
ReactDOM.render('...', document.getElementById('root'));
new Vue({
el: '#root'
});
No entanto, ao contrário do React, você pode adicionar um layout regular a esse elemento raiz. Se o React apagar tudo o que estiver dentro do elemento ao montar o componente #root
, o Vue salvará:<div id="root">
<div>You can add more markup to index.html</div>
<my-component v-bind:myprop="myval"></my-component>
</div>
Também existe uma maneira de definir modelos de componentes filhos no arquivo raiz html por meio de extensões HTML5, como x-template ou inline-template. Essa não é uma prática recomendada, pois separa o modelo da definição de todo o componente como um todo.Diretivas
Novamente, como em Angular, o Vue permite expandir os recursos do componente usando a lógica das "diretivas". Existem atributos HTML especiais com um prefixo v-
, por exemplo, v-if
para renderização com condições ou v-bind
para anexar uma expressão a um atributo HTML regular:new Vue({
el: '#app',
data: {
mybool: true,
myval: 'Hello World'
}
});
<div id="app">
<div v-if="mybool">This renders if mybool is truthy.</div>
<my-component v-bind:myprop="myval"></my-component>
</div>
O valor atribuído à diretiva é uma expressão JS; portanto, você pode consultar as propriedades dos dados, incluindo o uso de operadores ternários, etc.Organização do projeto
Não existe um equivalente oficial para react-create-app na biblioteca do Vue, no entanto, existe uma compilação feita pela comunidade de desenvolvedores do Vue: create-vue-app.A recomendação oficial para iniciar um projeto no Vue é vue-cli. Ele pode gerar tudo, desde um projeto simples com um arquivo HTML até um projeto de Webpack + Renderização do lado do servidor totalmente compactado:$ vue init template-name project-name
Projetos com um único arquivo HTML
O criador do Vue.js, Ewan Yu (You Yu Xi), chamou seu projeto de "uma estrutura progressiva" porque pode ser dimensionado para aplicativos complexos ou simplificado para aplicativos pequenos.Obviamente, o React também pode fazer isso. A diferença é que os projetos do Vue geralmente usam menos recursos do ES6 e raramente usam JSX, portanto, não precisam transpor código usando o Babel. Além disso, toda a biblioteca do Vue cabe em um arquivo, não há arquivos separados para os equivalentes do React, como o ReactDOM.Veja como adicionar o Vue a um projeto com um único arquivo HTML:<script src="https://unpkg.com/vue/dist/vue.js"></script>
Importante! Se você não usará seqüências de caracteres de modelo e, portanto, não precisar de um compilador de modelos, use uma versão simplificada da biblioteca que não possui essas funções - vue.runtime.js. É aproximadamente 20 KB a menos que cheio.Componente em um arquivo
Se você tiver a sorte de adicionar a fase de construção do seu projeto usando ferramentas como o Webpack, poderá usar os Componentes de arquivo único do Vue (SFCs, componentes do Vue em um único arquivo). Estes são arquivos com a extensão .vue
, eles encapsulam o modelo do componente, a configuração JS e os estilos em um arquivo:<template>
<div class="my-class">{{ message }}</div>
</template>
<script>
export default {
data() {
message: 'Hello World'
}
}
</script>
<style>
.my-class { font-weight: bold; }
</style>
Esse, sem dúvida, é um dos recursos mais notáveis da biblioteca Vue, porque você obtém o modelo HTML correto, mas a lógica JS está bem ali, bem ao lado dele e você não tem uma separação distorcida de apresentação e lógica.Há um carregador de Webpack chamado vue-loader responsável pela criação de SFCs. Durante o processo de montagem, o modelo é convertido em uma função de renderização, e isso é ideal para usar o assembly despojado vue.runtime.js no navegador.Redux e o resto
O Vue possui uma biblioteca de gerenciamento de estado baseada em fluxo chamada Vuex. Desta vez, é semelhante ao Redux, mas existem algumas diferenças.O que o desenvolvedor obtém ao mudar do React para o Vue?
Para entender completamente a questão, suplementei o artigo e disse quando é melhor escolher React e quando Vue.Mudar para o Vue provavelmente tornará mais fácil a entrada de novas pessoas no projeto. Os modelos do Vue podem ser escritos diretamente em HTML. Além disso, para pequenos projetos, não é necessário conhecer os recursos mais recentes do ES ++ e configurar o conjunto de códigos por meio de ferramentas como Webpack e Babel. O código do Vue pode ser escrito no estilo jQuery, ou seja, diretamente no modelo.O Vue também possui um conveniente sistema de entrega de mensagens prontas para uso. Os desenvolvedores não precisam se preocupar em chamar um método assíncrono setState
( como em React ) ou conectar bibliotecas externas para controlar a entrega de estado (como Mobx ).Por fim, os aplicativos escritos usando o Vue podem ser visivelmente mais fáceis: geralmente apenas a própria biblioteca ou mesmo sua versão simplificada do vue.runtime.js será necessária. Embora o desenvolvimento moderno do React seja quase impossível sem o Babel e pacotes volumosos de vários megabytes.Os projetos do Vue, por outro lado, podem ser muito complexos se você tiver um aplicativo grande ou lógica complexa no cliente. Se o layout for feito em um modelo HTML, fica mais difícil testar partes do aplicativo. O React, que usa apenas o código JS, fornece mais recursos para reutilizar e estender o código. Além disso, se você escrever no React, poderá reutilizar seu código ao escrever aplicativos para dispositivos usando o React-Native sem muita despesa. Este não é o caso do Vue.Portanto, a conclusão pode ser a seguinte:Mail.ru Cloud Solutions.