Vue:渐进式JavaScript框架
声明式渲染→组件系统→客户端路由→集中式状态管理→项目构建
官网:https://cn.vuejs.org/v2/guide/
<body>
<div id="app">
<div>{
{
msg}}</div>
<div>{
{
1 + 2}}</div>
<div>{
{
msg + '----' + 123}}</div>
</div>
</body>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
msg: 'Hello Vue'
}
});
</script>
Vue的基本使用步骤:
实例参数分析
el: 元素的挂载位置(值可以是CSS选择器或者DOM元素)
**data:**模型数据(值是一个对象)
插值表达式用法
将数据填充到HTML标签中
插值表达式支持基本的计算操作
Vue代码运行原理分析
概述编译过程的概念(Vue语法→原生语法)
前端渲染就是 把数据填充到HTML标签中
1. 原生js拼接字符串
2. 使用前端模板引擎
优点:大家都遵循同样的规则写代码,代码可读性明显提高了,方便后期的维护。
缺点:没有专门提供事件机制。
3. 使用vue特有的模板语法
官网:https://cn.vuejs.org/v2/api/
1. 什么是指令?
2. v-cloak指令用法
<style type="text/css">
1、通过属性选择器 选择到 带有属性 v-cloak的标签
让他隐藏
[v-cloak] {
display: none;
}
</style>
<div id="app">
2、 让带有插值 语法的 添加 v-cloak 属性
在 数据渲染完场之后,v-cloak 属性会被自动去除,
也就是对应的标签会变为可见
<div v-cloak>{
{
msg}}</div>
</div>
3. 数据绑定指令
<div id="app">
<div>{
{
msg}}</div>
<div v-text='msg'></div>
<div v-html='msg1'></div>
<div v-pre>{
{
msg}}</div> // HTML
</div>
var vm = new Vue({
el: '#app',
data: {
msg: 'Hello Vue',
msg1: 'HTML
'
}
});
4. 数据响应式
<div v-once>{
{
info}}</div>
v-once的应用场景:如果显示的信息后续不需要再修改,你们可以使用v-once,这样可以提高性能。
<input type='text' v-model='uname'/>
/*
双向数据绑定
1、从页面到数据
2、从数据到页面
*/
1. Vue如何处理事件?
<input type=‘button' v-on:click='num++'/>
简写
<input type=‘button' @click='num++'/>
2. 事件函数的调用方式
1.直接绑定函数名称
<button v-on:click='handle'>Hello</button>
2.调用函数
<button v-on:click='handle()'>Say hi</button>
methods: {
handle: function() {
// 这里的this是Vue的实例对象+
console.log(this === vm)
// 在函数中 想要使用data里面的数据 一定要加this
this.num++;
}
3. 事件函数参数传递
普通参数和事件对象
<button v-on:click='handle1'>点击1</button>
<button v-on:click='handle2(123, 456, $event)'>点击2</button>
methods: {
handle1: function(event) {
console.log(event.target.innerHTML)
},
handle2: function(p, p1, event) {
console.log(p, p1)
console.log(event.target.tarName); // 表示事件对象的名称
console.log(event.target.innerHTML) // 对象里面的内容
this.num++;
}
}
4. 事件修饰符
<a v-on:click.stop="handle1">跳转</a>
<a v-on:click.prevent="handle2">跳转</a>
methods: {
handle0: function(){
this.num++;
},
handle1: function(event){
// 阻止冒泡
// event.stopPropagation();
},
handle2: function(event){
// 阻止默认行为
// event.preventDefault();
}
}
5. 按键修饰符 (Vue 预设了很多 具体看文档)
<input v-on:keyup.enter='submit'>
<input v-on:keyup.delete='handle'>
6. 自定义按键修饰符
规则:自定义按键修饰符名字是自定义的,但是对应的值必须是按键对应event.keyCode值
<input type="text" v-on:keyup.aaa='handle' v-model='info'>
Vue.config.keyCodes.aaa = 65 // 这个 65 代表的 a 键
// 也就是 按下 a 才触发这个函数
1. Vue如何动态处理属性
<a v-bind:href='url'>跳转</a>
简写
<a :href='url'>跳转</a>
2. v-model的低层实现原理分析
<div>{
{
msg}}</div>
<input type="text" v-bind:value="msg" v-on:input='handle'>
<input type="text" v-bind:value="msg" v-on:input='msg=$event.target.value'>
1.v-model指令的本质
var vm = new Vue({
el: '#app',
data: {
msg: 'hello'
},
methods: {
handle: function(event){
2.使用输入域中的最新的数据覆盖原来的数据
this.msg = event.target.value;
}
}
});
样式绑定相关语法细节:
1、对象绑定和数组绑定可以结合使用
2、class绑定的值可以简化操作
3、默认的class如何处理?默认的class会保留
1. class样式处理
<div v-bind:class="{active: isActive,error: isError}">
测试样式
</div>
<button v-on:click='handle'>切换</button>
样式绑定
var vm = new Vue({
el: '#app',
data: {
isActive: true,
isError: true
},
methods: {
handle: function(){
// 控制isActive的值在true和false之间进行切换
this.isActive = !this.isActive;
this.isError = !this.isError;
}
}
});
<div id="app">
<div v-bind:class='[activeClass, errorClass]'>测试样式</div>
<button v-on:click='handle'>切换</button>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/*
样式绑定
*/
var vm = new Vue({
el: '#app',
data: {
activeClass: 'active',
errorClass: 'error'
},
methods: {
handle: function(){
this.activeClass = '';
this.errorClass = '';
}
}
});
2. style样式处理
<div id="app">
<div v-bind:style='{border: borderStyle, width: widthStyle, height: heightStyle}'></div>
<div v-bind:style='objStyles'></div>
<div v-bind:style='[objStyles, overrideStyles]'></div>
<button v-on:click='handle'>切换</button>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/*
样式绑定之内联样式Style:
*/
var vm = new Vue({
el: '#app',
data: {
borderStyle: '1px solid blue',
widthStyle: '100px',
heightStyle: '200px',
objStyles: {
border: '1px solid green',
width: '200px',
height: '100px'
},
overrideStyles: {
border: '5px solid orange',
backgroundColor: 'blue'
}
},
methods: {
handle: function(){
this.heightStyle = '100px';
this.objStyles.width = '100px';
}
}
});
</script>
1. 分支结构
<div id="app">
<div v-if='score>=90'>优秀</div>
<div v-else-if='score<90&&score>=80'>良好</div>
<div v-else-if='score<80&&score>60'>一般</div>
<div v-else>比较差</div>
<div v-show='flag'>测试v-show</div>
<button v-on:click='handle'>点击</button>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
分支结构
v-show的原理:控制元素样式是否显示 display:none
var vm = new Vue({
el: '#app',
data: {
score: 10,
flag: false
},
methods: {
handle: function(){
this.flag = !this.flag;
}
}
});
</script>
2. v-if与v-show的区别
3. 循环结构
<div id="app">
<div>水果列表</div>
<ul>
<li v-for='item in fruits'>{
{
item}}</li>
<li v-for='(item, index) in fruits'>{
{
item + '---' + index}}</li>
<li :key='item.id' v-for='(item, index) in myFruits'>
<span>{
{
item.ename}}</span>
<span>-----</span>
<span>{
{
item.cname}}</span>
</li>
</ul>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/*
循环结构-遍历数组
*/
var vm = new Vue({
el: '#app',
data: {
fruits: ['apple', 'orange', 'banana'],
myFruits: [{
id: 1,
ename: 'apple',
cname: '苹果'
}, {
id: 2,
ename: 'orange',
cname: '橘子'
}, {
id: 3,
ename: 'banana',
cname: '香蕉'
}]
}
});
</script>
4. 循环结构
<div v-for='(value, key, index) in object'></div>
<div v-if='value==12' v-for='(value, key, index) in object'></div>
<div id="app">
<div v-if='v==13' v-for='(v,k,i) in obj'>{
{
v + '---' + k + '---' + i}}</div>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
obj: {
uname: 'zhangsan',
age: 13,
gender: 'female'
}
}
});
1. 实现静态UI效果
用传统的方式实现标签结构和样式
2. 基于数据重构UI效果
将静态的结构和样式重构为基于Vue模板语法的形式
处理事件绑定和js控制逻辑
3. 声明式编程
模板的结构和最终显示的效果基本一致