epii.js简约而不简单的JS模板引擎

1,基础数据绑定

  • epii 自定义dom节点属性 r-data 可以对任何类型节点赋值,其中 input 节点最终 赋值其value 属性,img节点赋值其 src 属性,其它类型节点均赋值innerHtml 属性。
  • 如果设置r-data-default 则在没有数据时候显示默认值。
  • r-data="title" 和 r-data="{title}" 的区别是,在title值不存在时,第一种情况 将显示 title 字符串,第二种情况 显示空,如果第二种情况设置了r-data-default 则显示其设置的默认值
  • 以下代码效果可在此处预览 https://epaii.github.io/epii.js/demo/demo1.html

    <div id="content">  <h1 r-data="title">  </h1>  <div r-data="文章内容:{content}"></div>  <br>   <div r-data="{subject}" r-data-default="没有被赋值,只能用:{title}"></div><!-- 默认值-->  <br>  <input r-data="inputvalue"><!-- input 负值方法1-->  <input value="{inputvalue}"><!-- input 负值方法2-->  <br>  <img r-data="img_url" style="width: {img_width}px"><!-- img 负值方法1-->  ![]({img_url})<!-- img 负值方法2  ,但这种存在缺点,因为在解析前,已经加载一次不存在的图片,多一次请求,不推荐--></div><script>  var myepii = epii(document.getElementById("content"));//初始化殷勤,需要制定dom节点 可以是 body  myepii.setData({      title: "我是标题",      content: "我是内容主题",      inputvalue: "input内容",      img_url:"https://www.baidu.com/img/bd_logo1.png",      img_width:100  });
    
      setTimeout(function () {      myepii.setData({          title: "我是新的标题",          content: "我是新的内容主题"      });  }, 3000);</script>

    2 数据绑定其它语法

  • epii 可以实现dom节点 属性的变量绑定,可以在任意属性中使用变量标签,比如 style ,width,等任意属性,以下代码效果可在此处预览
  • 支持 链条式变量,比如 {info.subject}
    ht t p s : / / e pa i i . g i t hu b . i o / e p i i. j s / d e m o / de m o 2.html

<div id="content">    <h1 r-data="title" style="width: {h1_width}px;height: {h1_height}px;background-color: {h1_color}">    </h1>    <div r-data="{info.subject}"></div>    <br>    <img r-data="{img.img_url}" style="width: {img.img_width}px">

</div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        h1_width:100,        h1_height:100,        h1_color:"red",        title: "我是标题",        info:{subject:"文章简介"},        img:{            img_url: "https://www.baidu.com/img/bd_logo1.png",            img_width: 100        }    });

    setTimeout(function () {        myepii.setData({            title: "我是新的标题",            h1_width:300,            h1_height:300,            h1_color:"blue",            img:{  img_width:300}        });    }, 3000);</script>

3 节点的隐藏/显示

  • epii 提共两种方式设置dom节点隐藏和显示
  • 方法1 ,style="display: {h1_display}" 通过style 属性绑定
  • 方法2 , 通过 r-display 标签 r-display="{img_show}-1==0",必须为bool 等式字符串 ,推荐使用这种方式
  • 以下代码效果可在此处预览 https://epaii.github.io/epii.js/demo/demo3.html

<div id="content">    <h1 r-data="title" style="display: {h1_display}"> <!--第一种方法,直接在style中 用变量,不推荐-->    </h1>    <br>    <img r-data="img_url" r-display="{img_show}-1==0"><!--第二种方法,使用 r-display 标签,推荐-->

</div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "我是标题",        h1_display:"block",

        img_url:"https://www.baidu.com/img/bd_logo1.png",        img_show:1    });

    setTimeout(function () {//两种方法隐藏        myepii.setData({            h1_display:"none",            img_show:0        });    }, 3000);</script>

4 点击事件

  • epii 通过 r-click-change 和 r-click-function 两个标签,实现点击事件,标签内容均可以使用变量符号,其中 r-click-change 标签实现点击自定义跳转, r-click-function标签实现点击触发自定义函数
  • r-click-change="http://www.baidu.com/?1={title}" 点击时候 直接跳转
  • r-click-function="on_subject_click#{info.subject}#{title}" 和 onclick="on_subject_click(‘{info.subject}‘,‘{title}‘)" 实现效果一样,推荐使用前者
  • 同一节点不可重复使用
  • 以下代码效果可在此处预览 https://epaii.github.io/epii.js/demo/demo9.html

<div id="content">    <h1 r-data="title"  r-click-change="http://www.baidu.com/?q={title}">  </h1>    </h1>    <div r-data="{info.subject}" r-click-function="on_subject_click#{info.subject}#{title}"></div>    <br>    <div r-data="{info.subject}" onclick="on_subject_click(‘{info.subject}‘,‘{title}‘)"></div>    <br>    <div r-list="users">        <div r-click-function="on_item_click#{name}#{age}">            名称<span r-data="name"></span>,            年龄<span r-data="age" r-click-change="http://www.baidu.com/?age={age}"></span>        </div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",        info:{subject:"文章简介"},        users:[            {name:"张三",age:"12岁"},            {name:"李四",age:"14岁"}        ]    });    function on_subject_click(subject,title) {        console.log(subject,title);

    }    function on_item_click(name,age) {        console.log(name,age);    }</script>

5 自定义跳转事件

  • 通过 epii.setClickToChangeFunction(f); 来自定义 r-click-change 事件, 在native+webapp开发中 一般需要不会直接通过location 页面跳转,而是需要处理自定义协议。
epii.setClickToChangeFunction(function (url) {        console.log(url);    });
  • 以下代码效果可在此处预览 https://epaii.github.io/epii.js/demo/demo10.html

 //自定义r-click-change 处理事件, 在native+webapp开发中 一般需要自定义协议    epii.setClickToChangeFunction(function (url) {        console.log(url);    });    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",

    });

6 列表(基础)

  • epii 通过 r-list 标签指定此dom节点将显示列表, 在列表节点内的 变量 将自切换为 列表某一项数据,在列表内之前所有标签,以下代码效果可在此处预览 https://epaii.github.io/epii.js/demo/demo4.html

<div id="content">    <h1 r-data="title" >  </h1>    <div r-list="users">        <div>名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",        users:[            {name:"张三",age:"12岁"},            {name:"李四",age:"14岁"}        ]    });</script>

7 列表(多模板)

  • 如果列表中有多个模板,则根据r-display 来自动选择对应的模板,以下代码效果可在此处预览 h t t ps : / / e p ai i . g i t h ub . i o / ep i i . j s /d e m o /  de mo5.html

<div id="content">    <h1 r-data="title" >  </h1>    <div r-list="users">        <div r-display="{item_type}-1==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>        <div r-display="{item_type}-2==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",        users:[            {name:"张三",age:"12岁",item_type:1},            {name:"李四",age:"14岁",item_type:2},            {name:"张三1",age:"121岁",item_type:1},            {name:"李四1",age:"141岁",item_type:2}        ]    });</script>

8 列表(追加数据)

  • epii 可两种方式对列表追加数据
  • 方法1 ,重新 setData, 将重新显示列表所有数据,如果旧数据有改变,则用这种方法
  • 方法2 , addData ,已有数据不变,追加数据,如果旧数据没有任何改变,推荐使用这种方式
  • 以下代码效果可在此处预览 h t t p s : / /e p a i i . g i th u b . i o / e pi i.js/demo/demo6.html

<div id="content">    <h1 r-data="title" >  </h1>    <div r-list="users">        <div r-display="{item_type}-1==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>        <div r-display="{item_type}-2==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",        users:[            {name:"张三",age:"12岁",item_type:1},            {name:"李四",age:"14岁",item_type:2},            {name:"张三1",age:"121岁",item_type:1},            {name:"李四1",age:"141岁",item_type:2}        ]    });    setTimeout(function () {//3秒后追加列表        myepii.addData({ //追加已有数据,列表将被追加,其它类型直接覆盖            title: "追加列表展示",            users:[                {name:"张三5",age:"12岁",item_type:1},                {name:"李四6",age:"14岁",item_type:2},                {name:"张三7",age:"121岁",item_type:1},                {name:"李四8",age:"141岁",item_type:2}            ]        });

    },3000);</script>

9 列表(空数据)

通过 r-empty="1" 设置当数据为空,或者未设置时候列表的样式,以下代码效果可在此处预览 h t t p s : / /e p a i i . g i t h ub . i o / e p i i .j s / d e mo / d e m o 7 . ht m l

<div id="content">    <h1 r-data="title" >  </h1>    <div r-list="users">        <div r-display="{item_type}-1==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>        <div r-display="{item_type}-2==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>        <div r-empty="1" style="没有数据的时候显示</div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "列表展示",        users:[]    });    setTimeout(function () {//3秒后追加列表        myepii.addData({ //追加已有数据,列表将别被加,其它类型直接覆盖            title: "追加列表展示",            users:[                {name:"张三5",age:"12岁",item_type:1},                {name:"李四6",age:"14岁",item_type:2},                {name:"张三7",age:"121岁",item_type:1},                {name:"李四8",age:"141岁",item_type:2}            ]        });

    },3000);

</script>

10 数据获取,获取已设置的数据,getData,getDataValue两个方法

  • 通过 epii 的 getData 方法 可以获取所有设置的数据
  • 通过 epii的 getDataValue 方法 可以快速获取已设置的数据,getDataValue 支持多参数,链条key
  • 如 myepii.getDataValue("title"); myepii.getDataValue("info","subject"); myepii.getDataValue("users",1,"age")
  • 以下代码效果可在此处预览 h t t p s : / / e pa i i . g i th u b . i o /e p i i .j s/demo/demo8.html

<div id="content">    <h1 r-data="title" >  </h1>    <div r-list="users">        <div r-display="{item_type}-1==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>        <div r-display="{item_type}-2==0" style="名称<span r-data="name"></span>,年龄<span r-data="age"></span></div>    </div></div><script>    var myepii = epii(document.getElementById("content"));//初始化引擎,需要制定dom节点 可以是 body    myepii.setData({        title: "获取数据",        info:{subject:"标题"},        users:[            {name:"张三",age:"12岁",item_type:1},            {name:"李四",age:"14岁",item_type:2},            {name:"张三1",age:"121岁",item_type:1},            {name:"李四1",age:"141岁",item_type:2}        ]    });    console.log(myepii.getData());    alert(myepii.getDataValue("title"));    alert(myepii.getDataValue("info","subject"));    alert(myepii.getDataValue("users",1,"age"));</script>

11 完整的demo,几乎涉及所有语法

demo案例源码:(h t t p s: / / g i t h u b. c o m / ep a i i / ep i i . j s/ blob/master/index.html)

demo案例效果:(ht t p s: / / e p a i i. g i t h u b. i o / e p ii . j s / i n de x . h t ml )

<div  >    <div r-data="我的名字是{name},性别:{sex}" r-click-function="index#{name}#{sex}">

    </div>    <div r-click-change="http://www.baidu.cc/?a={name}">click_to_change</div>    <div r-data="show_name" r-display="{isshow}-1==0" style="background-color: green">

    </div>    <div r-data="{hebei}" r-data-default="默认值{name}"  style="width:{width}px;height:{height}px;">{bgcolor};display: {display}" >

    </div>    <div r-data="{map.age}"  r-display="{map.show}-1==0" >

    </div>    <img r-data="{img_url}"    >    ![]({img_url})    <input type="text" r-data="{img_url}"    >    <input type="text" value="{img_url}"    >    <div r-list="list" style="background-color: #007bc7">

        <span r-data="name" r-display="{moban}-1==0"></span>        <span r-data="name" style="color: red" r-display="{moban}-2==0" r-click-change="http://www.ddle.cc/?a={age}">

        </span>        <div r-display="{moban}-3==0" r-click-function="index#2#{age}">            <div> 二级列表:</div>            <div r-list="wanju">                <span r-data="name" r-display="{moban}-1==0"></span>                <span r-data="name" style="color: blue" r-display="{moban}-2==0"                      r-click-change="http://www.ddle.cc/?a={a}">                    </span>            </div>

        </div>        <span   r-empty="1">            真的没有数据        </span>

    </div></div><script>    epii.setClickToChangeFunction(function (url) {        alert(url);    });    function index(c, b) {//this  bind to uiview        console.log(this.innerHTML);        console.log(c);        console.log(b);    }    var data = {        "img_url":"https://www.baidu.com/img/bd_logo1.png",        "display":"block",        "width":100,        "height":200,        "bgcolor":"red",        "name": "张三",        "sex": "男",        "isshow": 1,        "show_name": "show/hide",        "map":{"show":"1","age":"map_age"},         "list": [{"name": "list_item_1", "moban": 1}, {"name": "list_item_2", "moban": 2, "age": 2}]    };    var myepii = epii(document.body);

    myepii.setData(data);    //模拟数据变化    setTimeout(function () {        myepii.setData({//改变已有数据            "hebei":"河北邯郸",            "name": "李四",            "sex": "女",            "map":{"show":"0","age":"map_age1"},            "bgcolor":"blue",            "width":500,            "height":50,            isshow: 0        });        setTimeout(function () {            myepii.addData({//追加已有数据,列表将被追加,其它类型直接覆盖                "hebei":"河北石家庄",                 "display":"none",                "list": [                    {"name": "list_item_3", "moban": 1},                    {"name": "list_item_4", "moban": 2, "age": 4},                    {                        "moban": 3,                        "age": 10,                        "wanju": [{"name": "list_item_list1", "moban": 1}, {"name": "list_item_list2", "moban": 2, a: 5}]                    }]            });            console.log(myepii.getDataValue("name"));            console.log(myepii.getDataValue("list",1,"age"));            console.log(myepii.getDataValue("list",4,"wanju",1,"name"));        },3000);

    }, 3000);</script>

时间: 2024-08-24 08:59:59

epii.js简约而不简单的JS模板引擎的相关文章

Node.js开发入门—使用jade模板引擎

在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本的目录结构.模板.stylesheet.routers等.虽然那只是一个简单的HelloWorld类的小东西,可里面包含的内容还是有些多了,为了更好的理解Express所支持的jade模板引擎的用法,我们这次提供一个手动创建的小网站,可以显示来访者的IP,并对访问进行计数. 安装jade npm instal

Epii.js 一个极其简单的Js模板引擎

Epii.js 简约而不简单的JavaScript模板引擎 项目地址 https://github.com/epaii/epii.js 极低门槛,拿来即用,别忘记star 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑定和处理,不依赖任何第三方库,仅仅8k. 可快速应用于web开发,native+webapp开发,h5微网页开发,不与其它框架冲突. 让开发者更多关注与应用本身,而不用花费大量时间实现数据与ui的,和事件处理.效率大幅度提升. 名字由来

模板引擎doT.js

作为一名前端攻城师,经常会遇到从后台ajax拉取数据再显示在页面的情境,一开始我们都是从后台拉取再用字符串拼接的方式去更达到数据显示在页面! <!-- 显示区域 --> <div id="testid"></div> <script type="text/javascript"> var testjson={"name":"张三","age":31,"

js模板引擎介绍搜集

js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Handlebars,Underscore)做了一番调研,分享出来希望对大家有用. 从这几个指标来比较js模板

Mustache.js前端模板引擎初识

目前在看一个项目,在一遍遍撸代码的时候,发现代码里调用了一个Mustache.render()方法. 经过百度后,发现Mustache.js是一套轻量级模板引擎. 所以现在就要仔细学习一下,它是如何工作的. 一般来说mustache在js中的使用方法都是如下: var template = $('#template').html(); Mustache.parse(template);   // optional, speeds up future uses var rendered = Mus

推荐13款javascript模板引擎

javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于javascript 实现的模板引擎,类似于 Microsoft’s jQuery template plugin,但更简单易用! 2. EasyTemplate 在使用过Freemarker模 板后,感觉它的 语法比较朴实,平易近人,容易上手,于是决定按它的语法风格实现一个前端的 模板引擎,这就有了

express+模板引擎构建项目时遇到的几个小问题

1.启动项目/调试项目 项目启动用:npm start 由于每次更改路由代码后必须重启服务才可以看效果,所以为了达到热加载的效果我们安装 supervisor:全局安装也可以: npm install supervisor -g 然后启动项目: supervisor bin/www 这里要说一点:因为express从4.x版本以后开始把项目启动搬到了bin/www找下,所以直接运行 supervisor bin/www,而不是node app.js 2.在使用ejs模板引擎时出现的一点纠结 在用

Node.js模板引擎的深入探讨

每次当我想用 node.js 来写一个 web 相关项目的时候,我总是会陷入无比的纠结,原因是 JavaScript 生态圈里的模板引擎实在太多了,但那么多却实在找不出一个接近完美的,所谓完美的概念就是功能丰富,书写简单,前后端可共用等一些属性.虽然可以在 Template Chooser 按功能进行挑选,但挑选的结果再用来对比还是各有各的问题.所以干脆就一些模板引擎进行稍微深入的分析,希望通过对比总结出哪种更值得去使用. 第一轮排除 在上次node模板引擎简单比较的文章里,其实已经有个简单的筛

Js模板引擎mustache

mustache.js是一个简单强大的Javascript模板引擎,使用它可以简化在js代码中的html编写,压缩后只有9KB,非常值得在项目中使用.本文总结它的使用方法和一些使用心得,内容不算很高深,纯粹是入门内容,看看即可.不过要是你还没有用过此类的javascript引擎库,那么本文还是值得你一读的,相信在你了解完它强大的功能和简单用法之后,一定会迫不及待地将之用于你的工作当中. 1. 从一个简单真实的需求讲起 目前公司做了一个统一的开发平台,后台封装了MVC的接口和数据增删改查的接口,前