复制**Book**P57中间的代码到新的模块中,不要忘记增加
module XXX where
需要增加以下两个库到.cabal中
http-types
blaze-builder
$ renderHtml $[hamlet|...|] render
我认为执行顺序是这样
hamlet识别到@?,调用render函数,并将@?{...}中的值传递给render函数,这个{..}被解析为两项,first恰好是一个SomePage,第二项是一个[(Text,Text)],这一点从
[(``page``),pack $ ...]上可以看出来
如果我们需要改进render函数,需要注意其参数形式必须是render::XXX->[(Text,Text)]->YYY,其中XXX可自行定义, YYY是由调用函数(这里是renderHtml函数)决定的,[(Text,Text)]是由@?{..}的第二项决定
了解了上面这点,那这里的render就比较好理解了,我们来实际看一下
"/home" `append` decodeUtf8 (toByteString $ renderQueryText True (map (second Just) (SomePage,("page",pack $ show $ 3-1)))
=> "/home" `append` decodeUtf8 (toByteString $ renderQueryText True Some("page",Just(pack 2))
=> "/home" `append` decodeUtf8("?page=2")
=> "/home?page=2"
关于上面这一段解析,读者可尝试去掉render函数中的部分代码来自行检查
HTML标签属性
- 属性表值可用 A=B表示
- class值可以简写为 .classType
如果id不用计算,可以直接用#idvalue表示,如果需要计算,则仍然需要使用id=#{…}来设置
=两侧的文本,如果没有替换值,则左侧的成为key,右侧的用双引号包裹后作为value
条件标签
$if isAdmin
XXX
$elseif isLoggin
YYY
$else
ZZZ
maybe判断
$maybe name <- maybename
Something
$nothing
Nothing
别忘记了maybe判断中可以直接使用模式匹配
$maybe Person firstname lastname <- maybename
Something
for标签
<ul>
$for person <- people
<li>Something
case标签
$case foo
$of Left bar
Something
$of Right baz
Something
with标签(不是很理解,留待以后解决)
doctype
为代码直接加上Html头
$doctype 5
<html>
<head>...
<body>...
本文介绍如何使用 Hamlet 模板引擎处理 Web 页面的动态内容生成,详细解析了 render 函数的工作原理及其参数配置,同时展示了 HTML 标签及属性的使用技巧。
388

被折叠的 条评论
为什么被折叠?



