组件传参

143 阅读2分钟

父级组件变量传给子级组件

父组件中,子级组件引入后,给子级组件标签使用v-bind,声明一个变量用于存放父级传来的值,(变量名不要使用驼峰式)
子级组件通过props:[“变量名”]来接收父级传来的值,子组件可以直接使用该变量

 <!-- 父级传子级 -->
    <div id="app">
        <!-- 通过bind将父级的变量传给子集 -->
        <son :father="father"></son>
    </div>

    <script>
        Vue.component("son", {
            template:`<div>这是子级组件调用父级的变量{{father}}</div>`,
            data(){
                return{
                }
            },
            props:["father"]   // 接收父级传过来的变量
        })
        new Vue({
            el: '#app',
            data() {
                return {
                    father:"这是父级的变量"
                }
            },
            methods: {

            }
        });
    </script>

子组件将变量传给父组件

方法一

  1. 子级组件中,添加事件,由事件进行触发,在组件中的methods,添加方法,在方法中使用this.$emit("自定义事件名",传递的变量)将变量抛出去
  2. 父级组件中,给子组件标签名添加事件:@“自定义事件名=“自定义事件名2””,然后在vue实例中的methods里,将自定义事件名2进行声明,在这个方法中,我们就已经可以使用子集传来的方法了

html代码

    <!-- 子集到父级,使用this.$emit  子集创建事件,将变量传出,父级使用事件,获取到变量 -->
    <div id="app">
        <son @send1="send"></son>
        <hr>
        父级调用子级变量 {{name2}}

    </div>
    <template id="son">
        <div>
            这是子组件的变量 {{name1}}
            <!-- 子级通过事件将变量传给父级 -->
            <button @click="sonsend">点击传给父级</button>
        </div>
    </template>

js代码

Vue.component("son", {
            template:"#son",
            data(){
                return{
                    name1:"这是子级的变量"
                }
            },
            methods:{
                sonsend(){
                    this.$emit("send1",this.name1)   // 通过$emit将变量抛出
                }
            }
        })
        new Vue({
            el: '#app',
            data() {
                return {
                    name2:""
                }
            },
            methods: {
                send(e){
                    console.log(e);
                    this.name2=e
                }
            }
        });

  • 方法2
  1. 在父组件中,给子组件标签名中添加ref属性,`ref="自定义名称"`\
    
  2. 父组件中通过事件,可以使用`this.$refs`获取到子组件,然后可以一层一层获取到子组件中的变量
    

html代码

    <div id="app">
        <son ref="child"></son>
        <son2 ref="child2"></son2>
        <button @click="getChild">点击获取子级的变量</button>
    </div>
    <template id="son">
        <div>
            这是子级 {{name1}}
        </div>
    </template>
    <template id="son2">
        <div>
            这是子级二 {{name2}}
        </div>
    </template>

js代码

let son = {
            template: "#son",
            data(){
                return{
                    name1:"这是子级的变量",
                    name11:"这是子级变量11"
                }
            }
        }
        let son2 = {
            template: "#son2",
            data(){
                return{
                    name2:"这是子级的变量二"
                }
            }
        }
        new Vue({
            el: '#app',
            data() {
                return {

                }
            },
            methods: {
                getChild(){
                    console.log(this.$refs);
                }
            },
            components: {
                son,son2
            }
        });

兄弟之间传递变量

  • 方法一 子组件将变量传给父级,再由父级将变量传递给需要传递的子组件

    html代码

    <div id="app">
        <!-- 3.将父级的变量传给子级 -->
        <bro1 :father="father"></bro1>
        
        <bro2 @brother="brother"></bro2>
    </div>

js代码

		Vue.component("bro1", {
            template:`<div>这是兄弟元素一 {{father}}</div>`,
            props:["father"]    // 4.子级接收父亲的变量
        });
        Vue.component("bro2", {
            template:`<div>这是兄弟元素二 <button @click="brosend">点击传递兄弟变量</button></div>`,
            data(){
                return{
                    name:"这是兄弟元素的变量"
                }
            },
            methods:{
                brosend(){
                    this.$emit("brother",this.name);    // 1.先传递给父亲,再由父亲传给兄弟
                }
            }
        })
        new Vue({
            el: '#app',
            data() {
                return {
                    father:""
                }
            },
            methods: {
                brother(e){
                    this.father=e;    // 2.将子级传来的变量赋到自己的变量上
                }
            }
        });

方法二 使用数据共享中心,由中间件传值,bus 首先实例化bus,const bus = new Vue() 发送方通过事件使用bus将变量传递出去,bus.emit("自定义变量名",传递的变量)接收方在mounted(生命周期)中,使用on对传递过来的变量进行操作,bus.emit("自定义变量名",传递的变量) 接收方在mounted(生命周期)中,使用on对传递过来的变量进行操作,bus.on("自定义变量名",箭头函数) html代码

    <div id="app">
        <bro1></bro1>
        <bro2></bro2>
    </div>

js代码

        // 1.将bus实例化
        const bus = new Vue();
        Vue.component("bro1", {
            template:`<div>这是兄弟元素一 {{name2}}</div>`,
            data(){
                return{
                    name2:""
                }
            },
            // 3.操作传递过来的变量
            mounted() {
                bus.$on("brother",e=>{           // 用箭头函数,不然会有this指向的问题
                    this.name2=e
                })
            },
        })
        Vue.component("bro2", {
            template:`<div>这是兄弟元素二 <button @click="brosend">点击传给兄弟</button></div>`,
            data(){
                return{
                    name:"这是兄弟的变量"
                }
            },
            methods:{
                // 2.通过方法将变量进行传递
                brosend(){
                    bus.$emit("brother",this.name)
                }
            }
        })
        new Vue({
            el: '#app',
            data() {
                return {

                }
            },
            methods: {

            }
        });