Alguém pode explicar a diferença entre a vinculação de dados unilateral do Reacts e a vinculação de dados bidirecional do Angular

109

Estou um pouco confuso sobre esses conceitos, se eu construir o mesmo aplicativo ToDo completamente em AngularJS e ReactJS --- o que faz o React ToDo usar a vinculação de dados unilateral em vez da vinculação de dados bidirecional do AngularJS?

Eu entendo que o React funciona como

Render (dados) ---> UI.

Como isso é diferente do Angular?

WinchenzoMagnifico
fonte

Respostas:

165

Angular

Quando angular configura a ligação de dados, existem dois "observadores" (isto é uma simplificação)

//js
$scope.name = 'test';
$timeout(function()  { $scope.name = 'another' }, 1000);
$timeout(function()  { console.log($scope.name); }, 5000);

<!-- html --->
<input ng-model="name" />

A entrada começará com teste depois será atualizada anotherem 1000 ms. Quaisquer alterações $scope.name, seja do código do controlador ou alterando a entrada, serão refletidas no log do console 4000 ms depois. As alterações no <input />são refletidas na $scope.namepropriedade automaticamente, já que o ng-modelset up observa a entrada e notifica $scopeas alterações. As alterações no código e no HTML são vinculativas de duas vias . (Veja este violino )

Reagir

O React não possui um mecanismo para permitir que o HTML altere o componente. O HTML só pode gerar eventos aos quais o componente responde. O exemplo típico é usando onChange.

//js
render() { 
    return <input value={this.state.value} onChange={this.handleChange} />
}
handleChange(e) {
    this.setState({value: e.target.value});
}

O valor de <input />é controlado inteiramente pela renderfunção. A única maneira de atualizar esse valor é a partir do próprio componente, o que é feito anexando um onChangeevento ao <input />qual é definido this.state.valuecom o método do componente React setState. O <input />não tem acesso direto ao estado dos componentes e, portanto, não pode fazer alterações. Esta é uma ligação unilateral . (Confira este código )

Kyeotic
fonte
9
Obrigado, isso foi extremamente informativo. Então eu acho que o Angular funciona mais como UI <----> Data em contraste com Render (dados) do React ---> UI?
WinchenzoMagnifico
Sim, essa é uma maneira muito concisa de colocar isso
Kyeotic
5
Para ser claro, o que distingue a vinculação de dados é que ela faz as atualizações automaticamente . No exemplo React, UI → dados ainda estão acontecendo, mas isso não acontece por padrão - você tem que configurar manualmente o onChangeouvinte e executar handleChange. Mas a partir daí, por causa dos dados de Reagir uma forma de ligação, os dados → atualização UI não acontecer automaticamente.
Adam Zerner
Para sua informação, o violino precisava de uma referência ao AngularJS 1.1.1, acho que a referência ao AngularJS 1.0.1 não era mais válida, estava recebendo um 404. Estranhamente, usar código idêntico em um violino totalmente novo (com uma referência 1.1.1) falha , não sei do que se trata.
Josh Sutterfield
194

Fiz um pequeno desenho. Espero que esteja claro o suficiente. Me avise se não for!

2 vias de ligação de dados VS 1 via de ligação de dados

Gabriel
fonte
21
O que é 'Titre de l'annonce'?
ghd
6
'Título do anúncio' em francês
timelf123
14
@DamienRoche, tanto quanto eu entendo este conceito, a diferença está a seguir: Em ligação de dados bidirecional: alterando a visualização das mudanças de dados e vice-versa - atualizando a entrada dentro dos dados de atualização da visualização. Fluxo de dados no caminho: atualizar a visualização de atualizações de dados, mas atualizar a entrada na visualização não atualizará os dados, a menos que o programador faça isso explicitamente, anexando o listener à entrada, que atualizará os dados. Espero que isso torne isso um pouco mais claro para você.
Cake_Seller de
2
Obrigado, @Patrick por sua mensagem. Fico sempre muito feliz em sentir que algo que fiz é útil para os outros
Gabriel
link está quebrado @Gabriel você poderia compartilhar a imagem no post?
user3141326
12

A vinculação de dados bidirecional fornece a capacidade de pegar o valor de uma propriedade e exibi-lo na visualização, ao mesmo tempo em que tem uma entrada para atualizar automaticamente o valor no modelo. Você poderia, por exemplo, mostrar a propriedade "tarefa" na visualização e vincular o valor da caixa de texto a essa mesma propriedade. Portanto, se o usuário atualizar o valor da caixa de texto, a visualização será atualizada automaticamente e o valor deste parâmetro também será atualizado no controlador. Em contraste, a associação unilateral apenas vincula o valor do modelo à visualização e não tem um inspetor adicional para determinar se o valor na visualização foi alterado pelo usuário.

Com relação ao React.js, ele não foi realmente projetado para vinculação de dados bidirecional, no entanto, você ainda pode implementar a vinculação bidirecional manualmente adicionando alguma lógica adicional, consulte por exemplo este link . No Angular.JS, a vinculação bidirecional é um cidadão de primeira classe, portanto, não há necessidade de adicionar essa lógica.

Alex
fonte