View 模块实现

  • 纯函数概念
  • 字符串模板
  • 拼接我们所需要的 DOM 结构

纯函数

纯函数就是接收一些参数,根据参数返回新的结果。

function demo(x,y){
  // ...
  return x + y
}

在之后我们书写的 view 中的模版,组件中的 view 模版,都是存函数的形式展示,举个例子:

function getView(data) {
  return `<div>${data}</div>`
}
const tpl = getView(123);

其实就是纯粹的输入东西,输出东西,知识我们输出的是一个 HTML 模版,不对其他地方操作并造成影响。在任何地方都可以使用,不依赖任何的运行环境。

字符串模板

ES6的字符串模版大大增大了我们拼接字符串的效率。

在 ES5 中我们通过字符串的 += 方式拼接:例如

let data = 123;
let tpl = "<div>"
    tpl += "<p>"
    tpl += data
    tpl += "</p>"
    tpl += "</div>"

或着

let data = 123;
let tpl = "<div>" +
          "<p>" + data + "</p>" +
          "</div>";

ES6 的实现方法,变量可以通过 ${} 设置在模版中,模版支持换行,不需要拼接。

let data = 123;
let tpl = `
    <div>
      <p>${data}</p>
    </div>`

拼接我们所需要的 DOM 结构

构思 View 结构

我们在页面上需要准备渲染的HTML结构如下:

<main>
  <input class="input-add"/>
  <button class="btn-add">Add</button>
  <div class="todo-list">
    <div class="todo-item">
      <span>ABC</span>
      <button data-id="1" class="btn-delete">Delete</button>
      <span>
        <input data-id="2"/>
        <button data-id="1" class="btn-update">Update</button>
      </span>
    </div>
    <div class="todo-item">
      <span>EFG</span>
      <button data-id="2" class="btn-delete">Delete</button>
      <span>
        <input data-id="2"/>
        <button data-id="2" class="btn-update">Update</button>
      </span>
    </div>
  </div>
</main>

把数据部分抽离出来,使用字符串拼接

我们可以发现 todo-list 的代码是可以通过循环生产,因此我们在函数中把这部分抽离出来。

function TodoView ({ todos }) {
  const todosList = todos.map(todo => `
    <div>
      <span>${todo.text}</span>
      <button data-id="${todo.id}" class="btn-delete">
        Delete
      </button>

      <span>
        <input data-id="${todo.id}"/>
        <button data-id="${todo.id}" class="btn-update">
          Update
        </button>
      </span>
    </div>
  `).join('')

  return (`
    <main>
      <input class="input-add"/>
      <button class="btn-add">Add</button>
      <div>${todosList}</div>
    </main>
  `)
}

调用

这样我们通过调用函数 TodoView(data) 即可得到我们想要的模版

let data = [{ id:1, text: 'ABC' },{ id:2, text: 'BCD' }];
let tmp = TodoView(data);