vue1-day4

小球动画flag标识符的作用分析

在半场小球动画案例中,的afterEnter钩子函数里面原先写的是this.flag=!this.flag,如果改成el.style.opacity=0.5,则会没有动画效果。
Vue把一个完整的动画,使用钩子函数,拆分为了两部分:我们使用flag标识符,来表示动画的切换;刚一开始,flag=false,然后变成true,然后便变成false。

组件传值–父组件向子组件传值,data和props的区别

子组件中,默认无法访问到父组件中的data上的数据和methods中的方法。
父组件可以在引用子组件的时候,通过属性绑定(v-bind:)的形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用。

把父组件传递过来的属性,先在props数组中,定义一下,这样我们才能在子组件中使用父组件的数据。

注意:
+ 组件中的所有props中的数据,都是通过父组件传递给自组件的。
+ 子组件中的data数据,并不是通过父组件传递过来的,而是子组件自己私有的,比如:子组件通过AJAX,请求回来的数据,都可以放到data身上。
+ props中的数据都是只读的,无法重新赋值
+ data上的数据都是可读可写的。

1
2
3
4
<div id="app">
<!-- 属性绑定在子组件标签中添加‘v-bind:自定义属性名称="父组件属性名称"’就可以达到属性绑定的目的 -->
<com1 v-bind:parentmsg="msg"></com1>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
com:{
data(){
return{
title:'123',
content:'qqq'
}
},
template:'<h1>nnnnn---{{ parentmsg }}</h1>',
props:['parentmsg'],
directives:{},
filters:{},
methods:{}
}

组件传值–子组件通过事件调用向父组件传值(父组件把方法传递给子组件)

1
2
3
4
5
6
7
<div id="app">
<!-- 父组件向子组件传递方法,使用的是事件绑定机制:v-on,当我们自定义了一个事件属性之后,那么子组件就能够通过某些方法来调用传递进去的这个方法了 -->
<!-- 事件绑定在子组件标签中添加‘v-on:自定义事件名称="父组件事件名称"’就可以达到事件绑定的目的 -->
<com1 v-on:func="show"></com1>
<!-- <com1 @func="show"></com1> -->
//如果改成<com1 @func="show()"></com1>,就说明是调用方法,把调用该方法的结果传递给这个事件
</div>
1
2
3
4
5
6
//父组件中的方法
methods:{
show(data,data2){
console.log('aaaa')
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
com:{
data(){
return{
title:'123',
content:'qqq'
}
},
template:'<h1>nnnnn---{{ parentmsg }}</h1>',
props:['parentmsg'],
directives:{},
filters:{},
methods:{
//当点击子组件的按钮的时候,如何拿到父组件传递过来的func方法,并调用这个方法
//emit:英文原意是触发调用发射意思
this.$emit('func',123,456)//调用的func是传递过来的事件绑定的自定义事件名称
//从第二个位置以后都可以进行传参。跟父组件中的方法中需要的参数进行传递
}
}

使用ref获取DOM元素和组件

ref是英文单词reference的简写。
通过ref可以拿到组件的引用和一些组件的数据。
ref也可以拿到一些DOM元素,并且可以在不直接操作DOM元素的情况下去操作DOM元素。引用的时候要加refs,但是绑定的时候不用加s,只用写ref就可以了。由于refs是挂载在实例上的一个对象属性,所以,需要在vm中使用,并且需要添加this来使用。

1
2
3
4
<div id="app">
<h3 id="myh3" ref="myh3">hhhhh</h3>
<login ref="mylogin"></login>
</div>
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
var login = {
template:'<h1>login</login>',
data(){
return {
msg:'son msg'
}
},
methods:{
show(){
console.log('调用了子组件的方法')
}
}
}

var vm = new Vue({
el:'app',
data:{},
methods:{
getelements(){
//console.log(this.$refs.myh3.innerText)
//console.log(this.$refs.mylogin.msg),访问子组件中的数据
//this.$refs.mylogin.show()访问子组件中的方法
}
},
components:{
login
}
})

路由

什么是路由

1、后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源。
2、前端路由:对于单页面应用程序来说,主要通过URL中的hash(#)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容,所以,单页面程序中的原页面跳转主要用hash实现
3、在单页面应用程序中,这种通过hash改变切换页面的方式,乘坐前端路由。(区别于后端路由)

在vue中使用vue-router

基础使用

创建一个路由对象,当导入vue-router包之后,在window全局对象中,就有了一个路由的构造函数,叫做VueRouter,

1
2
3
<div id="app">
<router-view></router-view>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
//组件模板对象
var login = {
template:'<h1>login</login>'
}

var register = {
template:'<h1>register</login>'
}

<!-- var login = Vue.component('login', {
template:'<h1>login</login>'
}) -->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//创建一个对象,在new路由对象的时候,可以为构造函数传递一个配置对象
var router = new VueRouter({
//route //这个配置对象中的route 表示【路由匹配规则】的意思
routes:[
//路由匹配规则,每个路由都是一个对象,这个规则对象,身上有两个必须的属性:
//属性1:是path,表示监听哪个路由连接地址;
//属性2:是component,表示如果路由时前面匹配到的path,则展示component属性对应的哪个组件
//注意:component的属性值,必须是一个组件模板对象,不能是组件的引用名称;
{ path:'/login',component: login },
{ path:'register',component: register}
]
})

//vm实例对象
var vm = new Vue({
el:'#app',
data:{},
methods:{},
components:{},
router: routerObj//将路由规则对象,注册到vm实例上,用来监听URL地址的变化,然后展示对应的组件
});

.router-link-active是路由选中时候的样式设置,是默认的,如果想要修改该属性名称,需要在router构造函数添加一个linkActiveClass:'myclass'来对其进行属性名称修改,这样的话,在设置路由高亮时候的属性名称就要写成.myclass:{}
来对其进行路由高亮显示设置了。

为路由页面切换添加动画

只需要把router-view标签用transition标签包裹起来,然后再进行动画设计

路由传参

query传参

query传参是挂载到一个路由对象上,通过调用路由对象的属性来进行传参的。
query可以多个传参,传参方式如下

1
<router-link to="/login?id=10&name=zs"></login>

如果再路由中,使用查询字符串,给路由传递参数,则不需要修改路由规则(就是router实例中的route对象挂载的几个对象的path)的path属性。
通过this.$route.query.id来获取id的值,this.$route是路由对象,里面有很多路由对象的属性挂载。可以省略this。
模板对象为:

1
2
3
var login = {
template: '<h1>login-----{{ this.$route.query.id }}-----{{ $route.query.name }}'//或者$route.query.id
}

所以query也可以在模板对象上获取多个数据

优点:1、不需要修改path路径规则
2、拿到参数直接通过this.$route.query.参数名或者$route.query.参数名拿到参数

params方式传递路由参数

这个方式说明的是,在/login后面放的就是id这个参数,会一一对应起来。传递参数的时候,直接就在router-link里面的to的路径后面添加要传递的id值过去就行了。具体如下:

1
2
3
4
5
6
var router = new VueRouter({
routers: [
{ path: '/login/:id/:name',component: login },
{ path: '/register/:id/:name',component: register },
]
})
1
<router-link to="/login/12/zs"></login>

要输出到页面上的化,需要在模板对象上面添加变量显示出来

1
2
3
var login = {
template: '<h1>login-----{{ this.$route.params.id }}-----{{ $route.params.name }}'//或者$route.query.id
}

路由嵌套

通过children属性来进行路由嵌套,不过在route属性中的children属性中,添加的path对象的路径不能添加/。
子路由的path前面不要带/。否则永远以根路径开始请求,这样不方便我们用户去理解URL地址

使用命名视图实现经典视图

1
2
3
4
5
6
7
<!-- 直接给每一个坑取一个name属性,然后显示相应属性名字的组件,没有的就显示default的组件 -->
<router-view></router-view>
<div class="container">
<!-- 命名视图 -->
<router-view name="left"></router-view>
<router-view name="main"></router-view>
</div>

直接用三个占位符来分别展示不同组件,从而实现命名试图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var router = new VueRouter({
routes: [
// { path: '/', component: header },
// { path: '/left', component: left },
// { path: '/main', component: main },
//这种方法是不可行的

{
path: '/',
components: {
'default': header,//默认放的组件
'left':left,
'main':main

}
}
]
})

复习

-------------本文结束感谢您的阅读-------------