绑定语法
插值文本
使用“Mustache”语法(双大括号)来进行文本插值
HTML的特性绑定
使用v-bind:
,缩写为:
<!-- 1.宿主元素 -->
<div id="app" :title="title">
{{title}}
<div v-bind:title="title">v-bind</div>
</div>
// 将vue绑定到宿主元素中
// 1.创建vue实例
new Vue({
el: '#app',
data: {
title: 'hello, vue'
}
})
也可以只绑定一次,使用v-once
<div v-once>{{title}}</div>
列表渲染
使用v-for
的写法
<div id="app">
<div v-for="item in list" :key="item">{{item}}</div>
</div>
// 1.创建vue实例
new Vue({
el: '#app',
data: {
list: ['大数据', ' web']
}
})
表单输入绑定
使用v-model
的指令
<input type="text" v-model="course">
事件处理
使用v-on:
的指令,也可以简写成@
在事件后面可以添加修饰符
<!-- 添加了enter的修饰符 -->
<input type="text" v-model="course" v-on:keyup.enter="addCourse">
<!-- 没有添加修饰符 -->
<button @click="addCourse">新增</button>
class和style绑定
class绑定
class传入的是对象的话:键是类名,值是判断这个类名是否展示 class传入的是数组的话:每一个元素的结果都是类名
<li v-for="item in list" :key="item" :class="{active: item === selectedCourse}" @click="selectedCourse = item">{{item}}</li>
style的绑定
style传入的是对象:键是style的属性名(样式名是使用-分割的话,则需要使用单引号包裹或者使用驼峰命名,使用驼峰命名的时候vue内部进行转换),值是style的值 style传入的是数组:每一个元素的结果都是style
<!-- 样式名是使用-分割的 -->
<li v-for="item in list" :key="item" :style="{'background-color': selectedCourse === item ? '#ddd' : 'transparent'}" @click="selectedCourse = item">{{item}}</li>
<!-- 样式名使用驼峰命名 -->
<li v-for="item in list" :key="item" :style="{backgroundColor: selectedCourse === item ? '#ddd' : 'transparent'}" @click="selectedCourse = item">{{item}}</li>
条件渲染
使用v-if
和v-else
指令v-if
用于条件性的渲染一块内容。当v-if
指令的表达式的结果是truthy值的时候被渲染
truthy:表示这个值可以转换成true
<p v-if="list.length == 0">暂无课程数据</p>
<ul v-else>
<li v-for="item in list" :key="item" :class="{active: item === selectedCourse}" @click="selectedCourse = item">{{item}}</li>
</ul>
v-if
不能和v-for
在同一层级上,因为v-for的优先级高于v-if,在判断是否展示列表中的数据的时候,一定会执行v-for的渲染,会降低页面加载效率
v-if
和v-show
的区别
不论v-show
指令的值是什么,在页面初始化的时候都会渲染v-show
指令中的元素。v-show
的本质是通过css的display属性来控制元素是否展示的
v-if
指令的渲染是惰性渲染。当页面初始化的时候v-if
指令的值为false时,不渲染v-if
指令中的元素,直到v-if
的指令是true时。v-if
指令是通过元素是否在html中,来控制元素是否展示的
模板和渲染函数
vue会将模板编译成虚拟DOM的渲染函数,结合响应式系统,数据发生变更时,执行渲染(rander)函数,生成新的虚拟DOM,新旧虚拟DOM进行比较,将DOM的操作次数降到最低
Vue构造函数中的render函数可以替代div中写的模板
<!-- 1.宿主元素 -->
<div id="app" :title="title">
<!--
使用render函数也可以生成
<h2>{{title}}</h2>
<p>
<input type="text" v-model="course" v-on:keyup.enter="addCourse">
<button @click="addCourse">新增</button>
</p>
<p v-if="list.length == 0">暂无课程数据</p>
<ul v-else>
<li v-for="item in list" :key="item" :class="{active: item === selectedCourse}" @click="selectedCourse = item">{{item}}</li>
</ul> -->
</div>
<script src="../vue.js"></script>
<script>
// 将vue绑定到宿主元素中
// 1.创建vue实例
const app = new Vue({
el: '#app',
data: {
title: '购物车',
list: [],
course: '',
selectedCourse: ''
},
methods: {
addCourse () {
this.list.push(this.course);
this.course = '';
}
},
render () {
with(this){
return _c('div',{attrs:{"id":"app","title":title}},[_c('h2',[_v(_s(title))]),_v(" "),_c('p',[_c('input',{directives:[{name:"model",rawName:"v-model",value:(course),expression:"course"}],attrs:{"type":"text"},domProps:{"value":(course)},on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return addCourse($event)},"input":function($event){if($event.target.composing)return;course=$event.target.value}}}),_v(" "),_c('button',{on:{"click":addCourse}},[_v("新增")])]),_v(" "),(list.length == 0)?_c('p',[_v("暂无课程数据")]):_c('ul',_l((list),function(item){return _c('li',{key:item,class:{active: item === selectedCourse},on:{"click":function($event){selectedCourse = item}}},[_v(_s(item))])}),0)])
};
}
})
console.log(app.$options.render);
/*
下面是输出的app.$options.render
(function anonymous(
) {
with(this){return _c('div',{attrs:{"id":"app","title":title}},[_c('h2',[_v(_s(title))]),_v(" "),_c('p',[_c('input',{directives:[{name:"model",rawName:"v-model",value:(course),expression:"course"}],attrs:{"type":"text"},domProps:{"value":(course)},on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_k($event.keyCode,"enter",13,$event.key,"Enter"))return null;return addCourse($event)},"input":function($event){if($event.target.composing)return;course=$event.target.value}}}),_v(" "),_c('button',{on:{"click":addCourse}},[_v("新增")])]),_v(" "),(list.length == 0)?_c('p',[_v("暂无课程数据")]):_c('ul',_l((list),function(item){return _c('li',{key:item,class:{active: item === selectedCourse},on:{"click":function($event){selectedCourse = item}}},[_v(_s(item))])}),0)])}
})
*/
</script>