[关闭]
@Wangww0925 2020-07-15T07:13:28.000000Z 字数 11542 阅读 512

JsViews 模板

模板引擎 jsRender/jsViews


JsViews是基于JsRender并具有动态绑定功能的模板

官网: https://www.jsviews.com/#jsvapi
jsviews.min.js 下载: https://www.jsviews.com/#download


使用

  1. 1、定义模板: <script type="text/x-jsrender" id="Tem"></script>
  2. 2、引入js
  3. 3、数据:要json对象
  4. 4、使用:
  5. 方法一: 使用 myTmpl.link()【--推荐】
  6. 1. 创建模板:var html =$.templates("#Tem");
  7. 2. 调用link()模板的方法,渲染模板: html.link("#content", data)
  8. 方法二: $.link.myTem()
  9. 1. $.templates("myTem", "#Tem");
  10. 2. $.link.myTem("#content", data, helpersOrContext, noIteration);
  11. 3. 参数说明:
  12. myTem: 命名模板为myTem,可以随意修改,但是要与$.link.myTem()的myTem保持一致
  13. data: 数据
  14. helpersOrContext:上下文辅助方法或属性,使用 {:~属性名} 调用
  15. noIteration:不传,或者 true,以防止对数组数据进行迭代

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <div id="content"></div>
  9. <!-- 1、定义模板 -->
  10. <script id="temp" type="text/x-jsrender">
  11. <p>{{:name}}</p>
  12. </script>
  13. <!-- 2、引入js -->
  14. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  15. <script src="jsviews.min.js"></script>
  16. <script>
  17. // 3、数据:要json对象
  18. var data = {
  19. name:"www"
  20. }
  21. // 4、方法一
  22. $.templates("#temp").link("#content", data);
  23. // 4、方法二
  24. // var temp = $.templates("temp", "#temp")
  25. // $.link.temp("#content", data);
  26. </script>
  27. </body>
  28. </html>

数据双向绑定 data-link="属性名"

注意:{^{:name}}动态绑定数据,data-link="name"动态更改数据,trigger=false让其失去焦点才触发

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <div id="content"></div>
  9. <!-- 1、定义模板 -->
  10. <script id="temp" type="text/x-jsrender">
  11. <p>
  12. 输入就触发数据更改: <input type="text" data-link="name">
  13. </p>
  14. <p>
  15. 失去焦点才触发数据更改: <input type="text" data-link="name trigger=false">
  16. </p>
  17. <p>动态绑定数据: {^{:name}}</p>
  18. </script>
  19. <!-- 2、引入js -->
  20. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  21. <script src="jsviews.min.js"></script>
  22. <script>
  23. // 3、数据:要json对象
  24. var data = {
  25. name:"www"
  26. }
  27. // 4、方法一
  28. $.templates("#temp").link("#content", data);
  29. </script>
  30. </body>
  31. </html>

绑定事件 {on 事件名}

注意:
使用data-link="{on ...}" 或者 {^{on ...}}
{^{on ...}} 该元件是由标签包裹标签(或多个标签),标记为按钮
{^{on ...}} 仅包装文本时,{^{on ...}}自动转为 <button>标签
{^{on ... tmpl='文本'}} 使用 tmpl='文本' 属性生成 带有文本的<button>标签

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .red {color: red;}
  8. </style>
  9. </head>
  10. <body>
  11. <div id="content"></div>
  12. <!-- 1、定义模板 -->
  13. <script id="temp" type="text/x-jsrender">
  14. <p>{{:name}}</p>
  15. <p>
  16. <span data-link="{on ~add}">点击1</span>
  17. {^{on ~add}}<button>点击2</button>{{/on}}
  18. {^{on ~add}}点击3{{/on}}
  19. {^{on ~add tmpl="点击4" /}}
  20. {^{on ~add /}}
  21. {^{on ~add height=18 width=75 class="red" id="btn5"}}点击6{{/on}}
  22. </p>
  23. </script>
  24. <!-- 2、引入js -->
  25. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  26. <script src="jsviews.min.js"></script>
  27. <script>
  28. // 3、数据:要json对象
  29. var data = {
  30. name: "www"
  31. }
  32. var fun = {
  33. add: function (){
  34. $("#content").append("你点了我" + (new Date()) + "<br>")
  35. }
  36. }
  37. // 4、方法二
  38. var temp = $.templates("temp", "#temp");
  39. $.link.temp("#content", data, fun);
  40. </script>
  41. </body>
  42. </html>

class动态更改

注意: data-link="class{:isRed ? 'red' : 'blue'}"merge

  1. <p data-link="class{:isRed ? 'redBorder red' : 'redBorder blue'}">hello world</p>
  2. <p class="redBorder" data-link="
  3. class{merge:isTrue toggle='red yellowBg'}
  4. class{merge:!isTrue toggle='blue'}
  5. ">www</p>

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .red {color: red;}
  8. .blue {color: blue;}
  9. .redBorder {border: 1px solid red;}
  10. .yellowBg{background-color: yellow;}
  11. </style>
  12. </head>
  13. <body>
  14. <div id="content"></div>
  15. <!-- 1、定义模板 -->
  16. <script id="temp" type="text/x-jsrender">
  17. <h3>写法一</h3>
  18. <p>isRed : <input type="checkbox" data-link="isRed"> {^{:isRed}}</p>
  19. <p data-link="class{:isRed ? 'redBorder red' : 'redBorder blue'}">hello world</p>
  20. <hr>
  21. <h3>写法二</h3>
  22. <p>isTrue : <input type="checkbox" data-link="isTrue"> {^{:isTrue}}</p>
  23. <p class="redBorder" data-link="
  24. class{merge:isTrue toggle='red yellowBg'}
  25. class{merge:!isTrue toggle='blue'}
  26. ">www</p>
  27. </script>
  28. <!-- 2、引入js -->
  29. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  30. <script src="jsviews.min.js"></script>
  31. <script>
  32. // 3、数据:要json对象
  33. var data = {
  34. isRed: true,
  35. isTrue: true
  36. }
  37. // 4、方法二
  38. $.templates("#temp").link("#content", data);
  39. </script>
  40. </body>
  41. </html>

css动态绑定

注意:

  1. <p data-link="
  2. css-color{:color}
  3. css-background-color{:bg}
  4. css-border{:border}
  5. class{merge:isTrue toggle='fb'}
  6. {:text}
  7. "></p>

例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .fb {
  8. font-weight: 700;
  9. font-size: 20px;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div id="content"></div>
  15. <!-- 1、定义模板 -->
  16. <script id="temp" type="text/x-jsrender">
  17. 内容: <input type="text" data-link="text"><br>
  18. color <input type="text" data-link="color"><br>
  19. bg <input type="text" data-link="bg"><br>
  20. border <input type="text" data-link="border"><br>
  21. <p data-link="
  22. css-color{:color}
  23. css-background-color{:bg}
  24. css-border{:border}
  25. class{merge:isTrue toggle='fb'}
  26. {:text}
  27. "></p>
  28. </script>
  29. <!-- 2、引入js -->
  30. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  31. <script src="jsviews.min.js"></script>
  32. <script>
  33. // 3、数据:要json对象
  34. var data = {
  35. color: 'red',
  36. bg: 'yellow',
  37. border: '1px solid blue',
  38. isTrue: true,
  39. text: '你好呀'
  40. }
  41. // 4、方法二
  42. $.templates("#temp").link("#content", data);
  43. </script>
  44. </body>
  45. </html>

元素visible显示隐藏

注意: data-link="visible{:isShow}"<input type="checkbox" data-link="isShow">

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <div id="content"></div>
  9. <!-- 1、定义模板 -->
  10. <script id="temp" type="text/x-jsrender">
  11. <p>
  12. <input type="checkbox" data-link="isShow"> {^{:isShow}}
  13. </p>
  14. <div data-link="visible{:isShow}">isShow 显示</div>
  15. <div data-link="visible{:!isShow}">isShow 显示</div>
  16. </script>
  17. <!-- 2、引入js -->
  18. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  19. <script src="jsviews.min.js"></script>
  20. <script>
  21. // 3、数据:要json对象
  22. var data = {
  23. isShow: true
  24. }
  25. // 4、方法二
  26. $.templates("#temp").link("#content", data);
  27. </script>
  28. </body>
  29. </html>

动态更改array数据

数组添加新的内容

  1. $.observable(data.info).insert({ name: 'new', age: 18 }); // insert添加新的内容

移动数组内元素的位置

  1. $.observable(data.info).move(1, 0); // move 将索引1移到索引0的前面

数组翻转

  1. $.observable(data.info).refresh(data.info.slice().reverse()); // refresh 执行数组翻转操作等

删除数组最后一项

  1. $.observable(data.info).remove(); // remove移除最后一项

删除数组指定索引元素

  1. $.observable(data.info).remove(2); // remove移除索引为2的数据

例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .w50{width: 50px;}
  8. </style>
  9. </head>
  10. <body>
  11. <p>
  12. <input type="text" id="name">
  13. <input type="text" id="age">
  14. <button onclick="add()">insert 新增</button>
  15. </p>
  16. <p>
  17. 将索引 <input type="text" id="move1" class="w50" value="1" > 移到索引 <input type="text" id="move2" class="w50" value="0">
  18. <button onclick="move()">move 移动</button>
  19. </p>
  20. <button onclick="refresh()">refresh 排序</button>
  21. <button onclick="remove()">删除最后一项</button>
  22. <div id="content"></div>
  23. <!-- 1、定义模板 -->
  24. <script id="temp" type="text/x-jsrender">
  25. <table>
  26. <tbody>
  27. <tr>
  28. <th>序列</th>
  29. <th>名字</th>
  30. <th>年龄</th>
  31. </tr>
  32. {^{for info}}
  33. <tr align="center">
  34. <td>{^{:#index + 1}}</td>
  35. <td>{^{:name}}</td>
  36. <td>{^{:age}}</td>
  37. </tr>
  38. {{/for}}
  39. </tbody>
  40. </table>
  41. </script>
  42. <!-- 2、引入js -->
  43. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  44. <script src="jsviews.min.js"></script>
  45. <script>
  46. // 3、数据:要json对象
  47. var data = {
  48. info: [
  49. {
  50. name: "www",
  51. age: 18
  52. },
  53. {
  54. name: "abc",
  55. age: 20
  56. },
  57. {
  58. name: "nh",
  59. age: 21
  60. }
  61. ]
  62. }
  63. // 4、方法一
  64. $.templates("#temp").link("#content", data);
  65. // 数组动态更改方法
  66. function add(){
  67. $.observable(data.info).insert({ name: $("#name").val(), age: $("#age").val() });
  68. }
  69. function move(){
  70. $.observable(data.info).move($("#move1").val(), $("#move2").val());
  71. }
  72. function refresh(){
  73. $.observable(data.info).refresh(data.info.slice().reverse());
  74. }
  75. function remove(){
  76. $.observable(data.info).remove();
  77. }
  78. </script>
  79. </body>
  80. </html>

监听array数据更改 arrayChange

注意:

  1. /**
  2. * 监听data数据更改 arrayChange监听事件
  3. * 数据需要用 [] 包裹
  4. */
  5. $([data.arr]).on("arrayChange", function (e, obj){
  6. /**
  7. * change: 更改事件
  8. * index: 索引
  9. * items: 更改的内容
  10. */
  11. // console.log(e, obj)
  12. });

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .w50{width: 50px;}
  8. </style>
  9. </head>
  10. <body>
  11. <p>
  12. <input type="text" id="val">
  13. <button onclick="add()">insert 新增</button>
  14. </p>
  15. <button onclick="remove()">删除最后一项</button>
  16. <div id="content"></div>
  17. <!-- 1、定义模板 -->
  18. <script id="temp" type="text/x-jsrender">
  19. {^{for arr}}
  20. <li>{{:~root.arr[#getIndex()]}}</li>
  21. {{/for}}
  22. </script>
  23. <!-- 2、引入js -->
  24. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  25. <script src="jsviews.min.js"></script>
  26. <script>
  27. // 3、数据:要json对象
  28. var data = {
  29. arr: ['aa','bb','cc']
  30. }
  31. // 4、方法一
  32. $.templates("#temp").link("#content", data);
  33. // 动态更改方法
  34. function add(){
  35. $.observable(data.arr).insert($("#val").val())
  36. }
  37. function remove(){
  38. $.observable(data.arr).remove();
  39. }
  40. /**
  41. * 监听data数据更改 arrayChange监听事件
  42. * 数据需要用 [] 包裹
  43. */
  44. $([data.arr]).on("arrayChange", function (e, obj){
  45. /**
  46. * change: 更改事件
  47. * index: 索引
  48. * items: 更改的内容
  49. */
  50. // console.log(e, obj)
  51. });
  52. </script>
  53. </body>

动态更改object数据

修改object属性

  1. $.observable(data.person).setProperty("name", 'newName'); // setProperty 修改person下的name属性

删除object属性

  1. $.observable(data.person).removeProperty("like"); // removeProperty 删除person下的like属性

例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .w50{width: 50px;}
  8. </style>
  9. </head>
  10. <body>
  11. <p>
  12. <input type="text" id="name">
  13. <button onclick="modify()">setProperty 修改</button>
  14. </p>
  15. <button onclick="remove()">removeProperty 删除like</button>
  16. <div id="content"></div>
  17. <!-- 1、定义模板 -->
  18. <script id="temp" type="text/x-jsrender">
  19. <span>{^{:person.name}}</span>
  20. <span>{^{:person.age}}</span>
  21. <span>{^{:person.like}}</span>
  22. </script>
  23. <!-- 2、引入js -->
  24. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  25. <script src="jsviews.min.js"></script>
  26. <script>
  27. // 3、数据:要json对象
  28. var data = {
  29. person:{
  30. name: "www",
  31. age: 18,
  32. like: "花草树木"
  33. }
  34. }
  35. // 4、方法一
  36. $.templates("#temp").link("#content", data);
  37. // 对象动态更改方法
  38. function modify(){
  39. $.observable(data).setProperty("person.name",$("#name").val());
  40. }
  41. function remove(){
  42. $.observable(data).removeProperty("person.like");
  43. }
  44. </script>
  45. </body>
  46. </html>

监听object数据更改 propertyChange

注意:

  1. // data: 监听的数据
  2. // propertyChange 监听事件
  3. $(data).on("propertyChange", function (e, obj){
  4. /**
  5. * obj对象属性
  6. * path: 更改的属性名
  7. * oldValue: 旧的数据
  8. * value:新的数据
  9. */
  10. });

例子

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .w50{width: 50px;}
  8. </style>
  9. </head>
  10. <body>
  11. <p>
  12. <input type="text" id="name">
  13. <button onclick="modify()">setProperty 修改</button>
  14. </p>
  15. <div id="content"></div>
  16. <!-- 1、定义模板 -->
  17. <script id="temp" type="text/x-jsrender">
  18. <span>{^{:name}}</span>
  19. </script>
  20. <!-- 2、引入js -->
  21. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  22. <script src="jsviews.min.js"></script>
  23. <script>
  24. // 3、数据:要json对象
  25. var data = {
  26. name: "www"
  27. }
  28. // 4、方法一
  29. $.templates("#temp").link("#content", data);
  30. // 动态更改方法
  31. function modify(){
  32. $.observable(data).setProperty("name",$("#name").val())
  33. }
  34. // 监听data数据更改;propertyChange 监听事件
  35. $(data).on("propertyChange", function (e, obj){
  36. /**
  37. * obj对象属性
  38. * path: 更改的属性名
  39. * oldValue: 旧的数据
  40. * value:新的数据
  41. */
  42. $("body").append("将data." + obj.path + "原数据 " + obj.oldValue + "改成 " + obj.value + '<br>')
  43. });
  44. </script>
  45. </body>
  46. </html>

获取点击li的数据 $.view(this).data

  1. $("ul li").unbind();
  2. $("ul li").click(function(){
  3. var data = $.view(this).data;
  4. console.log(data)
  5. })

例子:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <div id="content"></div>
  9. <!-- 1、定义模板 -->
  10. <script id="temp" type="text/x-jsrender">
  11. <ul>
  12. {^{for data}}
  13. <li>{{:#data}}</li>
  14. {{/for}}
  15. </ul>
  16. </script>
  17. <!-- 2、引入js -->
  18. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  19. <script src="jsviews.min.js"></script>
  20. <script>
  21. // 3、数据:要json对象
  22. var data = {
  23. data: [1,2,3,4,5]
  24. }
  25. // 4、方法一
  26. $.templates("#temp").link("#content", data);
  27. // 点击li
  28. $("ul li").unbind();
  29. $("ul li").click(function(){
  30. var data = $.view(this).data;
  31. console.log(data);
  32. })
  33. </script>
  34. </body>
  35. </html>

获取点击li的索引 $.view(this).getIndex()

  1. $("ul li").unbind();
  2. $("ul li").click(function(){
  3. var index = $.view(this).getIndex();
  4. console.log(index)
  5. })

获取点击li的父元素 $.view(this).parent.data || $.view(this).parent.parent.parent.data

注意根据具体数据一层一层往上找

  1. $("ul li").unbind();
  2. $("ul li").click(function(){
  3. var parent = $.view(this).parent.data;
  4. console.log(parent);
  5. var parent1 = $.view(this).parent.parent.parent.data;
  6. console.log(parent1);
  7. })

作者 wendy
2018 年 12月 21日


参考文献

更多参考官网

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注