父子组件传值
1、props+属性
<!-- 父组件 -->
<template>
<div>
<!-- 调用父组件传递的数据 -->
<!-- 在子组件调用的时候,通过属性绑定的方式,将父组件的数据传递给子组件 -->
<comp :parent-msg="msg" @p_click="pClick"></comp>
<!-- 在接受的时候,数据名如果是使用的驼峰语法,那在组件引用的时候必须使用肉串语法 -->
</div>
</template>
<script>
export default {
data() {
return {
msg: "parents's msg!!",
}
},
methods: {
pClick(name) {
console.log(name + ',' + "parents's click")
},
},
}
</script>
<!-- 子组件 comp.vue -->
<template>
<div>
<p @click="sonClick">子组件自己的数据:{{ sonMsg }} ---></p>
<p @click="p2Click('jack')">父组件传递的数据:{{ parentMsg }}</p>
</div>
</template>
<script>
export default {
// 子组件 需要 使用 props 属性接受,父组件传来的数据
data(){
// data 上的数据,是属于子组件自己的,可读可写
return {
sonMsg: 'son-message'
},
},
// 接收 父组件传值,可读不可写
props: ['parentMsg'],
methods:{
sonClick(){
console.log("son's click!!")
},
p2Click(name){
// $emit 触发 父组件 传递过来的方法, 第二个参数是 传递过去的 参数
this.$emit('p_Click', name)
}
}
}
</script>
2、组件上的 children[i]
// 子组件
this.$parent.msg // 读取 父组件上的数据
// 父组件
this.$children[0].s_msg // 读取子组件上的数据,在 mounted 函数中可以读取到,在 created 函数中 读取不到,因为 组件还未挂载到页面,同样的,直接在页面中 使用 插值表达式 读取 子组件的 数据 也是 读取不到的
3、provide+inject
参考:
vue 数据传递 - provide 与 inject
vue组件通信传值的几大方法及组件通信provide/inject的使用
示例:
// 父组件
export default {
provide: {
// 提供值
message: 'hello Vue!',
},
// 或者 需要传入对象的时候
// provide() {
// return {
// testMsg: 'this is a test!'
// }
// },
}
// 子组件
//inject 注入接收后, 子组件中 可以使用 插值 表达式 调用 {{message}}
export default {
name: 'child',
data() {},
inject: ['message'], // 使用值
}
4、$attrs + $listeners
// 多层组件 三级组件中 使用 $attrs
<Chlidred :name="name" :age="age"/>
<GrandChild v-bind="$attrs" />
/**
$attrs 相当于 子组件中接收到所有属性,直接传递给二级子组件
*/
5、ref 获取子组件节点,在父组件中通过属性的方式访问子组件上的属性
父子组件传递方法
<!-- 调用父组件传递的方法 -->
<!-- 在子组件调用的时候,通过事件绑定的方式,将父组件的方法传递给子组件 -->
<comp @parent-fn="show"></comp>
<!-- 在接受的时候,数据名如果是使用的驼峰语法,那在组件引用的时候必须使用肉串语法 -->
// 后来使用的时候,发现 命名和调用规则: 肉串-肉串 驼峰-驼峰
// 父组件的方法
methos: {
show(p1, p2){
console.log('调用了父组件上的show方法')
}
}
// 子组件 需要 使用 props 属性接受,父组件传来的数据
components: {
comp: {
data(){
// data 上的数据,是属于子组件自己的,可读可写
return {
},
// 接收 父组件传值,可读不可写
props: ['parentMsg']
template: `
<input type="button" value="子组件按钮-调用自己的方法" @click="myclick">
<input type="button" value="子组件按钮-调用父组件上的方法" @click="pclick">
`,
methos:{
myclick(){
console.log('子组件自己的方法')
}
pclick(){
// 接收方法的时候,命名全都采用肉串语法,或者全部小写,不要 肉串和驼峰 混用
this.$emit('parent-fn', p1, p2) // 函数名后面,都是需要传入的参数
}
}
}
}
}