Vue父子组件传值

在进行组件传值之前需要先掌握以下基础知识:

1:传值类型:

除了可以传递string外,还可以向子组件传递数字,布尔,数组,对象。

需要注意的是在传递数据时,即便数据是静态的我们仍然需要使用v-bind,来告诉vue这是一个数字/布尔/数组/对象而非字符串:

//v-bind告诉vue这是一个数字而非字符串
<module-title Mtitle="热游推荐" :tagType="1"></module-title>

传递布尔时:prop没有值意味着值为true。若值为false,即便false是一个静态值,我们仍然需要使用v-bind来告诉vue这是一个布尔值而非字符串。

//is-published没有值意味着值实际上为true
<blog-post is-published></blog-post>
//使用v-bind告诉vue这是一个布尔值false,v-bind可简写为:
<blog-post v-bind:is-published="false"></blog-post>

传递数组:

<btn :nubArr="[11,22,33]"></btn>

传递对象:

<btn :obj="{name;'按钮',type:1}"></btn>

2:prop验证:

我们可以在子组件内对父组件传递过来的值进行验证,以及设置默认值,设置是否必传。若传递过来的值与子组件预期的值类型不一致则会报错。

type:规定数据类型,default:设置数据默认值,required:规定是否必须。

例如:

		props:{
			// title
			Mtitle:{
                //规定数据类型
				type:String,
                //规定是否必传
				required: true
			},
			// 标签类型,0没有,1为hot,2为new,3为礼包
			tagType:{
				type:Number,
                //设置默认值
				default:0
			},
			// 是否有右侧按钮,0没有,1有
			more:{
				type:Number,
				default:1
			},
        }

vue还提供自定义验证函数:

props:{
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
}

3:单向数据流:

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

也就是说子组件是不可以改变父组件传递过来的值,那么如果我们需要对传递过来的值进行操作该怎么办?

有两种方法:1:在data中定义一个数据,将传递过来的值作为初始值,然后操作data定义的这个数据。

2:通过计算属性

组件传值:

1:父组件向子组件传值:

父组件可以向子组件传递静态或动态的值。子组件通过props来接收父组件传递过来的值。

--传递静态值:

父组件内使用自组件并传递静态值:Mtitle

<module-title Mtitle="热游推荐"></module-title>

在子组件内通过props来接收父组件传递的值: 

		props:{
			// title
			Mtitle:{
				type:String,
				required: true
			},
		},

使用父组件传递过来的值:

使用与data内值的使用方式一样,直接通过this.值名称即可获取使用。

--传递动态值:

<module-title Mtitle="热游推荐" :btnName="this.btnName"></module-title>

传递动态值需要使用v-bind 动态赋值。

2:子组件向父组件传值:

在vue中子组件是无法直接向父组件传值的,只能通过触发方法的形式通过this.$emit()传递值。在父组件中监听子组件事件来获取值。

子组件:

<template>
    <p>我是子组件</p>
    <div class="btn" @click="go">按钮</div>
</template>
<script>
    export default{
        name;"Btn",
        data(){
            return {
                name:"啦啦啦"
            }
        },
        methods:{
            //定义go方法
            go(){
                //通过this.$emit()向父组件发送消息
                //子组件发射自定义事件tigger 并携带要传递给父组件的值,
                // 如果要传递给父组件很多值,这些值要作为参数依次列出 如this.$emit('tigger', "哈哈哈",this.name); 
                this.emit("tigger","这是传递的数据")
            }
        }
    }
</script>

父组件内:

<template>
    <p>我是父组件</p>
    //使用子组件并监听
    <Btn @triggrt="eventGo()"></Btn>
</template>
<script>
    //引入子组件
    import Btn from ...
    export default{
        name;"Btn",
        components:{
            Btn
        },
        data(){
            return {}
        },
        methods:{
            //定义go方法
            eventGo(vulue){
                console.log(value)
                //打印哈哈哈
            }
        }
    }
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种流行的JavaScript框架,用于构建用户界面。在Vue中,父子组件之间递数据是一种常见的需求。以下是一种常用的方法来实现父子组件之间的数据递: 1. Props(属性):父组件可以通过props属性向子组件递数据。在父组件中,通过在子组件标签上绑定属性的方式递数据。在子组件中,可以通过props选项接收并使用这些数据。 父组件: ```html <template> <div> <child-component :message="parentMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello from parent component' }; } } </script> ``` 子组件: ```html <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 2. $emit(自定义事件):子组件可以通过$emit方法触发自定义事件,并将需要递的数据作为参数递给父组件。在父组件中,通过在子组件标签上监听自定义事件的方式接收数据。 父组件: ```html <template> <div> <child-component @child-event="handleChildEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleChildEvent(data) { console.log(data); // 在这里处理子组件递的数据 } } } </script> ``` 子组件: ```html <template> <div> <button @click="emitEvent">触发事件</button> </div> </template> <script> export default { methods: { emitEvent() { this.$emit('child-event', 'Hello from child component'); // 触发自定义事件,并递数据给父组件 } } } </script> ``` 以上是Vue中实现父子组件之间递数据的两种常用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值