父子组件传值
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) // 函数名后面,都是需要传入的参数}}}}}
