在学习前端框架Vue时,遇到了组件之间的传值问题,索性take a note。
组件
父子组件
父子关系即是组件 A 在它的模板中使用了组件 B,那么组件 A 就是父组件,组件 B 就是子组件。
我们可以这样理解:Vue实例就是一个父组件,而我们定义的组件(包括全局组件、私有组件)就都是子组件。
1 | // 注册一个子组件 |
直接使用father组件的时候:
1 | <div id="app"> |
页面中就会渲染出 :我是father的子组件!
father 组件在模板中使用了 child 组件,所以它就是父组件,child 组件被使用,所以 child 组件就是子组件。
兄弟组件
两个组件互不引用,则为兄弟组件。
1 | Vue.component('brother1', { |
使用组件的时候:
1 | <div id="app"> |
页面中就会渲染出 :
我是大哥
我是小弟
Prop
子组件想要使用父组件的数据,我们需要通过子组件的 props 选项来获得父组件传过来的数据。以下我使用在 .vue 文件中的格式来写例子。
在父组件 father.vue 中引用子组件 child.vue,把 name 的值传给 child 组件。
1 | // child.vue |
1 | //father.vue |
页面会渲染出Hello World
举例2:
在父组件传值的子组件内部定义prop数组,将父组件内部的data内部要传的数据的名称作为子组件引用值的属性的值,
如,有子组件component1,父组件div,在父组件内部引用子组件,子组件使用父组件的值,
要传父组件data中的msg:’父组件中的数据’,在子组件使用父组件的值时,如下使用v-bind定义属性名parent-msg作为使用值的标签(你也可以设置为:parentMsg)所以,在目的地子组件内部定义prop属性,值设置为parentMsg(驼峰式命名的 prop 需要转换为相对应的短横线隔开式 is-show)。然后:parentMsg的值,为msg(要传父组件data中的值的keyName)
1 |
|
子组件中,data中的数据和props中的数据的区别:
- 子组件中的 data 数据,并不是通过 父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上。props 中的数据,都是通过 父组件 传递给子组件的。
- data中的数据是可读可写的;props中的属性只是可读的,无法重新赋值,重新赋值会报错(也就是说,子组件不要直接去修改父组件中的数据)。
父组件将方法传递给子组件
父组件通过事件绑定机制,将父组件的方法传递给子组件
代码举例:
下面例子,我们来演示 当点击子组件的按钮时,拿到父组件传递过来的 方法,并调用这个方法
我们在子组件的method中定义了一个函数来实现调用父组件的show函数,通过调用$emit函数,在子组件地方使用了@关键字来表示要调用父组件的事件属性parent-show,然后将函数名作为值,此时,对于$emit函数,我们使用事件属性名parent-show作为参数传入。
1 |
|
效果:(点击子组件,触发了父组件的方法)
在这个过程中,我们对父组件传递的show的参数做一点点修改增加了两个参数,并实现将两个参数的值打印出来。
所以,在调用$emit函数的时候,就必须多传入两个参数。这样,我们实现了在子组件内部将数据作为参数传入到父组件。
代码如下:
1 |
|
我们还可以将子组件中的data数据传递给父组件,存放到父组件的data中,
代码如下:
1 |
|
在Vue中,通过 ref 属性获取DOM元素
我们当然可以使用JS原生的做法(document.getElementById)或者 jQuery 来获取DOM,但是这种做法却在无形中操作了DOM,在Vue框架中并不推荐这种做法。
我们可以通过ref
属性获取DOM元素。
ref
的英文单词是reference,表示引用。我们平时可以经常看到控制台会报错referenceError的错误,就和引用类型的数据有关。
在Vue中,通过 ref 属性获取DOM元素的步骤:
(1)第一步:在标签中给 DOM 元素设置 ref 属性。
1 | <h3 id="myH3" ref="myTitle"> 今天天气太好了</h3> |
(2)第二步:通过 this.this.$refs.xxx 获取 DOM 元素
1 | console.log(this.$refs.myTitle.innerText) |
举例如下:
1 |
|
运行上方代码,然后我们在控制台输入vm
,就可以看到:
使用 ref 属性获取整个子组件
根据上面的例子,我们可以得出规律:只要ref
属性加在了DOM元素身上,我们就可以获取这个DOM元素。
那我们可以通过ref属性获取整个Vue子组件吗?当然可以。这样做的意义是:**在父组件中通过ref
属性拿到了子组件之后,就可以进一步拿到子组件中的data和method。
举例:
1 |
|
运行代码,点击按钮后,效果如下:
我们直接在控制台输入vm
,可以看到: