Vue2 组件间传值

文章详细介绍了Vue中父子组件如何通过props进行数据传递,子组件如何触发自定义事件向父组件传递数据,以及使用Vuex进行全局状态管理。同时提到了Vuex的state、getters、mutations和模块化,以及利用vue-persistedstate实现数据持久化。此外,还提及了全局事件总线作为另一种组件间通信方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父传子

对象写法

    <!-- 1.创建容器  -->
    <div class="app">
        <h1>我是父组件</h1>

        <hr>
        <!-- 7.应用子组件 10.父组件将数据传递给子组件 :子组件接收变量名=父组件data变量名-->
        <!-- 子组件接收变量名如果是驼峰命名,需要用-分隔两单词,第二个大小写随意 -->
        <my-Component :get-data="num"></my-Component>

    </div>

    <!-- 3.创建模板 -->
    <template id="my_Template">
        <div>
            <h3>我是子组件</h3>
            <!-- 11.子组件使用传过来的数据 -->
            {{getData}}
        </div>
    </template>

    <script>
        // 2.创建vue实例
        const vm = new Vue({
            el:'.app',
            // 8.给父组件添加数据
            data:{
                num:5,
            },
            // 4.创建局部组件
            components:{
                // 5.创建子组件
                'myComponent':{
                    // 6.关联模板
                    template:'#my_Template',
                    // 9.定义props
                    props:{
                        'getData':{
                            type:Number
                        }
                    },
                    
                }
            }
        })
    </script>

数组写法

    <!-- 1.创建容器  -->
    <div class="app">
        <h1>我是父组件</h1>

        <hr>
        <!-- 7.应用子组件 10.父组件将数据传递给子组件 :子组件接收变量名=父组件data变量名-->
        <!-- 子组件接收变量名如果是驼峰命名,需要用-分隔两单词,第二个大小写随意 -->
        <my-Component :get-data="num"></my-Component>

    </div>

    <!-- 3.创建模板 -->
    <template id="my_Template">
        <div>
            <h3>我是子组件</h3>
            <!-- 11.子组件使用传过来的数据 -->
            {{getData}}
        </div>
    </template>

    <script>
        // 2.创建vue实例
        const vm = new Vue({
            el:'.app',
            // 8.给父组件添加数据
            data:{
                num:5,
            },
            // 4.创建局部组件
            components:{
                // 5.创建子组件
                'myComponent':{
                    // 6.关联模板
                    template:'#my_Template',
                    // 9.定义props
                    props:['getData']
                }
            }
        })
    </script>

在这里插入图片描述

子传父

    <!-- 1.创建容器 -->
    <div class="app">
        <h1>我是父组件</h1>
        <!-- 16.将父组件数据读取显示 -->
        {{num}}

        <hr>
        <!-- 7.应用子组件 12.调用自定义事件 @子组件自定义事件=父组件计算方法 父组件方法从method调用,不要加括号,这与传统计算方法不同 -->
        <!-- 子组件在自定义事件时不要用驼峰命名法,在使用时一定要用驼峰命名法,并且单词之间不能出现'-',这与父传子有所不同 -->
        <my-Component @sendData="getValue"></my-Component>

    </div>

    <!-- 3.创建模板 -->
    <template id="my_Template">
        <div>
            <h3>我是子组件</h3>
            <!-- 9.给子组件添加触发子传父的方法 -->
            <div @click="send(num)">{{num}}</div>
        </div>
    </template>

    <script>
        // 2.创建vue实例
        const vm = new Vue({
            el:'.app',
            data:{
                // 14.定义父组件用于接收的变量,初始值为null
                num:null
            },
            // 4.创建局部组件
            components:{
                // 5.创建子组件
                'myComponent':{
                    // 6.关联模板
                    template:'#my_Template',
                    // 8.给子组件添加数据
                    data(){
                        return{
                            num:5
                        }
                    },
                    methods: {
                        // 10.触发子传父
                        send(value){
                            // console.log(value);
                            // console.log(this);          //子组件
                            // 11.为数据绑定自定义事件
                            this.$emit('senddata',value)
                        }
                    },
                }
            },
            methods:{
                // 13.定义接收的计算方法
                getValue(value){
                    console.log(value);
                    // 15.将数据保存在父组件
                    this.num=value
                }
            }
        })
    </script>

在这里插入图片描述

点击子组件数据后
在这里插入图片描述

爷孙传值

在这里插入图片描述

vuex

vue2用vuex3,vue3用vue4
项目下下载vuex
npm i vuex@3
在这里插入图片描述
store文件夹为vuex文件夹,相当于一个外置的组件,项目中的所有组件都可以在该组件内拿数据或者修改数据(从某种意义上来说,与js中的prototype有些像)

入口文件main.js
在这里插入图片描述
store/index.js
在这里插入图片描述

vuex有四个重要的属性:state、getters、mutations分别对应组件的data、computer、methods

读取vuex state数据

直接读取

在组件内
在这里插入图片描述

mapState

在组件内
在这里插入图片描述

修改数据

同步修改

方法一:$store.commit(事件名,数据)

组件
在这里插入图片描述
vuex
在这里插入图片描述

方法二 mapMutations

组件
在这里插入图片描述
vuex
在这里插入图片描述

异步修改数据

组件
在这里插入图片描述
vuex
在这里插入图片描述

计算结果

组件
在这里插入图片描述
vuex
在这里插入图片描述

vuex模块

在这里插入图片描述
store/index.js
在这里插入图片描述
模块
在这里插入图片描述
模块数据的读取
在这里插入图片描述

vuex 插件 数据持久化

vuex有一个弊端:在页面刷新时保存在vuex的数据会消失因此在每次修改的时候需要将数据重新保存在使用vuex前也需要将数据从本地读取
vue-persistedstate省略了节省了这一步操作
vue-persistedstate 将vuex数据保存在本地
npm i vue-persistedstate

在这里插入图片描述

全局事件总线

在这里插入图片描述
utils文件夹为全局事件总线配置文件夹
eventBus.js
在这里插入图片描述
组件一发送数据
在这里插入图片描述
组件二接收数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值