Skip to content
On this page

父子数据互传

父传子:

  • 传递时:
vue
<!-- 传递时,子组件名上,使用约定的自定义属性,
属性值为父组件的动态属性,让动态属性携带值。 -->
<!-- 如父亲组件内使用子组件: -->
<son :message="fathermessage"></son>
<!-- message为父子约定的自定义属性,
fathermessage为父亲要传递过去的数据,一般用动态属性携带值 -->
  • 接收时:
vue
<!-- 接收时,子组件实例内,定义props属性,
属性值可以是一个数组,每项为约定的自定义属性,字符串形式。
也可以是一个对象,对象的每个属性为自定义属性,属性值是大写的类型。
 -->
 components: {
 	"son":{
 		template: "#son",
 		props: ['message'],
 		<!-- 或者 -->
 		props: {
 			message: String,
 		}
 	}
 }
  • 子组件使用数据:
vue
<!-- 直接把接收的数据,当成自己实例的,data内的动态属性使用 -->
<h1>{{message}}</h1>

子传父:

  • 传递时:
vue
<!-- 传递前,子组件内绑定一个事件,例如@click="send()",用来触发看效果。 -->
<!-- 传递时,send事件内,使用this.$emit(); 传递约定的事件名和数据 -->
<!-- this.$emit(第一个参数为约定的事件名,第二个参数为传递的数据(一般用动态属性携带值))
例如:
-->
<button @click="send()">点我传递<button>
data(){
	return{
		sonmessage: "hello"
	}
	},
methods: {
	send(){
		this.$emit('accept', this.sonmessage);
	}
}
  • 接收时:
vue
<!-- 在使用子组件的时候,用@绑定约定的事件名,属性值为自身methods内的方法名,记得方法名不能带括号() -->
<son @accept="rendermsg"></son>
  • 父组件使用数据:
<!-- 然后父组件在自身methods的方法内使用数据,
因为该方法会默认带一个value的参数,携带接收的数据 -->
methods: {
	rendermsg(value){
		console.log(value);
	}
}

完整案例:

html
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.5/vue.js"></script>
<body>
    <!-- 父传子: 如何把父亲的message信息,传递给儿子?
        传递时:在组件名上,使用自定义属性和动态属性 :xxx="fatherxxx", 动态属性携带值。
        接收时:子组件的Vue实例上,使用props属性,props:[xxx]
        props属性的属性值是由自定义属性名组成的数组,也可以是自定义属性名组成的对象。
        对象的配置:value, 属性值。 type,属性值的类型。
        接收后如何使用? 当成data里的动态属性一样直接使用,this.XXX也可以获取。
    -->
    <!-- 
        子传父:如何把儿子的sMessage信息,传递给父亲?
        传递时:子组件先定义一个方法,用来点击后传递看效果。
        方法内通过this.$emit(); 传递数据。
        this.$emit('',sonxxx) 接收2个参数:一个是自定义事件名,一个是动态属性。
            参数1:自定义事件名,父组件使用子组件时,子组件上@的自定义属性。
            参数2:sonxxx是动态属性,携带值,传递的数据。
        接收时:
            父组件使用子组件时,带上自定义属性,并且用@触发,
            后面属性值是方法,使用父组件自身的方法,注意:不带括号
            该方法在methods里面定义的时候,要带一个参数,一般为value, 表示的是接收传递的数据。
     -->
    <div id="app">
        <h2>{{appmessage}}</h2>
        <father :message="appmessage"></father>
        <!-- 其中,第一个约定的自定义属性message,是传递给子组件的属性 -->
        <!-- 第二个是父组件的data内的属性message。 -->

    </div>
    <template id="father">
        <div>
            <h3>接收到App的文本:{{message}}</h3>
            <h4>接收到son的文本:{{sMessage}}</h4>
            <son @inc="accept"></son>
            <!-- inc是子传父时, 约定的事件名 -->
            <!-- accept是自身methods内的方法 -->
        </div>
    </template>
    <template id="son">
        <div>
            <h1>{{sonMessage}}</h1>
            <button @click="send()">将我的数据传递过去</button>
        </div>
    </template>
    <script>
        Vue.component("father", {
            template: "#father",
            data() {
                return {
                    fMessage: "i am father message",
                    sMessage: ""// 定义一个变量,用来接收儿子传过来的数据。
                }
            },
            methods: {
            	// 子传父时触发了约定的事件名, 进而触发自身的方法,该方法自带一个value参数,携带子组件传递过来的数据.
                accept(value) {
                    this.sMessage = value;
                }
            },
            components: {
                "son": {
                    template: "#son",
                    data() {
                        return {
                            sonMessage: "i am son message"
                        }
                    },
                    methods: {
                        send() {
                        	// 用this.$emit()传递数据给子传父时,约定的inc事件名.
                            this.$emit("inc", this.sonMessage); // inc是约定的事件名。
                        }
                    }
                }
            },
            props: ['message']
            // 用props接收父传子时约定的属性, 接收数据.
        });
        new Vue({
            el: "#app",
            data() {
                return {
                    appmessage: "hello world"
                }
            }
        });
    </script>
</body>

一个陪你成长的前端博客 - XDocs