组件传参
一.子父组件通讯
方法1:prop传参=>用于父传子
-
父组件使用自定义属性的方法定义要传递的数据
:自定义属性名="属性值"
-
子组件用props进行接收数据
-
可以使用props对象的形式接收
props:{ 父组件定义的属性名:{ type:数据类型, required:是否必传, default:默认值 } } -
可以使用数组的方式进行接收
props:["父组件传递过来的属性名"...]
-
方法2:$emit=>用于子传父
-
在子组件中定义一个方法
<button @click="btn">是兄弟就砍我一刀</button>- 在$emit中可以进行参数的传递
methods: { btn(){ // 语法:this.$emit(自定义事件名,参数1,参数2) this.$emit('updataPrice',this.obj.id) } } -
在父组件中子组件触发父组件的自定义事件
- 注意:不要写(),如果写()会覆盖掉子组件中传递过来的参数
<子组件 @updataPrice=updataPriceFn> </子组件>
方法3:.sync 修饰符
- 父组件自定义属性后面加上
.sync修饰符:自定义属性名.sync="属性值"
- 子组件中进行接收方式不变,依旧使用prop进行接收
- 使用.
sync可以在子组件中通过方法修改父组件中传递过来的值this.$emit('update:父组件的属性名', newVal)
.sync只作为emit一样可以实现更改父组件中参数的效果
方法4:v-model传参
-
在父组件中通过v-model="属性值进行传参"
<子组件 v-model="属性值"></子组件>
-
在子组件中通过value进行接收,通过
model进行对value名的修改-
props: { value: { type: Boolean, required: true} } // 通过model.prop修改接收的变量名称 model{ prop:showDialog // 修改默认的value event:xianshi // 修改默认的input }, props: { showDialog: { type: Boolean, required: true} }
-
-
可以在子组件中通过input进行数据的修改
-
close() {this.$emit('input' ,false)}
-
- 可以把v-model理解为model的prop为value, event为input的一种特殊情况
v-model和.sync的区别
- v-model是专门为文本设计的语法糖,可以直接在input标签上用,能对父组件的值进行修改-->因为默认监听了input事件和props的value字段 v-model更专注于表单的绑定
- .sync是自定义事件 update的语法糖
- 在vue2中v-model只能使用一次,但是.sync却可以多次使用
方法5:listeners
$attrs是父组件传递过来的,但是子组件没用prop接收的参数$listeners是父组件中v-on事件监听器- 可以理解为
$attrs和$listeners是两个收纳箱,一个收纳父组件属性,一个收纳父组件方法,并且都已对象的形式进行保存,使用时直接.语法调用即可
方法6:本地缓存交互
利用sessionStorage,localStorage,Cookies 进行数据本地存储
方法7:vuex进行数据存储
- vuex是vue的状态管理工具 可以分为5个模块,主要使用state存储数据,和mutations设置数据
方法8:children
- 使用有条件限制
方法9:ref获取组件,可以调用子组件中的方法和数据的获取
方法10: 组件插槽传参
-
使用具名插槽配合作用域进行传参
- 子组件插槽中使用自定义属性的方法定义参数
<slot :row="defaultObj" name="pannel">{{ defaultObj.defaultOne }}</slot>- 父组件中,使用`v-slot:插槽名=自定义参数值名
- 自定义参数名中包括 所有子组件中传递过来的参数的集合,可以使用
.语法的形式获取使用参数
<template v-slot:pannel="scope"> <p>{{ scope.row.defaultTwo }}</p> </template>
方法11:provide&inject 配合使用
- 这种方法只能配合使用 在父组件中暴露导出自己