Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

A set of libraries that allow Router-like experiences for general purpose F# Apps

License

NotificationsYou must be signed in to change notification settings

AngelMunoz/Navs

Repository files navigation

Welcome to the Navs Family documentation.

This documentation is a work in progress.

This project contains the following libraries:

Navs

Navs is a router-like abstraction inspired by web routers such as vue-router, angular-router and similar projects.

It is primarily a "core" library which you would usually depend on in your own projects, as it is very generic and while F# can be very intelligent about type inference, it tends to produce quite verbose signatures. For more information visit the Navs section in these docs.

A Compelling Example:

letroutes=[  Route.define<string>("home","/",(fun _->"Home"))  Route.define<string>("about","/about",(fun _->"About"))  Route.define<string>("guid","/:id<guid>",fun context _->async{do! Async.Sleep(90)returnmatch context.getParam<Guid>"id"with| ValueSome id-> sprintf"Home%A" id| ValueNone->"Guid No GUID"})]letrouter= Router.build<string>(routes)router.Content.AddCallback(fun content-> printfn $"%A{content}")let!result1= router.navigate("/about")let!result2= router.navigate("/home")let!result3= router.navigate("/123e4567-e89b-12d3-a456-426614174000")// "About"// "Home"// "Home 123e4567-e89b-12d3-a456-426614174000"

Navs.Avalonia

This project attempts to hide the generics from call sites and offer a few DSLs to make it easier to use Navs in Avalonia applications. This router was designed to be used with Raw Avalonia Control classes however, it will pair very nicely with theNXUI project, Feel free to check the C# and F# samples in theSamples folder in the source code repository.

A Compelling Example:

letroutes=[  Route.define("guid",// routes can be typed!"/:id<guid>",fun context _->async{// you can pre-load data if you want todo! Async.Sleep(90)return// extract parameters from the URLmatch context.getParam<guid>"id"with| ValueSome id-> TextBlock().text(sprintf"Home%A" id)| ValueNone-> TextBlock().text("Guid No GUID")})// Simpler non-async routes are also supported  Route.define("books","/books",(fun _ _-> TextBlock().text("Books")))]letnavigate url(router:IRouter<Control>)_ _=task{// navigation is asynchronous and returns a result// in order to check if the navigation was successfullet!result= router.Navigate(url)match resultwith| Ok_->()| Error e-> printfn $"%A{e}"}|> ignoreletapp()=letrouter:IRouter<Control>= AvaloniaRouter(routes, splash=fun _-> TextBlock().text("Loading..."))  Window()    .content(      DockPanel()        .lastChildFill(true)        .children(          StackPanel()            .DockTop()            .OrientationHorizontal()            .spacing(8)            .children(              Button().content("Books").OnClickHandler(navigate"/books" router),              Button()                .content("Guid")                .OnClickHandler(navigate $"/{Guid.NewGuid()}" router)),          RouterOutlet().router(router)))NXUI.Run(app,"Navs.Avalonia!", Environment.GetCommandLineArgs())|> ignore

Navs.FuncUI

In a similar Fashion of Navs.Avalonia, this project attempts to provide a smooth API interface forAvalonia.FuncUI, you can find a sample in theSamples folder in the source code repository.

A Compelling Example:

letroutes=[  Route.define("books","/books",(fun _ _-> TextBlock.create[ TextBlock.text"Books"]))  Route.define("guid","/:id<guid>",fun context _->async{return        TextBlock.create[match context.getParam<guid>"id"with| ValueSome id-> TextBlock.text $"Visited: {id}"| ValueNone-> TextBlock.text"Guid No GUID"]})]letappContent(router:IRouter<IView>,navbar:IRouter<IView>->IView)=  Component(fun ctx->letcurrentView= ctx.useRouter router    DockPanel.create[      DockPanel.lastChildFilltrue      DockPanel.children[ navbar router; currentView.Current]])

UrlTemplates

This is a library for parsing URL-like strings into structured objects. It is used by Navs to parse navigable URLs and URL templates to find if they match.

Currently this library is mainly aimed to be used from F# but if there's interest in using it from C# I can add some more friendly APIs.

A Compelling Example:

openUrlTemplates.RouteMatcherlettemplate="/api/v1/profiles/:id<int>?optionalKey<guid>&requiredKey!#hash"leturl="/api/v1/profiles/2345?requiredKey=2#hash"match RouteMatcher.matchStrings template urlwith| Ok(urlTemplate, urlInfo, urlMatch)->let{ Segments= foundParams; Query= queryParams; Hash= foundHash}= urlTemplate// foundParams// [ Plain ""; Plain "api"; Plain "v1"; Plain "profiles"; Param ("id", "2345");]// query// [Optional "optionalKeyu", Guid; Required "requiredKey", Int]// hash// "hash"let{ Params= urlParams; Query= query; Hash= hash}= urlInfo// urlParams// [ ""; "api"; "v1"; "profiles"; "2345" ]// query// [ "optionalKey", String ValueNone; "requiredKey", String ValueSome "2"]// hash// ValueSome "hash"let{ Params= foundParams; QueryParams= queryParams; Hash= foundHash}= urlMatch// foundParams// { { "id", box 2345 } }// queryParams// { { "requiredKey", box "2" } }// foundHash// ValueSome "hash"| Error errors->for ein errorsdo    printfn $"%A{e}"

[8]ページ先頭

©2009-2025 Movatter.jp