官方给出的概念:Vue(读音/vju:/,类似于view)是一套用于构建用户界面的前端框架。
vue框架的特性,主要体现在如下两方面:
数据驱动视图
双向数据绑定
在使用了vue的页面中,vue 会监听数据的变化,从而自动重新渲染页面的结构。示意图如下;
好处:当页面数据发生变化时,页面会自动重新渲染
注意:数据驱动视图是单向的数据绑定。
在填写表单时,双向数据绑定可以辅助开发者在不操作DOM的前提下,自动把用户填写的内容同步到数据源中。示意图如下:
好处:开发者不再需要手动操作DOM元素,来获取表单元素最新的值!
MVVM是vue实现数据驱动视图和双向数据绑定的核心原理。MVVM指的是Model、View和ViewModel,它把每个HTML页面都拆分成了这三个部分,如图所示:
在MVVM概念中:
Model表示当前页面渲染时所依赖的数据源。
View表示当前页面所渲染的DOM结构。
ViewModel表示 vue 的实例,它是MVM的核心。
ViewModel作为MWVM的核心,是它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。
当数据源发生变化时,会被ViewModel监听到,VM会根据最新的数据源自动更新页面的结构
当表单元素的值发生变化时,也会被VM监听到,VM会把变化过后最新的值自动同步到 Model数据源中
注意:数据驱动视图和双向数据绑定的底层原理是MM(Mode数据源、View视图、ViewModel就是vue的实例)
<body>
<div id="app">
{{username}}
div>
body>
<script src="./lib/vue.js">script>
<script>
//创建Vue的实例对象
const vm = new Vue({
//el属性是固定的写法 表示当前vm实例要控制页面上的那个区域 接收的值是一个选择器
el: '#app',
//data对象就是要渲染到页面上的数据
data: {
username: 'zhangsan',
}
})
script>
vue官方提供的vue-devtools调试工具,能够方便开发者对vue项目进行调试与开发。
Chrome浏览器在线安装vue-devtools :
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
FireFox浏览器在线安装vue-devtools :
https://addons.mozilla.org/zh-CN/firefox/addon/vue-js-devtools/
点击Chrome浏览器右上角的目按钮,选择更多工具->扩展程序->Vue.js devtools详细信息,并勾选如下的两个选项:
注意:修改完配置项,须重启浏览器才能生效!
指令(Directives)是 vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。
vue中的指令按照不同的用途可以分为如下6大类:
内容渲染指令用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有如下3个:
用法示例:
<p v-text="username">p>
<p v-text="gender">
性别
p>
vue提供的语法,专门用来解决v-text 会覆盖默认文本内容的问题。这种{{f}}语法的专业名称是插值表达式(英文为:Mustache)。
<p>
姓名:{{username}}
p>
<p>
性别:{{gender}}
p>
v-text 指令和插值表达式只能渲染纯文本内容。如果要把包含HTML标签的字符串渲染为页面的HTML元素,则需要用到v-html这个指令:
<p v-html='disciption'>
p>
注意:插值表达式只能在元素的内容节点中,不能在元素的属性节点
如果需要为元素的属性动态绑定属性值,则需要用到v-bind属性绑定指令,可以简写为英文的:。用法示例如下:
<div id="app">
<input type="text" v-bind:placeholder="tips">
<hr>
<img :src="photo" alt="" srcset="" style="width: 150px">
div>
在vue提供的模板渲染语法中,除了支持绑定简单的数据值之外,还支持Javascript 表达式的运算,例如:
{{numder+1}}
{{ok?'yes':'no'}}
{{message.split('').reverse().join('')}}
<div v-bind:id="'list-'+id">div>
在使用v-bind属性绑定期间,如果绑定内容需要进行动态拼接,则字符串的外面应该包裹单引号
vue提供了v-on事件绑定指令,用来辅助程序员为DOM元素绑定事件监听。语法格式如下:
<h3>count的值为:{{count}}h3>
<button v-on:click="addCount">
1
button>
注意:原生DOM对象有onclick、oninput、onkeyup等原生事件,替换为vue的事件绑定形式后,分别为:v-on:click、v-on:input、v-on:keyup
在事件处理函数中调用event.preventDefault()或 event.stopPropagation()是非常常见的需求。因此,vue 提供了事件修饰符的概念,来辅助程序员更方便的对事件的触发进行控制。常用的5个事件修饰符如下:
事件修饰符 | 说明 |
---|---|
.prevent | 阻止默认行为(阻止a链接的跳转、阻止表单的提交等) |
.stop | 阻止事件冒泡 |
.capture | 以捕获模式触发当前的事件处理函数 |
.once | 绑定的事件只触发1次 |
.self | 只有在event.target是当前元素自身时触发事件处理函数 |
在监听键盘事件时,我们经常需要判断详细的按键。此时,可以为键盘相关的事件添加按键修饰符,例如:
<input @keyup.enter="submit">
<input @keyup.esc="clearInput">
vue提供了v-model双向数据绑定指令,用来辅助开发者在不操作DOM的前提下,快速获取表单的数据。
<p>用户名是:{{uscrname}}p>
<input type="text" v-model="username"/>
<p>选中的省份是: {{province}}P>
<select v-model="province">
<option value="">请选择option>
<option valuc="1">北京option>
<option valuc="2">河北option>
<coption valuc="3">黑龙江option>
select>
v-model指令适用
为了方便对用户输入的内容进行处理,vue 为v-model指令提供了3个修饰符,分别是:
修饰符 | 作用 | 示例 |
---|---|---|
.number | 自动将用户的输入值转为数值类型 |
示例用法如下:
<input type="text" v-model.number="n1">
<input type="text" v-model.number="n2">
<spen>{{n1*n2}}spen>
条件渲染指令用来辅助开发者按需控制DOM的显示与隐藏。条件渲染指令有如下两个,分别是:
示例用法如下:
<div id="app">
<p v-if="networkState === 200">
请求成功---被v-if拉制
p>
<p v-show="networkState === 200">
请求成功---被v-show 控制
p>
div>
v-show的原理是:动态元素添加或移除display:none样式 ,来实现元素的显示和隐藏
v-if的原理是:每次动态创建或移除元素,实现元素的显示和隐藏
v-else-if 指令,顾名思义,充当v-if 的“else-if 块”,可以连续使用:
<div v-if="type==='A'">
优秀
div>
<div v-else-if="type==='B'">
良好
div>
<div v-else-if="type==='C'">
一般
div>
<div v-else>
差
div>
注意: v-else-if 指令必须配合v-if 指令一起使用,否则它将不会被识别!
v-if 可以单独使用,或配合v-else指令一起使用:
<div v-if="Math.random()>0.5">
随机数大于0.5
div>
<div v-else>
随机数小于0.5
div>
注意:v-else指令必须配合v-if指令一起使用,否则它将不会被识别!
vue提供了v-for列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。v-for 指令需要使用item in items形式的特殊语法,其中:
data:{
list:[
{id:1,name:'zs'},
{id:2,name:'ls'}
]
}
//_________________________
<ul>
<li v-for="item in list">姓名是:{{item.name}}li>
ul>
v-for指令还支持一个可选的第二个参数,即当前项的索引。语法格式为(item, index) in items,示例代码如下;
data:{
list:[
{id:1,name:'zs'},
{id:2,name:'ls'}
]
}
//_________________________
- 索引是:{{index}},姓名是:{{item.name}}
注意:v-for指令中的 item项和 index索引都是形参,可以根据需要进行重命名。例如(user, i) in userlist
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<link rel="stylesheet" href="./lib/bootstrap.css">
<link rel="stylesheet" href="./css/brandlist.css">
head>
<body>
<div id="app">
<div class="card">
<div class="card-header">
添加品牌
div>
<div class="card-body">
<form @submit.prevent="add">
<div class="form-row align-items-center">
<div class="col-auto">
<div class="input-group mb-2">
<div class="input-group-prepend">
<div class="input-group-text">品牌名称div>
div>
<input type="text" class="form-control" placeholder="请输入品牌名称" v-model.trim="brand">
div>
div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-2">添加button>
div>
div>
form>
div>
div>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th scope="col">#th>
<th scope="col">品牌名称th>
<th scope="col">状态th>
<th scope="col">创建时间th>
<th scope="col">操作th>
tr>
thead>
<tbody>
<tr v-for="item in list" :key="item.id">
<td>{{item.id}}td>
<td>{{item.name}}td>
<td>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" :id="'cd'+item.id" v-model="item.status">
<label class="custom-control-label" :for="'cd'+item.id" v-if="item.status">已起用label>
<label class="custom-control-label" :for="'cd'+item.id" v-else>已禁用label>
div>
td>
<td>{{item.time}}td>
<td>
<a href="javascript:;" @click="remove(item.id)">删除a>
td>
tr>
tbody>
table>
div>
body>
<script src="./lib/vue.js">script>
<script>
const vm = new Vue({
el: '#app',
data: {
//用户输入的品牌名称
brand: '',
//是下一个 可用的id
nextId:4,
// 品牌的列表数据
list: [
{id: 1, name: '宝马', status: true, time: new Date()},
{id: 2, name: '奔驰', status: false, time: new Date()},
{id: 3, name: '迪奥', status: true, time: new Date()},
]
},
methods: {
// 点击链接 删除对应的品牌
remove(id) {
this.list = this.list.filter(items => items.id !== id)
},
// 阻止表单的默认提交行为之后,触发add方法
add() {
// 如果判断到brand的值为空字符串,则return出去
if (this.brand === '') return alert('必须填品牌名称');
// 如果没被return 应该执行添加的逻辑
// 先把要添加的品牌对象,整理出来
const obj={
id:this.nextId,
name:this.brand,
status:false,
time:new Date()
}
// 往this.list数组中push品牌对象
this.list.push(obj);
// 清空this.brand 让this.nextId自增+1
this.brand='';
this.nextId+=1;
}
}
});
script>
html>
body {
padding: 15px;
user-select: none;
}
过滤器(Filters)是vue为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方:插值表达式和v-bind属性绑定。
过滤器应该被添加在JavaScript表达式的尾部,由“管道符”进行调用,示例代码如下:
<p>
{{message|capitalist}}
p>
<div v-bind:id="rawId|formatId">
div>
在创建 vue 实例期间,可以在 filters 节点中定义过滤器,示例代码如下:
const vm =new Vue({
el:'#app',
data:{
message:'hello vue.js'
},
//过滤器函数,必须被定义到filters节点下
//过滤器本质是函数
filters:{
//过滤器函数形参中val永远都是管道符前面的那个值
capi(val){
// 强调:过滤器中,一定要有一个返回值
// val.charAt(0) 字符串有charAt方法 这个方法接收索引 表示字符串中把索引对应的字符 获取出来
const first=val.charAt(0).toUpperCase();
// 字符串slicef方法 可以截取字符串 从指定索引开始
const other=val.slice(1);
//过滤器一定要有一个返回值
return first+other;
},
}
})
在 filters 节点下定义的过滤器,称为“私有过滤器”,因为它只能在当前 vm 实例所控制的 el 区域内使用。 如果希望在多个 vue 实例之间共享过滤器,则可以按照如下的格式定义全局过滤器:
//全局过滤器–独立于每个vm实例之外
// Vue.filter()方法接收两个参数;
//第1个参数,是全局过滤器的"名字“
//第2个参数,是全局过滤器的"处理函数”
Vue.filter ( 'capitalize', (str) => {
return str.charAt(O).toUpperCase() + str.slice(1) + "~~"
})
如果全局过滤器和私有过滤器名字一致,此时按照‘就近原则’ 调用的是私有过滤器
过滤器可以串联地进行调用,例如:
{{message | capitalize |maxLength}}
//全局过滤器–首字母大写
Vue.filter('capitalize', (str) =>{
return str.charAt(0).toUpperCase() + str.slice(1) + '~~';
})
//全局过滤器–控制文本的最大长度
Vue.filter('maxLength', (str) =>{
if(str.length <= 10) return str
return str.slice(0,11) + '...';
})
过滤器的本质是JavaScript函数,因此可以接收参数,格式如下:
<p>
{{message | filterA(arg1,arg2)}}
p>
//过滤器处理函数的形参列表中
//第一个参数,永远都是"管道符"前面待处理的值
//从第二个参数开始,才是调用过滤器传递过来的arg1和arg2参数
Vue.filter('filter',(msg,arg1,arg2)=>{
//过滤器的代码逻辑
})
过滤器仅在 vue 2.x 和 1.x 中受支持,在 vue 3.x 的版本中剔除了过滤器相关的功能。 在企业级项目开发中:
如果使用的是 2.x 版本的 vue,则依然可以使用过滤器相关的功能
如果项目已经升级到了 3.x 版本的 vue,官方建议使用计算属性或方法代替被剔除的过滤器功能
rCase() + str.slice(1) + ‘~~’;
})
//全局过滤器–控制文本的最大长度
Vue.filter(‘maxLength’, (str) =>{
if(str.length <= 10) return str
return str.slice(0,11) + ‘…’;
})
#### 2.4过滤器传参
过滤器的本质是JavaScript函数,因此可以接收参数,格式如下:
```html
{{message | filterA(arg1,arg2)}}
//过滤器处理函数的形参列表中
//第一个参数,永远都是"管道符"前面待处理的值
//从第二个参数开始,才是调用过滤器传递过来的arg1和arg2参数
Vue.filter('filter',(msg,arg1,arg2)=>{
//过滤器的代码逻辑
})
过滤器仅在 vue 2.x 和 1.x 中受支持,在 vue 3.x 的版本中剔除了过滤器相关的功能。 在企业级项目开发中:
如果使用的是 2.x 版本的 vue,则依然可以使用过滤器相关的功能
如果项目已经升级到了 3.x 版本的 vue,官方建议使用计算属性或方法代替被剔除的过滤器功能
具体的迁移指南,请参考 vue 3.x 的官方文档给出的说明: https://v3.vuejs.org/guide/migration/filters.html#migration-strategy