|
| 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