美文网首页
Jade入门,jade基础语法

Jade入门,jade基础语法

作者: suchcl | 来源:发表于2018-11-01 13:33 被阅读0次

    jade模板语法

    jade写的网页的demo

    doctype html
    html(lang="zh-CN")
        head
            meta(charset="UTF-8")
            title jadeTest
        body
            .container
                .header
                    .menu
                        .nav
                            li
                                a(href="#") 首页
                            li
                                a(href="#") 新闻中心
                .center
                    .row
                        .size1
                            .box.timely-msg
                                .hd
                                    h2
                                        a(href="#") 及时消息
                                .bd
                                    ul.list
                                        li
                                            a(href="#") 这款合资车售价18万,2.0T+8速动力,比迈腾还有面子,车标成亮点
                        .size2
                            .box.news-list
                                .hd
                                    h2
                                        a(href="#") 新闻列表
                                .bd
                                    ul.list
                                        li
                                            a(href="#") 这款合资车售价18万,2.0T+8速动力,比迈腾还有面子,车标成亮点
                .footer
                    p 公司版权,违者必究
    

    jade的特点

    p 不像HTML一样,有<>包围标签,jade中的标签的属性使用紧跟元素后面的小括号()括号括起来,属性值使用引号;

    p 另外,jade元素没有相应的开始和结束标记,是通过标记的缩进来表示从属关系,这一点应该是和python的语法类似;

    语法

    doctype

    p HTML文档的开始需要声明文档的类型,具体的声明方式为:

    <!DOCTYPE html>
    

    p jade中相应的声明方式为:

    doctype html
    

    元素和属性

    p HTML中的元素和属性,元素的开始和结束标记,都是通过<>来标识,而在jade中,不需要使用<>标记元素的开始和结束。HTML中的元素属性,需要显示的声明属性的类型,如class、ID,jade中使用#表示id,.来表示class。

    #user
        .face
            a(href="#") 修改头像
    

    对应的HTML为:

    <div id="user">
        <div class="face"><a href="#">修改头像</a></div>
    </div>
    

    如果元素只有一个属性的时候,直接跟在元素后面的()中标明属性名并赋给相应的值就可以了,但如果元素有多个属性,那么元素的属性之间使用逗号(,)分割

    #user
        .face
            a(href="#",target="_blank") 修改头像
    
    <div id="user">
        <div class="face"><a href="#" target="_blank">修改头像</a></div>
    </div>
    

    元素包含的内容

    1. 元素包含的内容,可以直接将内容跟在元素标签的后面;
    .text 全面屏iPad来了!最低售价6499元,果粉们剁手吗
    
    1. 使用"="来设置元素包含的内容
    .text="全面屏iPad来了!最低售价6499元,果粉们剁手吗"
    

    上面2行代码对应的html为:

    <div class="text">全面屏iPad来了!最低售价6499元,果粉们剁手吗</div>
    <div class="text">全面屏iPad来了!最低售价6499元,果粉们剁手吗</div>
    

    jade中的=

    jade中的=后面可以跟任何表达式,这个表达式可以是字符串,可以是变量,也可以是函数,或者是表达式运算的结果。但需要注意,=后面的内容会被转码(escape)

    注意:=和前面的元素之间不要有空格,如果出现了空格,=则会被认为是前面元素的内容

    =后跟字符串
    .text="Hello world!<b>Hello world!</b>"
    

    解释为HTML后为:

    <div class="text">Hello world!&lt;b&gt;Hello world!&lt;/b&gt;</div>
    

    =后面的内容会被转码,如果不想后跟的内容被转码,则在=前面加!

    .text!="Hello " + "<b>world!</b>"
    

    解释为HTML后的内容为:

    <div class="text">Hello <b>world!</b></div>
    
    =后跟变量
    ul.list
        -var arr = ['one','two','three'];
        each item in arr
            li= item
    

    这里的=后跟变量,还涉及到了jade的另外一个语法,jade的逻辑语法以及jade内嵌js代码

    jade中元素的布尔属性

    jade中元素的布尔属性设置为false,则不加入到元素中;如果元素中的布尔属性设置值为true或者不设置值,都会在元素中加入布尔属性

    input(placeholder="请输入用户名",disabled)
    input(placeholder="请输入密码",disabled=true)
    input(placeholder="请确认密码",disabled=false)
    

    解释为HTML后为:

    <input placeholder="请输入用户名" disabled>
    <input placeholder="请输入密码" disabled>
    <input placeholder="请确认密码">
    

    jade中元素添加内联样式

    jade中元素添加内联样式,和为元素添加属性的方式基本一致,不同的是内联样式的属性会有多个,这多个属性,可以放到一个{}中,可以简单理解为js中的对象。

    .text(style={color:'#f20',padding:'5px 10px'}) Hello World!
    

    解释为HTML后的代码为:

    <div style="color:#f20;padding:5px 10px" class="text">Hello World!</div>
    

    jade元素添加内联样式,基本的方式就和上面介绍的一致,但有些特殊的地方,暂时还没有琢磨清楚,就是当属性名有-分隔的时候如font-size,在jade中内联样式中怎么书写,还不知道。

    jade自闭合标签

    HTML5标准要求自闭合元素不需要闭合标签,即最后的/不需要手动添加,有时为了兼容一些老版本的HTML标准的时候,需要后面的闭合标签,那么可以在自闭合标签后面紧跟一个/即可。

    上面是文档介绍的,但我测试了几次,好像都没有实现,这个已经不重要了,现在的HTMl文档的标准是实现HTML5规范,HMTL5标准规范已经不允许使用自闭合标签的结束标签了。

    input(placeholder="请输入用户名")/
    img(src="../images/img-face.jpg")/
    

    这个测试效果和文档介绍的结果不一致,现在也不那么重要了,解释后的HTML代码也没有添加自闭合的/。

    jade中的特殊字符|

    |在jade中是一个特殊的字符,它告诉jade模板解析器将后面的内容原样输出,|后面也可以跟HTML元素。

    a(href="http://www.baidu.com") 百度
    | bc 我查找信息,喜欢百度
    | <a href="http://www.google.com">我想查找信息,不喜欢百度,喜欢谷歌</a>
    

    解析为HTML的对应代码为:

    <a href="http://www.baidu.com">百度</a>
    bc 我查找信息,喜欢百度
    <a href="http://www.google.com">我想查找信息,不喜欢百度,喜欢谷歌</a>
    

    比如我们希望得到

    <a href="http://www.baidu.com">百度</a>
    bc 我查找信息,喜欢百度
    

    这样的结果输出,如果我们直接使用前面提供的语法,

    a(href="http://www.baidu.com") 百度
    bc 我查找信息,喜欢百度
    

    那么得到的结果将是

    <a href="http://www.baidu.com">百度</a>
    <bc>我查找信息,喜欢百度</bc>
    

    jade解析器默认回家字母解析为标签,即使bc后面紧跟这后面的文字,jade解析器也会将bc解析为标记。这个时候使用jade的特殊字符|就可以解决这个问题,可以让后面的元素原样输出。
    如果没有bc等字母的话,仅仅是文字,那是可以得到预期的结果输出的

    <a href="http://www.baidu.com">百度</a>
    我查找信息,喜欢百度
    

    #[]语法

    如果我想在一段文本中插入一段jade语句,就需要#[]语法了。我们可以将jade语句写在[]中,就可以被jade解释器解释成html语句了

    .text Hello,#[span John]
    

    解释后的HTML为:

    <div class="text">Hello,<span>John</span></div>
    

    jade中内嵌javascript

    jade作为模板引擎,可以在jade代码中嵌入js代码,这里的js代码是作为服务端的代码来执行进行逻辑处理的,而不是常规的html网页中的浏览器的行为。

    单行js代码

    jade中嵌入单行js代码时,嵌入的js代码需要以“-”开头

    ul.list
        -for(var i = 0; i < 3; i++)
            li= i + "我就是个新闻列表"
    

    解释后对应的HTML

    <ul class="list">
        <li>0我就是个新闻列表</li>
        <li>1我就是个新闻列表</li>
        <li>2我就是个新闻列表</li>
    </ul>
    

    jade中=跟内容的时候,=和前面的元素不要留有空格,如果留空格的话,=就会被当作当前元素的内容来处理了

    多行js代码

    当在jade中嵌入多行js代码的时候,可以在每行js代码都以“-”开头,也可以让"-"独占一行,然后js代码做缩进书写。

    ul.list
        -
            var n = 4;
            for(var j = 1; j < n; j++)
                li= j + "实时消息"
    

    预期的输出HTML应该如下:

    <ul class="list">
        <li>1实时消息</li>
        <li>2实时消息</li>
        <li>3实时消息</li>
    </ul>
    

    上面的是文档介绍的语法,预期的输出应该是上面的输出,但我实际使用的时候并没有任何的输出,可能是现在的语法有变化,我没有细究。我真正实现嵌套多行js代码,仍旧是每行js代码以"-"开头。

    ul.list
        -var n = 4;
        -for(var j = 1; j < n; j++)
            li= j + "实时消息"
    

    实际输出结果值如下:

    <ul class="list">
        <li>1实时消息</li>
        <li>2实时消息</li>
        <li>3实时消息</li>
    </ul>
    

    jade的逻辑语法

    jade自己有一些逻辑的语法,可以与js一起使用,这些jade语句前面不需要使用-开头。和python语法类似。

    遍历 each...in

    ul.list
        -var university = ['北京大学','清华大学','中国传媒大学'];
        each item in arr
            li= item
    

    这里的=后跟的是变量,变量item

    each...in还可以获取到迭代变量的索引

    ul.list
        -var city = ['北京','上海','深圳'];
        each item,index in city
            li=index + ": " + item
    

    解释后的对应HTML为:

    <ul class="list">
        <li>0: 北京</li>
        <li>1: 上海</li>
        <li>2: 深圳</li>
    </ul>
    

    上面的便利对象是数组,each ... in语法遍历数组的时候,可以有2个变量,第一个变量为数组的项,第二个参数为数组的索引。

    each...in语法还可以遍历对象。遍历对象的时候,each...in语法也是可以有2个参数,第一个参数为value,第二个参数为key。

    ul.list
        -var obj = {"address":"北京","mobile":"13278787878","job":"Teacher"};
        each item,key in obj
            li= key + ":" + item
    

    解释后对应的HTML

    <ul class="list">
        <li>address:北京</li>
        <li>mobile:13278787878</li>
        <li>job:Teacher</li>
    </ul>
    

    循环 while

    这个语法没想好怎么解释,就借用其他编程语言的解释吧,不说了,这里就是一个while...do的操作。

    ul.list
        -var num = 1;
        while num < 4
            li= num++
    

    最后一行自增预算,也可以拆开来写,像js一样。

    l.list
        -var num = 0;
        while num < 4
            li= num
            -num++
    

    解释后对应的HTML:

    <ul class="list">
        <li>0</li>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    

    条件判断

    条件判断,jade和其他编程语言的语法基本一致,起码使用的关键词是一致的,都为if。

    jade中也可以使用取反操作,如!flag

    -var flag = false;
        if(flag)
            .text 有权限
        else if(!flag)
            .text 没有权限
        else
            .text 谁知道有没有权限
    
    

    case语法

    jade中没有了switch,添加了case,这里也仅仅就是改了个名词,改了跟叫发,使用和实现方法是完全一样的。

    -var gender = 1;
        case gender
            when 0
                p 男
            when 1
                p 女
            default
                p 保密
    
    <p>女</p>
    

    复用块

    jade中可以通过mixin定义复用块,定义方式为:mixin + 复用块的名称,使用方式为:+复用块名称
    mixin下面的为复用块的内容,复用块需要先定义后使用。即在定义服用快之前,不能使用,而在定义了复用块以后的代码中,使用位置不限。

    mixin showName
        .name Nicholas
    +showName
        .text 我是java开发程序员
    +showName
    

    可以将复用块简单的理解为函数,可以向复用块中传递参数,使复用块更加具有灵活性

    mixin box(cls,title)
        .box(class=cls)
            .hd
                h2=title
            .bd
    +box("news","新闻列表")
    

    解释后对应的HTML为:

    <div class="box news">
        <div class="hd">
            <h2>新闻列表</h2>
        </div>
        <div class="bd"></div>
    </div>
    

    这里的复用块和我们之前的编码习惯基本上吻合了,就是我们要求定义个公用模块,然后有类似结构的都复制一个相同的模块,然后修改一下class和模块的标题,现在解决了手动修改的问题,可以直接引用并给相应的模块赋值相应的class和模块标题。

    复用块中引用块

    复用块还可以接收一个块(block)参数,这个参数是一组jade语句,这个参数名block是固定的,不能随意更改。在调用的时候,只需要将这组jade语句以缩进的形式写在mixin的下面即可。
    复用块引用块情形的定义

    mixin mixinName
        jade语句
        block
    

    调用:

    +mixinName
        jade语句
    

    demo

    //复用块的定义
    mixin showUserInfo
        .name Nicholas
        .job Teacher
        block
    //复用块调用
    +showUserInfo
        .text 他是个好老师,也是个好程序员
    

    解释为HTML后为:

    <div class="name">Nicholas</div>
    <div class="job">Teacher</div>
    <div class="text">他是个好老师,也是个好程序员</div>
    

    如果参数名不使用固定的关键字block,则自定义的参数名会被解释为标记,并且不会起到参数的作用。前面我提到,可以将复用块简单的作为函数来理解,那么block我们就可以理解为形参,复用块调用下面的jade就可以理解为实参。

    加入我定义复用块的时候,不添加block参数,那么在调用复用块的下一行的缩进jade语句是不会被解释为HTML的。比如我定义并调用一个复用块:

    // 定义复用块
    mixin showUserInfo
        .name Nicholas
        .job Teacher
    
    //调用复用块
    +showUserInfo
        .text 他是个好老师,也是个好程序员
    

    那么解释为HTML后是不会显示“他是个好老师,也是个好程序员”这一行内容的

    <div class="name">Nicholas</div>
    <div class="job">Teacher</div>
    

    但如果调用复用块的下一行的jade语句没有缩进书写,那么这一行就不是作为复用块的实参出现的,只是一般的jade语句,可以被正常解释为HTML。

    复用块中的attributes属性

    前面的介绍,我们了解到复用块可以定义block参数,除了block参数以外,jade还有另外一个隐藏的参数attributes,类似于js中的默认的函数参数对象arguments.这个attributes参数没有想好怎么解释,看例子吧:

    mixin showPersonal(name)
        div(title!=attributes.title)=name
    +showPersonal("我的姓名")(title="title属性")
    

    解释后的HTML为:

    <div title="title属性">我的姓名</div>
    

    attributs参数的作用,请参考复用块showPersonal的调用时的第二个参数(title="title属性")。
    再就是需要注意定义复用块时的attributes属性,demo中使用了!=,而不是常规的=,这是因为jade中的=会进行escaped转码,而使用了!=就不会进行转码。

    上面的demo是只有一个参数title,那么有多个参数的时候,是也像定义元素的属性一样,定一个属性列表,属性之间使用逗号分隔呢?在不是使用attributes属性的时候,是没有问题的。但是使用attributes属性,灵活性会更高一些。

    -var attr = {'data-user':'Nicholas','data-job':'Teacher'}
    .text&attributes(attr)
    .text(title="title",data-job="student",data-age="18")
    

    .text&attributes(attr)这行代码,可以有缩进,也可以没有缩进,缩进和不缩进实现的效果是完全一样的
    demo中的.text&attributes(attr)、.text(title="title",data-job="student",data-age="18")可以说实现的效果完全相同,在属性是固定的时候,但有的时候如果属性不固定,需要根据特定场景赋予不同属性的时候,attributes方式实现的灵活性就能体现出来了

    填充数据 #{}、!{}、!=、=

    我们已经知道为元素填充数据,可以通过=或者!=来实现,其中=和!=的区别仅仅是后跟的元素数据会不会被escaped转码,=会被转码,!=不会被转码。

    .text= "信标请求优先避免与关键操作和更高优先级的网络请求竞争"
    

    然而还有一些情况不适合使用=或者!=.这个时候就得使用#{}语法了,其实#{}和!{}的区别也是会不会被转码的不同。

    -var answer = "混合模式开发";
    .text 所谓hybrid,顾名思义就是‘#{answer}’
    

    如上面的demo就不适合=,而使用#{}就比较合适。解释后的HTML:

    <div class="text">所谓hybrid,顾名思义就是‘混合模式开发’</div>
    

    填充数据的几种方式,使用=和!=的地方都可以使用#{}和!{}替换使用,但是使用#{}和!{}的地方不一定可以使用=和!=替换,简单来说,=和!=一般用于简单场景,#{}和!{}用于相对复杂一点的场景。
    无论是使用=和!=还是使用#{}和!{},当填充的数据是字符串的时候,都需要使用引号括起来。如果不加引号,会编译报错。

    .text #{'啦啦'}
    .text= '哗哗'
    

    对应的HTML

    <div class="text">啦啦</div>
    <div class="text">哗哗</div>
    

    注释

    jade中的注释,和js等其他编程语言基本类似,单行注释使用//作为注释的开始。如果是多行注释,则让//单独占一行,接下来的jade缩进书写。

    1. 使用//注释的jade文件,被解释为HTML后,仍旧会显示注释的内容
    2. 如果不希望在jade中注释的内容显示在HTML中,则可以在使用//-注释
    //
        用户信息
        包括用户名、出生日期、性别
    .text Nicholas 1987.12.12 男
    

    对应的HTML:

    <!--用户信息
    包括用户名、出生日期、性别-->
    <div class="text">Nicholas 1987.12.12 男</div>
    
    //-
        用户信息
        包括用户名、出生日期、性别
    .text Nicholas 1987.12.12 男
    

    对应的HTML:

    <div class="text">Nicholas 1987.12.12 男</div>
    

    jade中没有条件注释的方法。HTML中有条件注释的方法,如果有需要在jade中使用的条件注释的地方,直接使用HTML中的注释方法即可。

    <!--[if IE 8]>
    <html lang="en" class="lt-ie9">
    <![endif]-->
    <!--[if gt IE 8]><!-->
    <html lang="en">
    <!--<![endif]--> 
    

    继承

    jade支持继承,通过关键字extends来实现。

    //- layout.jade
    doctype html
    html(lang="zh-CN")
        head
            block title
            block script
        body
            block content
            block footer
            .footer
                p 版权所属 违者必究
    
    //- son.jade
    extends layout.jade
    block title
        title 列表页
    block script
        script(script='https://lib.baomitu.com/jquery/3.3.1/jquery.js')
    
    block content
        .row
            .size1
                .box
                    .hd
                        h2 新闻列表
            .size2
    

    解释的对应HTML为:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <title>列表页</title>
        <script script="https://lib.baomitu.com/jquery/3.3.1/jquery.js"></script>
    </head>
    <body>
        <div class="row">
            <div class="size1">
                <div class="box">
                    <div class="hd">
                        <h2>新闻列表</h2>
                    </div>
                </div>
            </div>
            <div class="size2"></div>
        </div>
        <div class="footer">
            <p>版权所属 违者必究</p>
        </div>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:Jade入门,jade基础语法

          本文链接:https://www.haomeiwen.com/subject/psfxxqtx.html