vue初识
查看vue版本
vue -V
安装
npm install --global vue-cli
创建一个基于 webpack 模板的新项目
vue init webpack my-project
启动
cd my-project
npm install
npm run dev
vue框架特点
vue渐进式框架
声明式渲染
数据驱动
双向绑定
MVVM的模式
基本组成
- el :表示渲染的范围
- data :数据是一个对象
- methods :方法(函数)声明
- watch:监听data中的属性变化
- computed:计算属性(补充data中的属性),会返回一个新的值
- filter:过滤 重新定义属性的格式或者数据的呈现方式
vue基础语法
插值操作
Mustache
Mustache语法(也就是双大括号)
v-html
某些情况下,我们从服务器请求到的数据本身就是一个HTML代码
如果我们直接通过{{}}来输出,会将HTML代码也一起输出。
但是我们可能希望的是按照HTML格式进行解析,并且显示对应的内容。
- 如果我们希望解析出HTML展示
- 可以使用v-html指令
- 该指令后面往往会跟上一个string类型
- 会将string的html解析出来并且进行渲染
- 可以使用v-html指令
v-once
v-html
将内容编译成标签
v-text
v-text作用和Mustache一致:
v-text通常情况下,接受一个string类型
v-pre
v-block
属性绑定v-bind
属性的绑定v-bind:“属性名称”=”变量名(data中的)”
属性的绑定简写:“属性名称”
双标签的的内容用{{data中的属性名称}}
切换都只需要更新data中的数据即可
v-bind介绍
除了内容需要动态来决定外,某些属性我们也希望动态来绑定。
比如动态绑定a元素的href属性
比如动态绑定img元素的src属性
这个时候,我们可以使用v-bind指令:
作用:动态绑定属性
缩写::
预期:any (with argument) | Object (without argument)
参数:attrOrProp (optional)
v-bind的基础
v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值
在开发中,有哪些属性需要动态进行绑定呢?
还是有很多的,比如图片的链接src、网站的链接href、动态绑定一些类、样式等等
比如通过Vue实例中的data绑定元素的src和href,代码如下
v-bind语法糖
属性的绑定简写:“属性名称”
<div id="app">
<div>{{username}}</div>
<input :value="username">
<input v-bind:value="username">
<div :style="styleName">{{content}}</div>
</div>
v-bind动态绑定class
对象语法
对象语法的含义是:class后面跟的是一个对象
对象语法有下面这些用法
- 直接通过{}绑定一个类
<h2 :class="{'active': isActive}">Hello World</h2>
- 也可以通过判断,传入多个值(属性名是类名 属性值是boolean值)
<h2 v-bind:class="{类名1: true, 类名2: boolean}">{{message}}</h2>
<h2 :class="{'active': isActive, 'line': isLine}">Hello World</h2>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
.error{
color:red
}
.success{
color:green
}
</style>
</head>
<body>
<div id="app">
用户名<input v-model="username" placeholder="只能是数字字母_组成不能是数字开头长度5到10位"/><span :class="{success:issuccess,error:iserror}">{{usernametip}}</span>
<button @click="check">检查</button>
</div>
</body>
<script>
var vm = new Vue({
el:"#app",
data:{
username:"",
usernametip:"请输入正确的用户名",
usernameReg:/^[a-z_$][0-9a-z$_]{4,9}$/i,
issuccess:false,
iserror:true
},
methods:{
check(){
if(this.usernameReg.test(this.username)){
this.usernametip="√";
this.iserror = false;
this.issuccess = true;
}else{
this.usernametip="请输入正确的用户名"
this.iserror = true;
this.issuccess = false;
}
}
}
})
</script>
</html>
-
和普通的类同时存在,并不冲突
注:如果isActive和isLine都为true,那么会有title/active/line三个类
// 固定的class直接写,而后面可能会删除的class,则进行动态绑定
<h2 class="title" :class="{'active': isActive, 'line': isLine}">Hello World</h2>
-
如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.active {
color: red;
}
</style>
</head>
<body>
<div id="app">
<!--<h2 class="active">{{message}}</h2>-->
<!--<h2 :class="active">{{message}}</h2>-->
<!--<h2 v-bind:class="{key1: value1, key2: value2}">{{message}}</h2>-->
<h2 v-bind:class="{类名1: true, 类名2: boolean}">{{message}}</h2>
<h2 class="title" v-bind:class="{active: isActive, line: isLine}">{{message}}</h2>
<h2 class="title" v-bind:class="getClasses()">{{message}}</h2>
<button v-on:click="btnClick">按钮</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
isActive: true,
isLine: true
},
methods: {
btnClick: function () {
this.isActive = !this.isActive
},
getClasses: function () {
return {active: this.isActive, line: this.isLine}
}
}
})
</script>
</body>
</html>
数组语法
数组语法的含义是:class后面跟的是一个数组
数组语法有下面这些用法
-
直接通过{}绑定一个类
<h2 :class="['active']">Hello World</h2>
-
也可以传入多个值
<h2 :class=“[‘active’, 'line']">Hello World</h2>
-
和普通的类同时存在,并不冲突
注:会有title/active/line三个类
<h2 class="title" :class=“[‘active’, 'line']">Hello World</h2>
-
如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <h2 class="title" :class="[active, line]">{{message}}</h2> <h2 class="title" :class="getClasses()">{{message}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊', active: 'aaaaaa', line: 'bbbbbbb' }, methods: { getClasses: function () { return [this.active, this.line] } } }) </script> </body> </html>
v-bind动态绑定style
对象语法
<h2 :style="{key(属性名): value(属性值)}">{{message}}</h2>
<!--'50px'必须加上单引号, 否则是当做一个变量去解析-->
<!--<h2 :style="{fontSize: '50px'}">{{message}}</h2>-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.title {
font-size: 50px;
color: red;
}
</style>
</head>
<body>
<div id="app">
<!--<h2 :style="{key(属性名): value(属性值)}">{{message}}</h2>-->
<!--'50px'必须加上单引号, 否则是当做一个变量去解析-->
<!--<h2 :style="{fontSize: '50px'}">{{message}}</h2>-->
<!--finalSize当成一个变量使用-->
<!--<h2 :style="{fontSize: finalSize}">{{message}}</h2>-->
<h2 :style="{fontSize: finalSize + 'px', backgroundColor: finalColor}">{{message}}</h2>
<h2 :style="getStyles()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
finalSize: 100,
finalColor: 'red',
},
methods: {
getStyles: function () {
return {fontSize: this.finalSize + 'px', backgroundColor: this.finalColor}
}
}
})
</script>
</body>
</html>
数组语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2 :style="[baseStyle, baseStyle1]">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
baseStyle: {backgroundColor: 'red'},
baseStyle1: {fontSize: '100px'},
}
})
</script>
</body>
</html>
事件监听
方法绑定
方法的绑定的v-on:click=“methods中的方法名称”
简写@click="方法名称”
v-on介绍
在前端开发中,我们需要经常和用于交互。
这个时候,我们就必须监听用户发生的时间,比如点击、拖拽、键盘事件等等
在Vue中如何监听事件呢?使用v-on指令
v-on****介绍
作用:绑定事件监听器
缩写:@
预期:Function | Inline Statement | Object
参数:event
v-on基础
v-on参数
当通过methods中定义方法,以供@click调用时,需要注意参数问题:
-
情况一:如果该方法不需要额外参数,那么方法后的()可以不添加。
但是注意:如果方法本身中有一个参数,那么会默认将原生事件event参数传递进去
-
情况二:如果需要同时传入某个参数,同时需要event时,可以通过$event传入事件
v-on修饰符
在某些情况下,我们拿到event的目的可能是进行一些事件处理。
Vue提供了修饰符来帮助我们方便的处理一些事件:
.stop - 调用 event.stopPropagation()。
.prevent - 调用 event.preventDefault()。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调
双向绑定
v-model
- set/get
- Object.defineProperty
商品数量<input v-model="goodsnum"/>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
商品数量<input v-model="goodsnum"/>
商品价格<input v-model="goodsprice"/>
总价<input :value="goodsprice*goodsnum"/>
<button @click="submit">提交</button>
</div>
</body>
<script>
new Vue({
el:"#app",
data:{
goodsnum:100,
goodsprice:2
},
methods:{
submit(){
console.log(this.goodsnum);
console.log(this.goodsprice);
}
}
})
</script>
</html>
双向绑定的问题
两个元素同时双向绑定,会有问题,需要使用事件改造其中一个双向绑定
原生实现双向绑定
-
html结构如下
<div id="app"> 商品数量<input id="goodsnum"> 商品价格<input id="goodsprice" > 总价<input id="total" /> </div>
-
script中的js如下
<script> //set设置 给对象的属性设置值 a="leson" //get得到 获取对象的属性值 a var goodsnumInput =document.getElementById("goodsnum"); var goodspriceInput = document.getElementById("goodsprice"); var totalInput = document.getElementById("total"); var goodsInfo = { goodsnum:100, goodsprice:5, // set _num(num){ // this.goodsnum = num; // this.total; // }, // set _price(price){ // this.goodsprice = price; // this.total; // }, // get total(){ // totalInput.value = this.goodsnum * this.goodsprice; // } } Object.defineProperty(goodsInfo,"_num",{ set(num){ this.goodsnum = num; this.total; } }) Object.defineProperty(goodsInfo,"_price",{ set(price){ this.goodsprice = price; this.total; } }) Object.defineProperty(goodsInfo,"total",{ get(){ totalInput.value = this.goodsnum * this.goodsprice; } }) goodsnumInput.value = goodsInfo.goodsnum; goodspriceInput.value =goodsInfo.goodsprice; totalInput.value = goodsInfo.goodsnum*goodsInfo.goodsprice; goodsnumInput.oninput = function(){ goodsInfo._num = goodsnumInput.value;//数据更新 } goodspriceInput.oninput = function(){ goodsInfo._price = this.value;//数据更新 } </script>
条件语句
v-if
v-if、v-else-if、v-else
- v-if的原理:
- v-if后面的条件为false时,对应的元素以及其子元素不会渲染。
- 也就是根本没有不会有对应的标签出现在DOM中
<div id="app">
{{rand}}
<div v-if="rand>80">
优秀
</div>
<div v-else-if="rand>70">
良好
</div>
<div v-else-if="rand>60">
及格
</div>
<div v-else="rand<70">
不及格
</div>
</div>
<script>
new Vue({
el:"#app",
data:{
score:"",
rand:Math.round(Math.random()*100)
},
methods:{
}
})
</script>
</html>
条件渲染案例
<div id="app">
<div v-if="flag">
显示隐藏切换
</div>
<button @click="change">{{text}}</button>
</div>
<script>
new Vue({
el:"#app",
data:{
flag:true,
text:"隐藏"
},
methods:{
change(){
if(this.flag == true){
this.text = "出现";
this.flag=false;
}else{
this.text = "隐藏";
this.flag=true;
}
}
}
})
</script>
v-show
频繁切换用v-show
节点一直存在 不会消失
表达式结果为false,就隐藏,否则就是显示
v-i和v-show对比
v-if和v-show都可以决定一个元素是否渲染,那么开发中我们如何选择呢?
-
v-if 满足条件才会生成页面节点,当条件为false时,压根不会有对应的元素在DOM中
-
v-show 节点一直存在 不会消失,表达式结果为false,就隐藏,否则就是显示
当条件为false时,仅仅是将元素的display属性设置为none而已
相关思考:重绘和重排
开发中如何选择呢?
当需要在显示与隐藏之间切片很频繁时,使用v-show
当只有一次切换时,通过使用v-if
循环语句
v-for 指令
v-for循环范围
循环1-10的整数,
注意:i是从1开始
用v-if,判断当i>5时,变相实现循环5-10
- for的优先级高于if
v-for 指令需要以 site in sites 形式的特殊语法
sites 是源数据数组 并且 site 是数组元素迭代的别名
<li v-for="(item,index) in menuList" :class="{selected:index==selectedIndex}" @click="clickLI(index)" >
{{item}}{{index}}
</li>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
.error{
color:red
}
.success{
color:green
}
.selected{
color:red
}
.hide{
display: none;
}
</style>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,index) in menuList" :class="{selected:index==selectedIndex}" @click="clickLI(index)" >
{{item}}{{index}}
</li>
</ul>
<ul>
<li v-for="(item,index) in contentList" :style="{
display:(index==selectedIndex?show:hide)
}">
{{item}}
</li>
</ul>
</div>
</body>
<script>
var vm = new Vue({
el:"#app",
data:{
menuList:["菜单一","菜单二","菜单三","菜单四"],
selectedIndex:0,
contentList:["内容一","内容二","内容三","内容四"],
hide:"none",
show:"block"
},
methods:{
clickLI(index){
this.selectedIndex = index;
}
}
})
</script>
</html>
v-for遍历数组
当我们有一组数据需要进行渲染时,我们就可以使用v-for来完成。
v-for的语法类似于JavaScript中的for循环。
格式如下:item in items的形式。
我们来看一个简单的案例:
如果在遍历的过程中不需要使用索引值
v-for=“movie in movies”
依次从movies中取出movie,并且在元素的内容中,我们可以使用Mustache语法,来使用movie
如果在遍历的过程中,我们需要拿到元素在数组中的索引值呢?
语法格式:v-for=(item, index) in items
其中的index就代表了取出的item在原数组的索引值。
v-for遍历对象
组件的key属性
检测数组更新
- 因为Vue是响应式的,所以当数据发生变化时,Vue会自动检测数据变化,视图会发生对应的更新。
- Vue中包含了一组观察数组编译的方法,使用它们改变数组也会触发视图的更新
添加删除数组元素,均影响原数组
find()
查找第一个符合条件的数组元素。它的参数是一个回调函数
-
在回调函数中可以写你要查找元素的条件,当条件成立为true时,
-
返回该元素。如果没有符合条件的元素,返回值为undefined
-
参数:
第一个:执行的回调函数
-
回调函数有三个参数
- value:当前的数组元素
- index:当前索引值
- arr:被查找的数组
const myArr=[1,2,3,4,5,6]; var v=myArr.find((value,index,arr)=>{ return index==4 }); console.log(v);// 5
第二个:指定回调函数的this对象
-
find()方法不会更改原始数组
var Arr = [1,2,3,4,5,6,7,8,9,10]
//获取数组Arr中第一个大于5的元素
var newArr = Arr.find(function(item){
return item > 5
})
console.log(newArr) // 6
console.log(Arr) // [1,2,3,4,5,6,7,8,9,10]
findIndex()
findIndex()与find()的使用方法相同
- 只是当条件为true时findIndex()返回的是索引值,而find()返回的是元素
- 如果没有符合条件元素时findIndex()返回的是-1,而find()返回的是undefined
findIndex()当中的回调函数也是接收三个参数,与find()相同
array.findIndex(callback, thisArg)
array.findIndex(function(element, index, arr), thisArg)
var num = [1, 30, 39, 29, 10, 13];
var val = num.findIndex(myFunc);
function myFunc(element) {
return element >= 18;
}
indexOf(数组元素)
indexOf[‘要查找的字符’,[起始位置]]
第二个参数起始位置是 可选参数
- indexOf(数组元素) 作用就是返回该数组元素的索引号,从前面开始查找
- 它只返回第一个满足条件的索引号,只找第一个
- 如果找不到该元素,则返回-1
var arr = ['red', 'green', 'blue', 'pink'];
console.log(arr.indexOf('blue'));
includes() 判断数组中是否含有某个元素
- 存在该元素,返回true
- 不存在该元素,返回false
- 不影响原数组
var arr = ['red', 'green', 'blue', 'pink'];
console.log(arr.includes('blue'));
splice
通过删除或替换现有元素或者原地添加新的元素来修改数组
并以数组形式返回被修改的内容。
此方法会改变原数组。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
splice之删除
- splice(startIndex, n)
- startIndex起始下标
- n 要删除的个数
- 返回值是被删除的元素 形参的数组
- 影响原数组
var list = ['a', 'b', 'c','d'];
list.splice(1,1);
splice之新增
- startIndex起始下标
- 0 表示要删除0个
- splice(startIndex, arg1,agr2…agrN) 字第三个参数开始 代表新增的元素
- 返回值是空数组 => 没有删除元素
- 影响原数组
var list = ['a', 'b', 'c','d'];
list.splice(2,0,'hello');
splice之修改
- 先删除,再新增同等个数
- startIndex起始下标
- 0 要删除0个
- 返回值是被删除元素组成的数组
- splice(startIndex, arg1,agr2…agrN) 字第三个参数开始 代表新增的元素
var list = ['a', 'b', 'c','d'];
// 删除几个,就新增几个
list.splice(2,2,'hello','hello');
map 遍历数组
-
不改变原数组,返回操作后的数组
-
将回调函数的返回值,用新数组保存,返回
var list = [1, 9, 6 ,2];
list.map(function (item,index){
console.log(item,index);
}
//
var arr = list.map(function (item,index){
// return item + 10;
// return index + 1
}
// 新数组
console.log(arr)
filter 把满足条件的元素筛选出来,放到新数组中
-
不改变原数组,返回操作后的数组
-
回调函数返回一个条件,return一个条件表达式
-
把满足条件的元素筛选出来,放到新数组中
var list = [1, 9, 6 ,2];
var newArr = list.filter(function (item,index){
return item % 2 == 0;
}
console.log(newArr);
some 只要有一个满足,则返回true
- return一个表达式
- 只要有一个满足,则返回true
- 都不满足,返回false
var list = [1, 9, 6 ,2];
var flag = list.some(function (item,index){
return item > 90;
}
// 没有则返回false
console.log(flag);
every 判断每一个元素是否都满足条件
- 全部满足,则返回true
- 有一个不满足,返回false
var list = [1, 9, 6 ,2];
var flag = list.every(function (item,index){
return item > 0;
})
// 满足返回true
console.log(flag);
computed计算属性
补充data的
计算属性是有返回值的
数据要做展示,但是在展示之前,需要对他们做一些结合或者变化,再展示,即,需要使用计算属性
但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示
我们调用它的时候,就把它当成一个属性来调用就行。
- 比如我们有firstName和lastName两个变量,我们需要显示完整的名称。
- 但是如果多个地方都需要显示完整的名称,我们就需要写多个
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
用户名:<input v-model="username" />
<span>{{usernametip}}</span>
<br/>
</div>
</body>
<script>
new Vue({
el:"#app",
data:{
datasource:["leson","lili","lulu"],
username:"",
},
computed:{
usernametip(){
if(this.datasource.find(item=>item==this.username)){
return "该用户名不可用";
}else{
return "该用户名可用"
}
}
}
})
</script>
</html>
watch 监听属性
watch 来响应数据的变化(只能监听一层)
它可以用来监测Vue实例上的数据变动
没有返回值
watch是什么
- 监测 Vue 实例变化的一个表达式或方法。回调函数得到的参数为新值和旧值,用一个函数取代。
- 简洁的说:watch的作用可以监控一个值的变换,并调用因为变化需要执行的方法。可以通过watch动态改变关联的状态。
watch选项
- 类型:{ [key: string]: string | Function | Object | Array }
- 详细:一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例i化时调用 $watch(),遍历 watch 对象的每一个属性
- 通俗解释:watch选项能够监听值的变化
<div>
<p>Number: {{ myNumber }}</p>
<p>Number: <input type="text" v-model.number="myNumber"></p>
</div>
new Vue({
el: '#root',
data: {
myNumber: 'Dawei'
},
watch: {
myNumber(newVal, oldVal) {
console.log('newVal', newVal);
console.log('oldVal', oldVal);
}
}
})
handler方法
- handler方法就是你watch中需要具体执行的方法
immediate属性
-
immediate为true时则立即触发回调函数;
第一次就会触发监听
如果为false,则和下面的例子一样,不会立即执行回调
<div> <p>Number: {{ myNumber }}</p> <p>Number: <input type="text" v-model.number="myNumber"></p> </div> new Vue({ el: '#root', data: { myNumber: 'Dawei' }, watch: { myNumber: { handler(newVal, oldVal) { console.log('newVal', newVal); console.log('oldVal', oldVal); }, immediate: true } } })
deep属性
watch用法
vue.js中watch的六种用法(附实例解析)
在vue中,使用watch来响应数据的变化。watch的用法大致有三种。下面代码是watch的一种简单的用法
首先确认watch是一个对象,一定要当做对象来用
简单写法
<input type="text" v-model="cityName"/>
new Vue({
el: '#root',
data: {
cityName: 'shanghai'
},
watch: {
cityName(newName, oldName) {
// ...
}
}
})
使用监听处理函数
直接写一个监听处理函数,当每次监听到 cityName 值发生改变时,执行函数。也可以在所监听的数据后面直接加字符串形式的方法名:
watch: {
cityName: 'nameChange'
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
用户名:<input v-model="username" />
<span>{{usernametip}}</span>
<br/>
</div>
</body>
<script>
new Vue({
el:"#app",
data:{
datasource:["leson","lili","lulu"],
username:"",
usernametip:""
},
watch:{
username(newValue,oldValue){
if(this.datasource.indexOf(newValue)==-1){
this.usernametip="该用户名可用"
}else{
this.usernametip="该用户名不可用"
}
}
}
})
</script>
</html>
deep深度监听
一般对象或者集合,采用深度监听
注销监听
deep是在对象中层层遍历,并在监听对象上的每一个属性上都添加监听,固然也会损耗性能
但对于组件开发的情况下是不存在,监听事件会随着组件的销毁而销毁
而在组件外声明的监听事件,我们需要使用unWatch方法注销,防止内存溢出
filter
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
日期:{{date|filterDate("yyyy年mm月dd日")}}
</div>
</body>
<script>
Date.prototype.dateFormat=function(str){
var year = this.getFullYear();
var month = this.getMonth()+1;
var day = this.getDate();
return str.replace("yyyy",year).replace("mm",month).replace("dd",day);
}
new Vue({
el:"#app",
data:{
date:new Date()
},
filters:{
filterDate(value,str){
return new Date(value).dateFormat(str)
}
}
})
</script>
</html>
对象的继承
通过__proto__
进行对象继承