SlideShare a Scribd company logo
1 of 94
Fabulous -
Xamarin.Forms com
Elmish
@lucasteles42
@lucasteles
O que é Elmish?
“Uma linguagem agradável para webapps
confiáveis.”
Arquitetura
• Programação OO
• Models complexas e mutaveis
• UI estatica e declarativa
• View em uma 2 linguagem
• Complexas ferramentas de
design
MVVM(model-view-viewmodel)
MVU(model-view-update)
• Programação funcional
• Modelos simples e declarativos
• UI declarative e dinamica
• View na mesma linguagem DSL
• Ferramentas simples de live
coding
MVVM vs MVU
• Serviu de inspiração para o Redux
Como funciona?
Como funciona?
• Model / State
Como funciona?
• Model / State
• Message / Action
Como funciona?
• Model / State
• Message / Action
• Update / Reducer
Como funciona?
• Model / State
• Message / Action
• Update / Reducer
• View
Por que?
A Model é imutável,
o update é sempre
chamado de forma
síncrona, sem
problemas com
threads
Sua model se torna
a fonte única do
estado da sua
aplicação – Nunca
mais controlar
estado em múltiplas
camadas
Tendo uma UI virtual
por baixo dos panos
permite que você
consiga realizar
testes unitários em
tudo – Model, View,
Update
Funções de View
podem rodar fora da
thread de UI se
necessário
Por que?
A Model é imutável,
o update é sempre
chamado de forma
síncrona, sem
problemas com
threads
Sua model se torna
a fonte única do
estado da sua
aplicação – Nunca
mais controlar
estado em múltiplas
camadas
Tendo uma UI virtual
por baixo dos panos
permite que você
consiga realizar
testes unitários em
tudo – Model, View,
Update
Funções de View
podem rodar fora da
thread de UI se
necessário
Por que?
A Model é imutável,
o update é sempre
chamado de forma
síncrona, sem
problemas com
threads
Sua model se torna
a fonte única do
estado da sua
aplicação – Nunca
mais controlar
estado em múltiplas
camadas
Tendo uma UI virtual
por baixo dos panos
permite que você
consiga realizar
testes unitários em
tudo – Model, View,
Update
Funções de View
podem rodar fora da
thread de UI se
necessário
Por que?
A Model é imutável,
o update é sempre
chamado de forma
síncrona, sem
problemas com
threads
Sua model se torna
a fonte única do
estado da sua
aplicação – Nunca
mais controlar
estado em múltiplas
camadas
Tendo uma UI virtual
por baixo dos panos
permite que você
consiga realizar
testes unitários em
tudo – Model, View,
Update
Funções de View
podem rodar fora da
thread de UI se
necessário
Elm também é uma linguagem
Elm também é uma linguagem
Funcional
F#
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
• Cross platform
– Funciona com VS Code (e outros)
Sobre
• Desenvolvido pela Microsoft Research
– Incluído junto com Visual Studio in 2010
• Open source
– GitHub
• Cross platform
– Funciona com VS Code (e outros)
• Comunidade ativa
– fsharp.org
– F# Slack channel
Sobre
• Roda em cima do CLR
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
• É turing completa
Sobre
• Roda em cima do CLR
• Interopera com outras linguagens .NET
• É turing completa
• É possível usufruir de qualquer bibliotecas escritas em/para
C# tal como EntityFramework, ASP.NET, Xamarin, etc.
Introdução
Classes
Functional programming syntax
Imutabilidade
Não null por default
Igualdade estrutural
Tudo tem que ser inicializado!
Piping
Piping (F#)
Piping (F#)
Piping (F#)
Sistema de tipos algébrico
Tipos novos podem ser criados a
partir de tipos menores usando:
“AND” types
“AND” types
“OR” types
“OR” types
• Exemplo de alguns requisitos:
• Exemplo de alguns requisitos:
• Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
• Exemplo de alguns requisitos:
• Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
• Para dinheiro, não precisamos de nenhuma
informação extra
• Exemplo de alguns requisitos:
• Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
• Para dinheiro, não precisamos de nenhuma
informação extra
• Para cheques, precisamos do número do cheque
• Exemplo de alguns requisitos:
• Aceitamos três formas de pagamento: Dinheiro,
cheque ou cartão.
• Para dinheiro, não precisamos de nenhuma
informação extra
• Para cheques, precisamos do número do cheque
• Para cartões, precisamos do tipo de cartão e do
número do cartão
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Em F# iriamos compor os tipos da seguinte forma
Xamarin Forms com F#
Demo!
Xamarin Forms com
Fabulous (static view)
Model, Messages e
updates são
definidos no F#
Views são definidas
com XAML e data
bindings
A model de retorno
da função de
update atualiza os
bindings
A função de Vew
retorna a page
com os bindings
Demo!
Xamarin Forms com
Fabulous (Full-Elmish)
Model, Messages e
updates são
definidos no F#
Views são definidas
com no F# utilizando
virtual UI
A model de retorno
da função de
update atualiza a
UI virtual
A função Vew
retorna uma UI
virtual e o
framework Elmish
procura pelas
diferenças e
atualiza a UI
UI dinâmica vs Estática
UI dinâmica vs Estática
UI dinâmica vs Estática
UI dinâmica vs Estática
Demo!
let view (model: Model) dispatch =
View.ContentPage(content=
View.StackLayout(padding=30.0,verticalOptions = LayoutOptions.Center, children=[
View.Label(text= string model.Count, horizontalOptions=LayoutOptions.Center)
View.Button(text="Increment", command= (fun () -> dispatch Increment))
View.Button(text="Decrement", command= (fun () -> dispatch Decrement))
View.Slider(minimum=0.0, maximum=10.0, value=model.Step,
valueChanged= (fun args -> dispatch (SetStep (int args.NewValue))))
View.Label(text=sprintf "Step size: %d" model.Step, horizontalOptions=LayoutOptions.Center)
View.Button(text="Reset", horizontalOptions=LayoutOptions.Center,
command=(fun () -> dispatch Reset), canExecute = not model.Unchanged)
]))
Visitem https://fsharpforfunandprofit.com/
Perguntas?
@lucasteles
@lucasteles42
eu@lucasteles.net

More Related Content

Similar to Xamarin.Forms com Elmish e F

Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elmLucas Teles
 
Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Rodrigo Kono
 
Windows Phone 7 & Windows Azure
Windows Phone 7 & Windows AzureWindows Phone 7 & Windows Azure
Windows Phone 7 & Windows AzureVinicius Quaiato
 
Desktop App Converter: Trazendo Apps Win32 para a Windows Store
Desktop App Converter: Trazendo Apps Win32 para a Windows StoreDesktop App Converter: Trazendo Apps Win32 para a Windows Store
Desktop App Converter: Trazendo Apps Win32 para a Windows StoreIgor Abade
 
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobile
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobileXamarin + TDD - Reagindo rápido à mudanças no mundo mobile
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobileakamud
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosRodolfo Fadino Junior
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Renato Groff
 
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsQuebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsJosé Alexandre Macedo
 
Visual Studio Summit 2014 - Portable Class Library
Visual Studio Summit 2014 - Portable Class LibraryVisual Studio Summit 2014 - Portable Class Library
Visual Studio Summit 2014 - Portable Class LibraryThiago Lunardi
 
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2Loiane Groner
 
MVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoMVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoComunidade NetPonto
 
Programação orientada à objetos & mvc
Programação orientada à objetos & mvcProgramação orientada à objetos & mvc
Programação orientada à objetos & mvcJhordam Siqueira
 

Similar to Xamarin.Forms com Elmish e F (20)

Um melhor frontend com elm
Um melhor frontend com elmUm melhor frontend com elm
Um melhor frontend com elm
 
Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Desenvolviemento web com ASP.Net e MVC
Desenvolviemento web com ASP.Net e MVCDesenvolviemento web com ASP.Net e MVC
Desenvolviemento web com ASP.Net e MVC
 
Web Tools Pt Br
Web Tools Pt BrWeb Tools Pt Br
Web Tools Pt Br
 
Windows Phone 7 & Windows Azure
Windows Phone 7 & Windows AzureWindows Phone 7 & Windows Azure
Windows Phone 7 & Windows Azure
 
Desktop App Converter: Trazendo Apps Win32 para a Windows Store
Desktop App Converter: Trazendo Apps Win32 para a Windows StoreDesktop App Converter: Trazendo Apps Win32 para a Windows Store
Desktop App Converter: Trazendo Apps Win32 para a Windows Store
 
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobile
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobileXamarin + TDD - Reagindo rápido à mudanças no mundo mobile
Xamarin + TDD - Reagindo rápido à mudanças no mundo mobile
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São Carlos
 
Web tools pt-br
Web tools pt-brWeb tools pt-br
Web tools pt-br
 
ASP.NET 5, MVC 6 e além
ASP.NET 5, MVC 6 e alémASP.NET 5, MVC 6 e além
ASP.NET 5, MVC 6 e além
 
Introdução C#
Introdução C#Introdução C#
Introdução C#
 
Csharp
CsharpCsharp
Csharp
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
 
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsQuebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
Visual Studio Summit 2014 - Portable Class Library
Visual Studio Summit 2014 - Portable Class LibraryVisual Studio Summit 2014 - Portable Class Library
Visual Studio Summit 2014 - Portable Class Library
 
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2
DevInCachu 2012: Desenvolvendo Aplicacoes RIA com ExtJS 4 e Sencha Touch 2
 
MVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim PintoMVVM Deep Dive - Paulo Aboim Pinto
MVVM Deep Dive - Paulo Aboim Pinto
 
Programação orientada à objetos & mvc
Programação orientada à objetos & mvcProgramação orientada à objetos & mvc
Programação orientada à objetos & mvc
 

More from Lucas Teles

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijaoLucas Teles
 
Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Lucas Teles
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoLucas Teles
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Lucas Teles
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoLucas Teles
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticosLucas Teles
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxLucas Teles
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooksLucas Teles
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdcLucas Teles
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functionsLucas Teles
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedoresLucas Teles
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareLucas Teles
 

More from Lucas Teles (15)

Type script alem do arroz com feijao
Type script   alem do arroz com feijaoType script   alem do arroz com feijao
Type script alem do arroz com feijao
 
Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​Conheça ROP - Programação orientada e trilhos​
Conheça ROP - Programação orientada e trilhos​
 
TypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijãoTypeScript - Além do arroz com feijão
TypeScript - Além do arroz com feijão
 
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
Algoritmos genéticos aplicados no problema de roteirização de veículos com ja...
 
Algoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminhoAlgoritmos genéticos aplicados em problemas de busca de caminho
Algoritmos genéticos aplicados em problemas de busca de caminho
 
Algoritmos geneticos
Algoritmos geneticosAlgoritmos geneticos
Algoritmos geneticos
 
Aplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptxAplicações serverless com Blazor.pptx
Aplicações serverless com Blazor.pptx
 
Simplificando componentes com react hooks
Simplificando componentes com react hooksSimplificando componentes com react hooks
Simplificando componentes com react hooks
 
C# 8 e além
C# 8 e alémC# 8 e além
C# 8 e além
 
F# para devs c# tdc
F# para devs c#   tdcF# para devs c#   tdc
F# para devs c# tdc
 
Introducao a azure functions
Introducao a azure functionsIntroducao a azure functions
Introducao a azure functions
 
F# para devs c#
F# para devs c#F# para devs c#
F# para devs c#
 
Block chain para desenvolvedores
Block chain para desenvolvedoresBlock chain para desenvolvedores
Block chain para desenvolvedores
 
Generalização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo softwareGeneralização prematura e complexidade acidental, a raiz do mal de todo software
Generalização prematura e complexidade acidental, a raiz do mal de todo software
 
Net - Threads
Net - ThreadsNet - Threads
Net - Threads
 

Xamarin.Forms com Elmish e F

  • 2. O que é Elmish?
  • 3.
  • 4. “Uma linguagem agradável para webapps confiáveis.”
  • 6. • Programação OO • Models complexas e mutaveis • UI estatica e declarativa • View em uma 2 linguagem • Complexas ferramentas de design MVVM(model-view-viewmodel) MVU(model-view-update) • Programação funcional • Modelos simples e declarativos • UI declarative e dinamica • View na mesma linguagem DSL • Ferramentas simples de live coding
  • 8. • Serviu de inspiração para o Redux
  • 11. Como funciona? • Model / State • Message / Action
  • 12. Como funciona? • Model / State • Message / Action • Update / Reducer
  • 13. Como funciona? • Model / State • Message / Action • Update / Reducer • View
  • 14.
  • 15. Por que? A Model é imutável, o update é sempre chamado de forma síncrona, sem problemas com threads Sua model se torna a fonte única do estado da sua aplicação – Nunca mais controlar estado em múltiplas camadas Tendo uma UI virtual por baixo dos panos permite que você consiga realizar testes unitários em tudo – Model, View, Update Funções de View podem rodar fora da thread de UI se necessário
  • 16. Por que? A Model é imutável, o update é sempre chamado de forma síncrona, sem problemas com threads Sua model se torna a fonte única do estado da sua aplicação – Nunca mais controlar estado em múltiplas camadas Tendo uma UI virtual por baixo dos panos permite que você consiga realizar testes unitários em tudo – Model, View, Update Funções de View podem rodar fora da thread de UI se necessário
  • 17. Por que? A Model é imutável, o update é sempre chamado de forma síncrona, sem problemas com threads Sua model se torna a fonte única do estado da sua aplicação – Nunca mais controlar estado em múltiplas camadas Tendo uma UI virtual por baixo dos panos permite que você consiga realizar testes unitários em tudo – Model, View, Update Funções de View podem rodar fora da thread de UI se necessário
  • 18. Por que? A Model é imutável, o update é sempre chamado de forma síncrona, sem problemas com threads Sua model se torna a fonte única do estado da sua aplicação – Nunca mais controlar estado em múltiplas camadas Tendo uma UI virtual por baixo dos panos permite que você consiga realizar testes unitários em tudo – Model, View, Update Funções de View podem rodar fora da thread de UI se necessário
  • 19. Elm também é uma linguagem
  • 20. Elm também é uma linguagem Funcional
  • 21. F#
  • 22. Sobre • Desenvolvido pela Microsoft Research – Incluído junto com Visual Studio in 2010
  • 23. Sobre • Desenvolvido pela Microsoft Research – Incluído junto com Visual Studio in 2010 • Open source – GitHub
  • 24. Sobre • Desenvolvido pela Microsoft Research – Incluído junto com Visual Studio in 2010 • Open source – GitHub • Cross platform – Funciona com VS Code (e outros)
  • 25. Sobre • Desenvolvido pela Microsoft Research – Incluído junto com Visual Studio in 2010 • Open source – GitHub • Cross platform – Funciona com VS Code (e outros) • Comunidade ativa – fsharp.org – F# Slack channel
  • 26. Sobre • Roda em cima do CLR
  • 27. Sobre • Roda em cima do CLR • Interopera com outras linguagens .NET
  • 28. Sobre • Roda em cima do CLR • Interopera com outras linguagens .NET • É turing completa
  • 29. Sobre • Roda em cima do CLR • Interopera com outras linguagens .NET • É turing completa • É possível usufruir de qualquer bibliotecas escritas em/para C# tal como EntityFramework, ASP.NET, Xamarin, etc.
  • 31.
  • 32.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 42.
  • 43.
  • 44.
  • 45. Não null por default
  • 46.
  • 47.
  • 49.
  • 50.
  • 51.
  • 52. Tudo tem que ser inicializado!
  • 53.
  • 54.
  • 55.
  • 60. Sistema de tipos algébrico
  • 61. Tipos novos podem ser criados a partir de tipos menores usando:
  • 66. • Exemplo de alguns requisitos:
  • 67. • Exemplo de alguns requisitos: • Aceitamos três formas de pagamento: Dinheiro, cheque ou cartão.
  • 68. • Exemplo de alguns requisitos: • Aceitamos três formas de pagamento: Dinheiro, cheque ou cartão. • Para dinheiro, não precisamos de nenhuma informação extra
  • 69. • Exemplo de alguns requisitos: • Aceitamos três formas de pagamento: Dinheiro, cheque ou cartão. • Para dinheiro, não precisamos de nenhuma informação extra • Para cheques, precisamos do número do cheque
  • 70. • Exemplo de alguns requisitos: • Aceitamos três formas de pagamento: Dinheiro, cheque ou cartão. • Para dinheiro, não precisamos de nenhuma informação extra • Para cheques, precisamos do número do cheque • Para cartões, precisamos do tipo de cartão e do número do cartão
  • 71.
  • 72. Em F# iriamos compor os tipos da seguinte forma
  • 73. Em F# iriamos compor os tipos da seguinte forma
  • 74. Em F# iriamos compor os tipos da seguinte forma
  • 75. Em F# iriamos compor os tipos da seguinte forma
  • 76. Em F# iriamos compor os tipos da seguinte forma
  • 77. Em F# iriamos compor os tipos da seguinte forma
  • 79. Demo!
  • 80.
  • 81. Xamarin Forms com Fabulous (static view)
  • 82. Model, Messages e updates são definidos no F# Views são definidas com XAML e data bindings A model de retorno da função de update atualiza os bindings A função de Vew retorna a page com os bindings
  • 83. Demo!
  • 84. Xamarin Forms com Fabulous (Full-Elmish)
  • 85. Model, Messages e updates são definidos no F# Views são definidas com no F# utilizando virtual UI A model de retorno da função de update atualiza a UI virtual A função Vew retorna uma UI virtual e o framework Elmish procura pelas diferenças e atualiza a UI
  • 86. UI dinâmica vs Estática
  • 87. UI dinâmica vs Estática
  • 88. UI dinâmica vs Estática
  • 89. UI dinâmica vs Estática
  • 90. Demo!
  • 91.
  • 92. let view (model: Model) dispatch = View.ContentPage(content= View.StackLayout(padding=30.0,verticalOptions = LayoutOptions.Center, children=[ View.Label(text= string model.Count, horizontalOptions=LayoutOptions.Center) View.Button(text="Increment", command= (fun () -> dispatch Increment)) View.Button(text="Decrement", command= (fun () -> dispatch Decrement)) View.Slider(minimum=0.0, maximum=10.0, value=model.Step, valueChanged= (fun args -> dispatch (SetStep (int args.NewValue)))) View.Label(text=sprintf "Step size: %d" model.Step, horizontalOptions=LayoutOptions.Center) View.Button(text="Reset", horizontalOptions=LayoutOptions.Center, command=(fun () -> dispatch Reset), canExecute = not model.Unchanged) ]))