IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 模板编译 with 语法 -> 正文阅读

[JavaScript知识库]模板编译 with 语法

with 语法

const obj = {a:100, b: 200}

console.log(obj.a) // 100
console.log(obj.b) // 200
console.log(obj.c) // undefined

// 使用width,能改变 {} 内自由变量的查找方式
// 将 {} 内自由变量当做 obj 的属性来查找
with(obj) {
	console.log(a) // 100
  console.log(b) // 200
  console.log(c) // ReferenceError: c is not defined
}

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

模板编译

● 模板不是html,有指令、插值、JS表达式,能实现判断、循环
● html是标签语言,只有 JS 才能实现判断、循环(图灵完备的)
● 因此,模板是转换为某种JS代码,即模板编译

Vue模板被编译成什么?

# 安装这个npm包
yarn add vue-template-compiler --save
# 或者
npm install vue-template-compiler --save

在这里插入图片描述
插值

const compiler = require('vue-template-compiler')
// 插值
const template = `<p>{{message}}</p>`

// 编译
const res = compiler.compile(template)
console.log(res.render)

/*****/
with(this){return _c('p',[_v(_s(message))])}
/* 在vue源码中可以搜到各种函数的名称
	这个 this 就是 vm = new Vue()  实例
  很类似于 h('p', {}, [...]) 函数
  _c 是 createElement 用于生成vnode
  _v 是 createTextVNode 用于生成文本的vnode
  _s 是 toString,以防message是true,则能转换为字符串
*/
/*****/

表达式

// 表达式
const template = `<p>{{flag ? message : 'no message found'}}</p>`

with(this){return _c('p',[_v(_s(flag ? message : 'no message found'))])}

属性和动态属性

const template = `
   <div id="div1" class="container">
     <img :src="imgurl" />
   </div>
 `

with(this){return _c('div',
    {staticClass:"container",attrs:{"id":"div1"}},
    [
      _c('img',{attrs:{"src":imgurl}})])}

条件

 const template = `
   <div>
       <p v-if="flag === 'a'">A</p>
       <p v-else>B</p>
   </div>
 `
 
 with(this){return 
        _c('div',[(flag === 'a')?_c('p',[_v("A")]):_c('p',[_v("B")])])}

循环

 const template = `  
   <ul>
     <li v-for="item in list" :key="item.id">{{item.title}}</li>
   </ul>
 `
 
 with (this) {
    return
      _c('ul', _l((list), function (item) { return _c('li', { key: item.id }, [_v(_s(item.title))]) }), 0)
  }

事件

 const template = `
   <button @click="clickHandler">submit</button>
`
 
 with(this){return 
    _c('button',{on:{"click":clickHandler}},[_v("submit")])}

v-model

const template = `<input type="text" v-model="name" />`

with(this){return 
      _c('input',{directives:[{name:"model",rawName:"v-model",
      value:(name),expression:"name"}],attrs:{"type":"text"},domProps:{"value":(name)},
      on:{"input":function($event){if($event.target.composing)return;
        name=$event.target.value}}})}

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

vue组件中使用render代替template

Vue.component('heading', {
  // template: ``
	render: function (createElement) {
  	return createElement(
    	'h' + this.level,
      [
      	createElement('a', {
        	attrs: {
          	name: 'headerId',
            href: '#' + 'headerId'
          }
        }, 'this is a tag')
      ]
    )
  }
})
相当于渲染 this.level = 1; <h1><a name="headerId" href="#headerId">this is a tag</a></h1>

小结

● 模板编译为rander函数,执行render函数返回vnode
● 基于vnode再执行patch和diff
● 使用webpack vue-loader,会在开发环境下编译模板(重要)
直接script引入,然后写vue模板,编译过程会在浏览器里执行,整体效率不如使用打包工具来的高

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:27:56  更:2022-03-22 20:32:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:34:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码