VUE组件间传值那些事

301 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

本文将对父组件向子组件传值进行展开,至于子组件向父组件传值下次再细说

如果说一个组件相当于一个独立的有着完整功能的模块体系,那么值传递就像组件之间的水泥一样,组件不是目的,目的是将所有组件组合起来形成一个完善的功能系统。
因此,组件传值对于一个组件来说必不可或缺

话不多说,直接进入正题

传递字符串

props和data中数据的区别

数据来源读写权限
data自身组件所有的可读可写
props父组件传递过来的只读

目的:防止子组件修改父组件中数据!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <!-- data中数据和props中数据的区别:
         data:自身所有的,可读可写的
         props:父组件所有的,传递过来的,只读的(用于渲染)-->
        <div id="app">
            <h-son1></h-son1>
            <h-son2 :fmsg='msg'></h-son2>
        </div>
        <script>
            var vm=new Vue({
                el:'#app',
                data:{
                    msg:'主组件中内容'
                },
                methods:{},
                components:{
                    hSon1:{
                            template:'<p>子组件中内容</p>'
                    },
                    hSon2:{
                            // props:['fmsg'],
                            props:{ //props中的数据都是只读的,无法修改:防止在子组件中修改父组件中的数据
                                    fmsg:String
                            },
                            template:'<p>子组件2中内容 --- {{fmsg}}</p>'
                    }						
                }
            })
        </script>
    </body>
</html>

运行截图

传递方法

传 字符串 和传 方法 的区别:

  1. 绑定方式不同:前者用v-bind/: 后者用v-on/@

子组件不但可以触发父组件中的方法,还可以传参给父组件中的方法

传参类型:字符串、对象

其传参还可以保存到父组件的data中用于渲染

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
                <h-son></h-son>
                <h-son2 @ftosfunc="fclick" @ftosfunc2="fclick2" @ftosfunc3="fclick3"></h-son2>
                <div v-if="datafromson">子组件触发父组件的方法,并向父组件传一个对象,父组件保存到自己的data中:name:{{datafromson.name}},age:{{datafromson.age}}...</div>
        </div>
        <template id="hSonTmpl">
                <div><!-- 必须有根元素 -->
                        <div>这是子组件中内容</div>
                </div>
        </template>
        <template id="hSonTmpl2">
                <div>
                        <div>这是子组件2中内容</div>
                        <button @click="sonfunction">这是子组件中按钮,触发父组件传递过来的方法</button>
                        <button @click="sonfunction2">这是子组件中按钮,触发父组件传递过来的方法:并且向父组件传递参数(字符串)</button>
                        <button @click="sonfunction3">这是子组件中按钮,触发父组件传递过来的方法:并且向父组件传递参数(对象)</button>
                </div>
        </template>
        <script>
// 字面量类型的组件模板对象
            var hSon={
                template:'#hSonTmpl'
            }
            var hSon2={
                template:'#hSonTmpl2',
                data(){ //必须这样写,否则报错
                    return {
                        obj:{name:'zhangsan',age:19,sex:'nv'}
                    }
                },
                methods:{
                    sonfunction(){
                        this.$emit('ftosfunc');
                    },
                    sonfunction2(){
                        this.$emit('ftosfunc2',123,234);
                    },
                    sonfunction3(){
                        this.$emit('ftosfunc3',this.obj)
                    }
                }
            }
            var vm=new Vue({
                el:'#app',
                data:{
                    datafromson:null
                },
                methods:{
                    fclick(){
                        console.log(`定义在父组件中的方法`)
                    },
                    fclick2(data,data2){ <!-- 子组件还可以向父组件的方法中传递参数,其也写对应数量的参数,即可拿取过来 -->
                        console.log(`定义在父组件中的方法,子组件传递过来的参数:${data}${data2}`)
                    },
                    fclick3(params){
                        console.log(params)
                        this.datafromson=params
                    }
                },
                components:{
                    hSon,
                    hSon2
                }
            })
        </script>
    </body>
</html>

运行截图

父传子总结图

文末总结

其实再复杂的事情,只要肯花时间,把它拆开来,揉碎了,一点点消化它,也会变得很简单。
难的是坚持,持之以恒的决心。