Vue子父组件间的传值【非常重要的一个知识点】

Vue中,默认子组件无法直接取得父组件中的数据!所以才需要进行传值操作! 

父组件通过属性绑定形式向子组件传值:

  

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../../js/vue.js"></script>
</head>

<body>
    <div id='app'>
        <com1 :pmsg="parentInfo" :pobj="obj"></com1>
        <!-- 渲染结果: 这就是子组件h3---这是父组件的消息:这是父组件-vm实例的讯息
                        父组件传来的对象---{"name":"jc","age":188}
        
        -->

        <!--父组件通过属性绑定像、向子组件传值
        step1::attr="parentInfo"  在子组件标签 绑定属性
        step2: props:['attr'], props 注册这个属性
    -->
    </div>
</body>
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            parentInfo: '这是父组件-vm实例的讯息', //给子组件传递文本
            obj: {
                name: 'jc',
                age: 188
            },
        },
        methods: {},
        filters: {},
        components: {
            'com1': {
                template: `<div><h3>这就是子组件h3---这是父组件的消息:{{ pmsg }}</h3><h2>父组件传来的对象---{{ JSON.stringify(pobj) }}</h2></div>`,
                props: ['pmsg', 'pobj'], //vue中,只有这个props/prop 是数组,其他属性都是对象
                data: function() {
                    return {}
                },
                methods: {}

            }
        },
    })
</script>

</html>

子组件通过触发父组件上自定义函数,并传值给自定义函数,这样父组件就能接收到子组件传的值:

 <body>
        <div id='app'>
               <com2 @funclick="show"></com2>
        <!--绑定事件funclick到子组件,调用父组件的show方法-->
        </div>
</body> 
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            parentInfo: '这是父组件-vm实例的讯息', //给子组件传递文本
            obj: {
                name: 'jc',
                age: 188
            },
        },
        methods: {
            show(a) {
                console.log('调用show,输出' + a);
            }
        },
        filters: {},
        components: {
            'com1': {
                template: `<div><h3>这就是子组件h3---这是父组件的消息:{{ pmsg }}</h3><h2>父组件传来的对象---{{ JSON.stringify(pobj) }}</h2></div>`,
                props: ['pmsg', 'pobj'], //vue中,只有这个props/prop 是数组,其他属性都是对象
                data: function() {
                    return {}
                },
                methods: {}

            },
            'com2': {
                template: `<input type='button' value='点我触发父组件上的show方法' @click='com2click'>`,
                methods: {
                    com2click() {
                        this.$emit('funclick',{name:'vue'}); //触发子组件绑定的funclick这个函数【而funclick引用的是父组件中的show方法】!
                                     //这个传递的第二个参数就会被
父组件中的show方法接收到!

} } } }, }) </script>

子组件向父组件传值:

  上面的父组件向子组件传递函数的时候,固定语法:this.$emit('funclick'); //触发子组件绑定的funclick这个函数【而funclick引用的是父组件中的show方法】!,this.$emit('funclick',{name:'vue'}),这里其实还可以传递第二个参数,第一个参数为绑定事件name,this.$emit() 触发父组件的方法时,第二个参数就会被当作参数传递给被触发的父组件中的那个方法。 

show(a) {console.log('调用show,输出:' + a.name);}=>调用show,输出:vue,这里就可以接到这个第二个参数对象。

变式:其实也可以将子组件要传递的值放到本地存储 localStorage中,这样父组件中也已通过去本地存储中拿数据,通过一个中转,去传递值数据。
【slot 插槽 也可以做到 像父组件传值】

 

非父子之间的传值:

1。通过 $emit和 $on  通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级。

  图片例子来自【Vue 组件间通信六种方式(完整版)_张飞鹏的博客-CSDN博客_vue组件之间通信方式

假设兄弟组件有三个,分别是A、B、C组件,C组件如何获取A或者B组件的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
听了自定义事件 data-a和data-b,因为有时不确定何时会触发事件,一般会在 mounted 或 created 钩子中来监听。

2.vuex

还有两个,感觉用的不多 【请移步Vue 组件间通信六种方式(完整版)_张飞鹏的博客-CSDN博客_vue组件之间通信方式

原文地址:https://www.cnblogs.com/Hijacku/p/14734757.html