Seija
首页
Travellings
登录
注册
首页
文章
Yesod - 组件 (4)
# 组件 web 开发的困难之一,我们必须配合三种客户端技术:HTML,CSS,Javascript。更糟糕的是,我们必须把它放在网页的不同位置:CSS在head中一个style标签,Javascript在body标签前script标签中,HTML在body中。如果你想要把你的CSS和Javascript放在在单独的文件中,你不用担心这些! 在实践中,创建一个单页面,这种方式能够工作得很好,因为我们可以分离我们的结构(HTML),样式(CSS),逻辑(Javascript)。但是当我们想将其模块化以至于能够更容易的组合,协调这三块内容就会变得非常头疼。组件就是Yesod对这种问题的解决方案。这样对于防止重复包含库问题,也能很好的解决。 我们四种模板语言-Hamlet,Cassius,Lucius,Julius,提供了原始的工具来构建你的输出。组件提供了粘合剂来让它们之间无缝衔接。 ## 概要 ```haskell {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} import Yesod data App = App mkYesod "App" [parseRoutes| / HomeR GET |] instance Yesod App getHomeR = defaultLayout $ do setTitle "My Page Title" toWidget [lucius| h1 { color: green; } |] addScriptRemote "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" toWidget [julius| $(function() { $("h1").click(function(){ alert("You clicked on the heading!"); }); }); |] toWidgetHead [hamlet|
|] toWidget [hamlet|
Here's one way of including content |] [whamlet|
Here's another |] toWidgetBody [julius| alert("This is included in the body itself"); |] main = warp 3000 App ``` 会产生如下HTML(已经加入缩进) ```haskell
My Page Title
Here's one way of including content
Here's another
``` ## 组件内容 从表面上看, HTML 文档是由一系列 HTML 标签嵌套组成. 这也是大多数 HTML 生成工具所采用的方法: 自己定义HTML标签层级关系, 工具来生成 HTML 文档. 但是,仔细想想, 如果我要为一个页面写一个组件来显示导航栏, 而且能够像插头一样,插上即用: 在合适的时间来调用方法, 一个导航栏就会被插入到正确的地方. 这里就是传统 HTML 的短板了, 我们的导航栏由 html, JavaScript, CSS 组成. 等到我们调用导航栏方法的时候, `head`标签已经被渲染了, 所有,此时添加新的`style`标签来生命 CSS 已经太晚了.按照常规策略, 我们需要把我们的导航栏拆分成 JavaScript, CSS, HTML 三部分, 并且确保我们总能访问到这三部分内容. 组件使用了一种另外的途径, 小部件不是将HTML文档视为一个整体标签树,而是在页面中看到许多不同的组件 尤其是: * HTML 标题 * 外部 CSS * 外部 JavaScript * CSS 声明 * JavaScript 代码 * 任意的 `head` 内容 * 任意的 `body` 内容 不同的组件有不同的语义. 例如, 只可能有一个标题, 可以有多个外部 JavaScript 和 外部样式表.但是这些外部脚本和样式表都只能被引入一次. head 和 body里面可以有任意内容, 换句话说,就是没有任何限制(可能有人只想放几个毫无意义的区块而已). 组件的作用就是使用合适的逻辑组合不同的组件。比如取最后一个title替换掉其他的,过滤掉重复的外部JavaScript和CSS,连接head和body的内容。 ## 构造组件 为了使用组件,你很显然需要能够掌握他们。最常用的方法是使用`ToWidget`类型类和`toWidget`函数。这些能让你把你的Shakespearean templates直接转化为组件。Hamlet代码出现在``里面,Julius脚本出现`