• with语法
    • vue template complier 将编译为render函数
    • 执行render函数生成vnode

    模版编译前置知识-with语法

    • 改变 { } 内自由变量的查找规则, 当作obj属性来查找
    • 如果找不到匹配的obj属性, 就会报错
    • with要慎用, 他打破了作用域规则, 易读性变差

    模版, 不是html, 有指令、插值、js表达式, 能实现判断、循环。html 是标签语言, 只有JS才能实现判断、循环。因此, 模版语言一定是转换为某种JS代码,即编译模版。

    • 模版编译为render函数, 执行render函数返回vnode
    • 基于vnode再执行patch和diff
    • 使用webpack vue-loader, 会在开发环境下编译模版

    vue模版被编译后的内容

    1. 1. 插值
    2. const template = `<p>{{message}}</p>`
    3. with(this){return createElement('p',[createTextVNode(toString(message))])}
    4. 2. 表达式
    5. const template = `<p>{{flag ? message : 'no message found'}}</p>`
    6. with(this){return _c('p',[_v(_s(flag ? message : 'no message found'))])}
    7. 3. 属性和动态属性
    8. const template = `<div id="div1" class="container">
    9. <img :src="imgUrl"/></div>`
    10. with(this){return _c('div',
    11. {staticClass:"container",attrs:{"id":"div1"}},
    12. [ _c('img',{attrs:{"src":imgUrl}})] )}
    13. 4. 条件
    14. const template = `<div>
    15. <p v-if="flag === 'a'">A</p>
    16. <p v-else>B</p>
    17. </div>`
    18. with(this){return _c('div',
    19. [(flag === 'a') ? _c('p',[_v("A")]) : _c('p',[_v("B")]) ] )}
    20. 5. 循环
    21. const template = `<ul>
    22. <li v-for="item in list" :key="item.id">{{item.title}}</li>
    23. </ul>`
    24. with(this){return _c('ul',_l((list),
    25. function(item){return _c('li',{key:item.id},
    26. [_v(_s(item.title))])}),0 )}
    27. 6. 事件
    28. const template = `<button @click="clickHandler">submit</button>`
    29. with(this){return _c('button',
    30. {on:{"click":clickHandler}}, [_v("submit")] )}
    31. 7. v-model
    32. const template = `<input type="text" v-model="name">`
    33. with(this){return _c('input',
    34. { directives:
    35. [{name:"model",rawName:"v-model",value:(name),expression:"name"}],
    36. attrs:{"type":"text"},domProps:{"value":(name)},
    37. on:{"input":
    38. function($event){if($event.target.composing)
    39. return;name=$event.target.value}}}
    40. )}

    render代替template
    复杂情况下, 不能template时, 可以考虑使用render
    React中一直使用render,没有template