Skip to content

Commit 37b7b7a

Browse files
committed
add Vue 2.x:父组件给子组件传值
1 parent aaf0b1c commit 37b7b7a

File tree

3 files changed

+177
-3
lines changed

3 files changed

+177
-3
lines changed

21-Vue基础/04-Vue动画.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ animate.css网址:
501501

502502
<body>
503503
<div id="app">
504-
<input type="button" value="快到碗里来" @click="flag=!flag">
504+
<input type="button" value="加入购物车" @click="flag=!flag">
505505
<!-- 1. 使用 transition 元素把 小球包裹起来 -->
506506
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
507507
<div class="ball" v-show="flag"></div>
@@ -536,7 +536,8 @@ animate.css网址:
536536
afterEnter(el) {
537537
// 动画完成之后,会调用 afterEnter
538538
// console.log('ok')
539-
this.flag = !this.flag //动画结束后,让小球消失(直接让 flag 取反即可)
539+
// 动画结束后,让小球消失(直接让 flag 取反即可)
540+
this.flag = !this.flag // 因为最开始的时候,小球就是处于消失的状态,这行代码可以让小球的动画重新开始
540541
}
541542
}
542543
});
@@ -548,7 +549,7 @@ animate.css网址:
548549
```
549550

550551

551-
运行效果如下:
552+
运行效果如下:(我们可以用这种动画效果,做类似于“加入购物车”的动画效果)
552553

553554
![](http://img.smyhvae.com/20180616_1618.gif)
554555

21-Vue基础/05-Vue组件.md

+74
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,80 @@ Vue.component('myComponent', myAccount); //第一个参数是组件的名称(
763763
![](http://img.smyhvae.com/20180617_1957.gif)
764764

765765

766+
## 多个组件切换时,通过mode属性添加过渡的动画
767+
768+
769+
770+
```html
771+
<!DOCTYPE html>
772+
<html lang="en">
773+
774+
<head>
775+
<meta charset="UTF-8">
776+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
777+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
778+
<title>Document</title>
779+
<script src="vue2.5.16.js"></script>
780+
<style>
781+
.v-enter,
782+
.v-leave-to {
783+
opacity: 0;
784+
transform: translateX(150px);
785+
}
786+
787+
.v-enter-active,
788+
.v-leave-active {
789+
transition: all 0.5s ease;
790+
}
791+
</style>
792+
</head>
793+
794+
<body>
795+
<div id="app">
796+
<a href="" @click.prevent="comName='login'">登录</a>
797+
<a href="" @click.prevent="comName='register'">注册</a>
798+
799+
<!-- 通过 mode 属性,设置组件切换时候的 过渡动画 -->
800+
<!-- 【重点】亮点是 mode="out-in" 这句话 -->
801+
<transition mode="out-in">
802+
<component :is="comName"></component>
803+
</transition>
804+
805+
</div>
806+
807+
<script>
808+
// 组件名称是 字符串
809+
Vue.component('login', {
810+
template: '<h3>登录组件</h3>'
811+
})
812+
813+
Vue.component('register', {
814+
template: '<h3>注册组件</h3>'
815+
})
816+
817+
// 创建 Vue 实例,得到 ViewModel
818+
var vm = new Vue({
819+
el: '#app',
820+
data: {
821+
comName: 'login' // 当前 component 中的 :is 绑定的组件的名称
822+
},
823+
methods: {}
824+
});
825+
</script>
826+
</body>
827+
828+
</html>
829+
```
830+
831+
运行效果:
832+
833+
20180618_2240.gif
834+
835+
如上方代码所示,多个组件切换时,如果要设置动画,可以用`<transition>`把组件包裹起来。需要注意的是,我给`<transition>`标签里添加了`mode="out-in"`这种模式,它表示第一个组件消失之后,第二个组件才会出现。如果没有这个mode属性,效果如下:(第一个组件准备消失的时候,第二个组件马上就准备出现,这不是我们想要的效果)
836+
837+
20180618_2245.gif
838+
839+
766840
## 我的公众号
767841

768842
想学习<font color=#0000ff>**代码之外的软技能**</font>?不妨关注我的微信公众号:**生命团队**(id:`vitateam`)。
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
2+
3+
## 父组件向子组件传值
4+
5+
6+
我们可以这样理解:Vue实例就是一个**父组件**,而我们自定义的组件(包括全局组件、私有组件)就是**子组件**
7+
8+
需要注意的是,子组件不能直接使用父组件中的数据。**父组件可以通过`props`属性向子组件传值**
9+
10+
代码举例:
11+
12+
```html
13+
<!DOCTYPE html>
14+
<html lang="en">
15+
16+
<head>
17+
<meta charset="UTF-8">
18+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
19+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
20+
<title>Document</title>
21+
<script src="vue2.5.16.js"></script>
22+
</head>
23+
24+
<body>
25+
<div id="app">
26+
<!--第二步:父组件在引用子组件的时候, 通过 属性绑定(v-bind:)的形式, 把 需要传递给 子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用 -->
27+
<component1 v-bind:parent-msg="msg"></component1>
28+
</div>
29+
30+
<!-- 定义子组件的模板 -->
31+
<template id="myTemplate">
32+
<h1 @click="change">我是子组件。我想使用父组件中的数据parentMsg: {{ parentMsg }}</h1>
33+
</template>
34+
35+
<script>
36+
// 创建 Vue 实例,得到 ViewModel
37+
var vm = new Vue({
38+
el: '#app',
39+
data: {
40+
msg: '父组件中的数据123'
41+
},
42+
methods: {},
43+
components: {
44+
// 子组件默认无法访问到 父组件中的 data 中的数据 和 methods 中的方法
45+
component1: {
46+
template: '#myTemplate',
47+
data() { // 注意: 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上;
48+
// data 上的数据,都是可读可写的
49+
return {
50+
title: '子组件私有的数据 title',
51+
content: '子组件私有的数据 content'
52+
}
53+
},
54+
// 注意: 组件中的 所有 props 中的数据,都是通过 父组件 传递给子组件的
55+
// props 中的数据,都是只读的,无法重新赋值(也就是说,)
56+
props: ['parentMsg'], // 第一步:把父组件传递过来的 parentmsg 属性,先在 props 数组中,定义一下,这样,才能使用这个数据
57+
directives: {},
58+
filters: {},
59+
components: {},
60+
methods: {
61+
change() {
62+
// 下面这行会报错,因为子组件不要直接修改父组件中的data数据
63+
// this.parentmsg = '被修改了'
64+
}
65+
}
66+
}
67+
}
68+
});
69+
</script>
70+
</body>
71+
72+
</html>
73+
```
74+
75+
76+
效果如下:
77+
78+
20180618_2350.png
79+
80+
代码截图如下:
81+
82+
20180618_2355.png
83+
84+
85+
**父组件给字组件传值的步骤**
86+
87+
> 根据上方截图,我们可以总结出父组件给子组件传值的步骤。
88+
89+
子组件中,data中的数据和props中的数据的区别:
90+
91+
-
92+
93+
94+
- data中的数据是可读可写的;props中的属性只是可读的,无法重新赋值,重新赋值会报错(也就是说,子组件不要直接去修改父组件中的数据)。
95+
96+
97+
98+
99+

0 commit comments

Comments
 (0)