Vue快速入门
Vue介绍
在互联网产品快速迭代的背景下,前端开发人员不仅要编写页面,还要通过ajax+js完成页面动态效果,压力较大。
为了解决这个问题,一款前端的渐进式框架==Vue==就诞生了。
==渐进式框架==:一个前端项目可以使用vue一两个特性,也可以整个项目都用vue。
入门案例
需求:视图Div获取input中输入的文字
创建工程
导入资源
js代码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>01-入门案例</title> </head> <body> <h3>获取input中输入的文字</h3> <input type="text" id="myInput"> <div style="border:red 1px solid; height: 25px;" id="myDiv"></div> <script> // 给input绑定键盘弹起事件 document.getElementById('myInput').οnkeyup=function () { // 获取input文本框的值 let val = this.value; // 显示到div中 document.getElementById('myDiv').innerHTML=val; } </script> </body> </html>
vue代码
视图:负责页面渲染,主要由HTML+CSS构成。脚本:负责业务数据模型(Model)以及数据的处理逻辑。
步骤:
-
引入vue的js类库
-
编写视图
-
编写脚本
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>01-入门案例</title> <!--1.引入vue的js类库--> <script src="../js/vue-2.6.12.js"></script> </head> <body> <!--2.将视图交给vue管理--> <div id="app"> <h3>获取input中输入的文字</h3> <input type="text" v-model="message"> <div style="border:red 1px solid; height: 25px;">{{message}}</div> </div> <!--3.将js脚本vue管理--> <script> const app = new Vue({ el: '#app', // 管理视图,通过css选择器 data:{ // 管理js变量(模型) message:'' }, methods:{ // 管理js方法(函数) } }); </script> </body> </html>
入门详解
-
html视图:视图用于展示Vue模型中的数据,定义时必须使用双标签
-
==注意:不能使用body标签,通过使用div==
<div id="app"></div>
-
Vue 核心对象:每一个 Vue 程序都是从一个 Vue 核心对象开始的。
let app = new Vue({ 选项列表; });
-
选项列表
1. el选项:指定的vue控制视图区域。(根据css选择器获取) 2. data选项:用于保存当前Vue对象中的数据。支持js的各种数据类型 3. methods选项:用于定义方法。方法可以直接通过对象名调用,或者用this来调用(代表当前Vue对象)。
-
数据绑定
* 在视图部分获取脚本部分的数据: {{插值表达式}}
Vue常用指令【重点】
-
指令:是带有 v- 前缀的特殊属性,不同指令具有不同含义。例如 v-html,v-if,v-for。
-
使用指令时,通常编写在标签的属性上,值(内容)可以使用 JS 的表达式。
-
常用指令:
文本插值
{{插值表达式}}:将数据输出到页面视图中
v-text:将数据输出到元素内部,如果输出的数据有HTML代码,会作为普通文本输出
v-html:将数据输出到元素内部,如果输出的数据有HTML代码,会被渲染
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <!-- {{插值表达式}}:展示vue管理的变量 缺点:网络波动,在等待期间直接显示插值表达式原文 v-text:相当于js中innerText(文本) v-html:相当于js中innterHTML(超文本) --> 插值表达式:{{message}} <br> v-text:<span v-text="message"></span> <br> v-html:<span v-html="message"></span> <br> </div> <script> setTimeout(function () { const app = new Vue({ el:'#app', // 管理视图 data:{ // 管理变量 message:'<b>哈哈哈~~~</b>' }, methods:{ // 管理方法 } }); },2000) </script> </body> </html>
表单绑定
==表单:采集用户输入的数据,发送给服务器端==
* 插值表达式(包括v-text和v-html)可以看做是单向绑定,数据影响了视图渲染,但是反过来就不行 * v-model是双向绑定,视图(View)和模型(Model)之间会互相影响 * 目前v-model的可使用元素有:input、select、textarea
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <h3>姓名:</h3> <input type="text" v-model="username"> <div>您写的姓名是:{{username}}</div> <h3>性别:</h3> <input type="radio" value="男" v-model="gender"> 男 <br> <input type="radio" value="女" v-model="gender"> 女 <br> <div>您选择的性别是:{{gender}}</div> <h3>爱好:</h3> <input type="checkbox" value="抽烟" v-model="hobbies">抽烟<br> <input type="checkbox" value="喝酒" v-model="hobbies">喝酒<br> <input type="checkbox" value="烫头" v-model="hobbies">烫头<br> <div>您选择的爱好是:{{hobbies}}</div> <h3>段位:</h3> <select v-model="level"> <option value="">请选择</option> <option value="青铜">青铜</option> <option value="白银">白银</option> <option value="王者">王者</option> </select> <div>您选择的段位是:{{level}}</div> </div> <script> const app = new Vue({ el: '#app', data: { username:'', // 用户名 gender:'', // 性别 hobbies:[],// 爱好 level:'' // 段位 } }) </script> </body> </html>
小结
-
单向绑定:vue管理的模型修改,视图也就同步修改了
-
双向绑定:vue管理的视图(input、select、textarea)和模型,可以相互影响
绑定属性
* 对于HTML标签属性,如果想要动态传值,不能使用{{}},而应该使用专门的属性绑定语法 标准语法: v-bind:属性名="Vue中的变量" 简写语法: :属性名='Vue中的变量'
<!DOCTYPE html> <html lang="zh-CN" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <h3>属性绑定基本使用</h3> 改变图片的地址和大小<br> 图片地址: <select v-model="imgSrc"> <option value="../img/vue.png">vue</option> <option value="../img/lj.jpg">雷军</option> </select> 图片宽度: <input type="text" v-model="imgWidth"> <br> <img v-bind:src="imgSrc" :width="imgWidth"> </div> <script> const app = new Vue({ el: '#app', data: { imgSrc: "../img/vue.png", imgWidth: "100px" }, }) </script> </body> </html>
列表循环
* 在vue中使用v-for实现数组的遍历,格式如下: * v-for="(item,index) in items" items:要遍历的List item: 每次遍历得到的临时变量 index:每次遍历的索引,从0开始计数(可省略)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <!-- for循环 1)简单: user in userList 2)完整:(user,index) in userList --> <ul> <li v-for="(user,index) in userList">{{user.name}} -- {{index}}</li> </ul> </div> <script> const app = new Vue({ el: '#app', data: { userList: [ {id: 1, name: 'jack', address: '北京昌平'}, {id: 2, name: 'lucy', address: '上海虹桥'}, {id: 3, name: 'jerry', address: '天津宝坻'} ] } }) </script> </body> </html>
条件判断
* 语法: v-if="布尔表达式" v-else-if="布尔表达式" v-else * 注意: v-else元素必须紧跟在带v-if或者v-else-if元素的后面,否则它将不会被识别 v-if还可以和v-for联合使用,当二者出现在一起时,会先遍历再判断条件
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <!--从文本框输入成绩, 然后判断成绩是否及格 >=80:优秀 、60>=:及格 <60:不及格--> <h3>考试成绩练习</h3> 请输入成绩:<input type="text" v-model="score"><br> 你本次考试成绩: <span v-if="score>=80">优秀</span> <span v-else-if="score>=60">及格</span> <span v-else>不及格</span> <!--遍历users, 但是要求只显示性别为女的用户--> <!-- v-if:如果满足条件显示,不满足不显示(页面不会渲染元素) v-show:如果满足调节键显示,不满足不显示(页面会渲染元素) --> <h3>用户列表</h3> <ul> <li v-for="user in users" v-if="user.gender=='女'">{{user}}</li> </ul> <ul> <li v-for="user in users" v-show="user.gender=='女'">{{user}}</li> </ul> </div> <script> const app = new Vue({ el: '#app', data: { score: 15, users: [ {name: 'jack', gender: '女'}, {name: 'lucy', gender: '女'}, {name: 'jerry', gender: '男'} ] } }) </script> </body> </html>
事件绑定
* 事件绑定 1) 标准语法 v-on:事件名="js片段或函数名" 如果不想页面爆红,需要单独引入名称空间 2) 简化语法 @事件名="js片段或函数名" 推荐使用
<!DOCTYPE html> <html lang="zh-CN" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> <b>数量:</b> <button @click="diff()">-</button> <span>{{num}}</span> <button v-on:click="num++">+</button> </div> <script> const app = new Vue({ el: '#app', data: {// 成员变量 num: 1 }, methods:{ // 定义方法 diff(){ console.log(this.num); // 输出成员变量 if (this.num > 1) { this.num--; } } } }) </script> </body> </html>
知识小结
<!--Vue对象模板--> <script> const app = new Vue({ el: "#app",// 管理视图(html+css) data: {}, // 管理模型(数据) methods: {} // 管理方法(函数) }); </script> 1. 单方向赋值 html文本: <span v-text="" v-html="">{{插值表达式}}</span> html属性: <img :src="vue变量"/> 2. 双向绑定 <input type="text" v-model="vue变量"/> 3. 遍历循环 <li v-for="(item,index) in list"></li> 4. 判断 <span v-if="表达式1"></span> <span v-else-if="表达式2"></span> <span v-else></span> 5. 事件绑定 <a @click="js代码或函数"></a>
Vue高级使用【理解】
生命周期
生命周期经历的八个阶段
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../js/vue-2.6.12.js"></script> </head> <body> <div id="app"> </div> <script> const app = new Vue({ el: '#app', data: { }, methods: { find(){ alert('查询后台数据。。。') } }, // created是vue生命周期创建后触发的函数,与methods同级 created(){ // 类似于 window.onload this.find(); } }) </script> </body> </html>
Vue异步操作
在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作!
常用方法
// 执行get请求 axios.get('/url?name=admin&password=123').then(resp=>{ console.log(resp.data); }) // 执行get请求参数比较多的时候 axios.get('/url',{ params:{ name: 'admin', password: '123' } }).then(resp=>{ console.log(resp.data); }) //执行post请求 axios.post('/url', { name: 'admin', password: '123' }).then(resp=>{ console.log(resp.data); })
Vue概念
* MVVM是Model-View-ViewModel的简写,它本质上就是MVC的改进版;MVVM就是将其中的View的状态和行为抽象化,让我们将视图UI和业务逻辑分开。 - M: 即Model,模型,指的就是数据 - V: 即View, 视图,指的就是页面 - VM:即View-Model,指的是模型和数据的双向绑定(即view和Model互相影响,Model变了,view随之改变;view变了,Model也随之改变) * MVC和MVVM的使用区别 在MVC模式中, 开发人员需要从后端获取到数据(Model),然后通过操作DOM渲染视图(View)。 如果用户改变了视图(view),开发人员还需要再通过DOM获取改变之后的数据,同步到Model中。 在MVVM模式中, Model和View是绑定的,Model变了,view自动变化;view变了,Model自动变化。 因此,程序员只需要关注Model即可。 * 基于MVVM模式的前端框架三巨头:Vue、React、AngularJS