Vue中父子组件传值

本文详细介绍了Vue.js中父组件向子组件传递数据的方法,包括Props的使用及其验证方式,并探讨了子组件如何通过触发事件向父组件发送消息。

1、父组件通过属性向子组件传递数据:

  1.1Prop   

    子组件通过props接收父组件的传值: props:['prop1','prop2','prop3',……]

<div id="root">
    <counter count="hello world"></counter>  
</div>
<script>
    Vue.component('counter',{       
        props:["count"],
        template: '<div>{{count}}</div>',       
    })
    var vm=new Vue({
        el: "#root"       
    })   
</script>

 

prop类型     

通常需要每个prop都有指定的值类型,这时可以使用对象形式列出这些prop,

props: {
    prop1:String,
    prop2: Number,
    prop3: Array,
    prop4: Object,
    prop5: Boolean
}

 prop也可以通过v-bind动态赋值

<div id="root">
    <counter :count="msg"></counter>  
</div>
<script>
    Vue.component('counter',{       
        props:["count"],
        template: '<div>{{count}}</div>',       
    })
    var vm=new Vue({
        el: "#root",
        data:{
            msg: "hello world"
        }       
    })   
</script>

 当prop静态赋值时,引号的内容会被当做字符串。当动态赋值时,引号的内容会被当做js代码解析

1,2 单向数据流

单向数据流:父组件可以随意的向子组件传递参数,但子组件不能修改父组件传递的内容 .

如果子组件要改变父组件传入的数据可以使用如下方法:

将父组件传递给子组件的count赋值给子组件data的number,然后对number进行操作。

<div id="root">
    <counter :count="msg"></counter>
    <counter :count="msg"></counter>
</div>
<script>
    Vue.component('counter',{
        props:["count"],//接收父组件传递的数据count
        data: function () {
            return {
               text: this.count//拷贝一个副本,对副本进行操作
            }
        },
        template: '<div @click="handleClick">{{text}}</div>',
        methods:{
            handleClick:function () {
                this.text="text变为其他值,但count的值不变";                
            }
        }
    })
    var vm=new Vue({
        el: "#root",
        data:{
           msg: '这是父组件传递给子组件的值count,将其赋值给text'
        }
    })
</script>

结果:

 

 1.3Prop验证

props:{
    content:{
        type: String,  //出入的数据类型
        required: true, //是否必须传入数据
        default:"default value",//如果没有传入数据,则显示默认值 
        validator:function(value){//自定义验证函数,value代表传入的值
            return (value.length>5)
            }
    }
}

 2、子组件通过事件向父组件发送消息

2.1子组件调用$emit方法向父组件触发一个事件

语法为 $emit("eventhandle",value)

第一个参数为事件类型,第二个参数(可选)为向父组件传递的值

<div id="root">
    <counter :count="0" @change="handleChange"></counter><--!在父组件中监听子组件传递的change事件,如果监听到则触发handleChange函数>
    <counter :count="0" @change="handleChange"></counter>
    <div >{{total}}</div>
</div>
<script>
    Vue.component('counter',{
        props:["count"],
        data: function () {
            return {
               number: this.count
            }
        },
        template: '<div @click="handleClick">{{number}}</div>',
        methods:{
            handleClick:function () {
                this.number=this.number+5;
                this.$emit("change",5)//向父组件传递事件change和参数 5
            }
        }
    })
    var vm=new Vue({
        el: "#root",
        data:{
           total:0
        },
        methods: {
            handleChange: function(step){
                console.log(step)//step的值是$emit的第二个参数
                this.total=this.total+step
            }
        }
    })
</script>

结果:

2.2给组件绑定原生事件:

通过之前的学习可以知道,给子组件绑定事件时应将事件绑定在template的元素中,如上例,而在<counter>元素中绑定的事件时自定义事件,需要监听子组件通过$emit传递的事件来触发。否则事件不会触发。

如下例,点击Child并不会触发点击事件。

<div id="root">
    <child @click="handleClick"></child>
</div>
<script>
    Vue.component('child',{
        template: '<div>Child</div>'
        }
    )
    var vm=new Vue({
        el:"#root",
        methods:{
            handleClick: function () {
                console.log(clicked)
            }
        }
    })
</script>

结果:

  如何给组件绑定原生事件呢,可以使用v-on的native修饰符,如下例

<div id="root">
    <child @click.native="handleClick"></child>
</div>
<script>
    Vue.component('child',{
        template: '<div>Child</div>'
        }
    )
    var vm=new Vue({
        el:"#root",
        methods:{
            handleClick: function () {
                console.log(clicked)
            }
        }
    })
</script>

结果:

Vue2中父子组件主要有父子和子父两种情况: ### 父父组件向子组件时,子组件通过`props`属性接收父组件过来的,名字要和父组件对应。 示例代码如下: 父组件: ```vue <template> <div> <!-- 向子组件递sonInfo --> <Son :sonInfo="sonInfo"/> </div> </template> <script> import Son from './Son.vue' export default { components: { Son }, data() { return { sonInfo: { sonName: '小明', sonAge: 12 } } } } </script> ``` 子组件: ```vue <template> <div class="son"> 这里是子组件,我们会在这里展示子的信息 {{ sonInfo.sonName }} {{ sonInfo.sonAge }} </div> </template> <script> export default { name: "son", props: ["sonInfo"] } </script> <style scoped> .son { margin: 10px; border: 1px solid red; } </style> ``` 此示例中,父组件将`sonInfo`对象递给子组件,子组件通过`props`接收并展示信息 [^4]。 ### 子父 子组件向父组件是通过`this.$emit`触发自定义事件,父组件监听该事件来接收数据。 示例代码如下: 父组件: ```vue <template> <div> <div>父组件</div> <!-- 监听子组件emit --> <Student @sendMsg="sendMsg"/> <div>父组件接收消息:{{studentMsg}}</div> </div> </template> <script> // 引入组件 import Student from '../components/Student' export default { components: { Student }, data() { return { studentMsg: null } }, methods: { // 父组件接收子组件消息的方法 sendMsg(name, age) { this.studentMsg = name + age } } } </script> ``` 子组件: ```vue <template> <div> <div>子组件</div> <!-- 通过点击按钮向父组件 --> <button @click="sendMsg(name, age)">子组件向父组件</button> </div> </template> <script> export default { data() { return { name: '张三', age: 18 } }, methods: { sendMsg(name, age) { // 向父组件的方法(多个用逗号隔开) this.$emit('sendMsg', name, age); } } } </script> ``` 该示例中,子组件通过点击按钮触发`sendMsg`方法,使用`this.$emit`触发自定义事件`sendMsg`并递`name`和`age`,父组件监听该事件并接收数据 [^3]。 ### 父子同步(`.sync`修饰符) 父组件使用`v-model:xxx`或`.sync`来指定向子组件并实现双向绑定。 示例代码如下: 父组件: ```vue <template> <div> <BaseComp7 v-model:customModelValue="msg"/> {{msg}} </div> </template> <script> import BaseComp7 from "./BaseComp7.vue" export default { name: "index", components: { BaseComp7 }, data() { return { msg: "父组件msg" } } } </script> ``` 子组件: ```vue <template> <div> <!-- 子组件可以修改customModelValue --> <input v-model="customModelValue" @input="$emit('update:customModelValue', $event.target.value)"> </div> </template> <script> export default { props: ['customModelValue'], methods: { // 子组件触发更新事件 updateValue(newValue) { this.$emit('update:customModelValue', newValue) } } } </script> ``` 此示例中,父组件使用`v-model:customModelValue`向子组件递`msg`,子组件可以修改`customModelValue`并通过`$emit`触发更新事件,实现父子组件数据的同步 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值