老鬼的博客 来都来啦,那就随便看看吧~
vue学习笔记-day3
发布于: 2019-03-18 更新于: 2019-11-23 分类于: Html 阅读次数: 

一:从后端接口加载微信用户列表

1.后端返回数据格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[
{
"openId": "asjdkfals",
"nickName": "老鬼",
"gender": "M",
"city": "上海",
"province": "上海",
"country": "中国",
"avatarUrl": "https://static.tohours.com/salesplus_sit/images/aia.png",
"unionid": "asdfasd",
"sessionKey": "12312",
"insertTime": "2019-03-19",
"updateTime": "2019-03-19"
}
]

2.说明

1
2
3
使用axios从本地服务中加载数据,其中要注意的是,尽可能早的都设置数据,因为网络请求也需要一点时间,
其中我们写过v-for可以从方法中加载数据,这种方式不行,如果直接返回res.data则没有改变data中的数据,
所以不会重新渲染数据,如果将this.list = res.data,则会造成一直重复的渲染页面。

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!DOCTYPE html>
<html leng="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>01.从后端获取微信用户列表</title>
<link rel="stylesheet" href="./lib/bootstrap-3.3.7.css">
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/axios.min.js"></script>
<script src="./lib/my.axios.js"></script>
</head>
<body>
<div id="app">

<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">添加微信用户</h3>
</div>
<div class="panel-body form-inline">
<label>
Id:<input type="text" class="form-control" v-model="id"/>
</label>
<label>
Name:<input type="text" class="form-control" v-model="name"/>
</label>

<input type="button" value="添加" class="btn btn-primary" @click="add"/>

<label>
关键词搜索:<input type="text" class="form-control" v-model="keyWords"/>
</label>
</div>

</div>

<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>openId</th>
<th>nickName</th>
<th>gender</th>
<th>city</th>
<th>province</th>
<th>country</th>
<th>avatarUrl</th>
<th>unionid</th>
<th>sessionKey</th>
<th>insertTime</th>
<th>updateTime</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :key="item.openId">
<td v-text="item.openId"></td>
<td v-text="item.nickName"></td>
<td v-text="item.gender"></td>
<td v-text="item.city"></td>
<td v-text="item.province"></td>
<td v-text="item.country"></td>
<td v-text="item.avatarUrl"></td>
<td v-text="item.unionid"></td>
<td v-text="item.sessionKey"></td>
<td v-text="item.insertTime"></td>
<td v-text="item.updateTime"></td>
<td><a href="" @click.prevent="del(item.id)">删除</a></td>
</tr>
</tbody>
</table>

</div>
</body>
<script>

//自定义格式化日期的方法
function format(date,fmt) {
var o = {
"M+" : date.getMonth()+1, //月份
"d+" : date.getDate(), //日
"h+" : date.getHours(), //小时
"m+" : date.getMinutes(), //分
"s+" : date.getSeconds(), //秒
"q+" : Math.floor((date.getMonth()+3)/3), //季度
"S" : date.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)) {
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}

//自定义全局过滤器
Vue.filter('formatDate',function(date){
return format(date,'yyyy-MM-dd');
});

var vm = new Vue({
el:'#app',
data:{
id:'',
name:'',
keyWords:'',
list:[
]
},methods:{
del(id){
console.log('delete:' + id);
this.list.some((item,i) =>{
if(item.id == id){
this.list.splice(i,1);
return true;
}
})
},
add(){
this.list.push({id:this.id,name:this.name,ctime:new Date()});
},
getAllList(){//这种方式实现获取不到,以为没有data中的数据没有改变,所以也就不重新渲染页面
//如果你先return this.list;然后再res的返回中设置this.list = res.data,此时会重复一直的渲染页面
var ins = httpGetInstance();
ins.get('/wx/list').then(res => {
console.log(res);
console.log(res.data);
return res.data;
}).catch(error => {
console.log(error);
});
}
}, created(){
var ins = httpGetInstance();
ins.get('/wx/list').then(res => {
this.list = res.data;
}).catch(error => {
console.log(res);
});
}
})


</script>
</html>

4.案例展示

二:新增微信用户到数据库

1
使用的axios post访问写入到后台,具体方法请看下面的案例。

三:从数据库中删除微信用户

四:vue中的动画

1.官方地址

2.介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.使用transition元素(ue官方提供的元素)将需要被动画控制的部分包裹起来。
2.自定义两组样式,来控制transition内部元素实现动画
.v-enter,.v-leave-to{
opacity: 0;
transform: translateX(150px);
}
.v-enter-active,.v-leave-active{
transition: all 0.8s ease;
}

v-enter:是个时间点,表示动画未进入之前的状态
v-leave-to:是个时间点,表示动画离开以后的状态
v-enter-active:是个时间片,表示动画进入的过程
v-leave-active:是个时间片,表示动画离开的过程。

3.自定义v-前缀

1
2
3
4
5
6
7
8
9
10
11
12
transition默认的前缀是v-指令,如果要要使用自定义的前缀需要给transition设置一个name即可:
<transition name="my">
<h3>msg</h3>
</transition>
此时前缀就是my-,两组样式就要用如下代码:
.my-enter,.my-leave-to{
opacity: 0;
transform: translateX(150px);
}
.my-enter-active,.my-leave-active{
transition: all 0.8s ease;
}

4.使用animate.css实现动画

  • animate官方地址

    animate

  • 代码

1
2
3
4
直接给transition添加class
<transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut">
<h3 v-show="flag">饱受战乱</h3>
</transition>

5.使用钩子函数实现小球半场动画

6.列表的动画transition-group

1
使用v-for循环遍历的,如果要实现动画,不能使用transition,要使用transtion-group

五:组件

1.定义Vue组件

什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可;
组件化和模块化的不同:

  • 模块化: 是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一;
  • 组件化: 是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用;

2.全局组件定义的三种方式

2.1 使用Vue.extend

1
2
3
4
5
6
//1.1使用Vue.extend来创建组建
var com1 = Vue.extend({
template:'<h3>使用Vue.extend</h3>'
});
//1.2 声明组建,第一个是自定义的组建名称,第二个是组件的对象
Vue.component('myCom1',com1);

组件-创建组件的方式1

2.2 直接使用Vue.component+对象

1
2
3
4
//直接使用对象来定义,组件的template必须只能有一个根元素
Vue.component('mycom2',{
template:'<h3>我的第二个组件</h3>'
});

组件-创建组件的方式2

2.3 使用template标签

1
2
3
4
5
6
7
在Vue控制的外部定义template来定义组建,template必须创建在app的外部
<template id="tmpl1">
<h2>使用template标签来创建组建</h2>
</template>
Vue.component('mycom2',{
template:'#tmpl1'
});

组件-创建组件的方式2

3.定义私有组件

1
2
3
4
5
6
7
8
9
10
11
12
var vm = new Vue({
el:'#app',
data:{

},methods:{

},components:{
"mycom2":{
template:"#tmpl1"
}
}
})

私有组件

4.组件中的data和methods

1
2
组件中可以自定义自己的data和methods,不过组件中的data必须是一个方法,返回值必须是一个对象。
并且该对象必须是一个内部对象,因为如果是外部的对象,那么引入多个组件就会有数据共享问题。

组件中的data和methods

5.组件的切换

1
2
1.使用v-if和v-else
2.使用component标签来切换组件

组件切换1
组件切换2
使用component标签切换组件

6.父组件向子组件传递数据

1
2
3
4
5
6
默认情况下,new Vue()中定义的子组件,不能访问new Vue中的data数据。
父组件可以在引入子组件的时候,可以通过属性绑定(v-bind:)的形式,
把需要传递的数据,以属性的方式传递给子组件,供子组件使用。
定义方法如下:parentmsg是子组件引用的,msg是父组件data中的数据,
其中属性不要用驼峰式(parentMsg),要小写(parentmsg),要不然显示不出来。
props和data的区别,data是可读可写的,props是只读的

父组件和子组件中的传值

组件-评论列表案例

7.使用ref获取DOM元素和组件

1
vue提供了ref来获取原生的DOM对象

1.png

ref获取DOM元素和组件

*************感谢您的阅读*************