vue组件传值总结

1.父组件向子组件传值 props

在这里插入图片描述
props属性传值 相当于一个组件里面的一个选项 用来指明通过哪些属性来传值可以是数组也可以是对象
传值形式:
1.可以写成props[‘name’,‘age’],以数组的形式传值
2.props:{
// 键名:传递的属性名
propA:Number,
// 多种类型
propB:[Number,String],
// 必须类型
propC:{
type:Boolean,
required:true
},
propD:{
type:Number,
// 默认值
default:1000
}
},
3. 把所有要传的内容放到一个对象里面
props:{
pdata: {
type: Object,
default: function () {
return {
user: {},
parentFun:null,
}
}
},
},
声明允许你通过属性的方法传递数据
允许你传递多个属性
prop里面的东西不能改变

父组件

//父组件
<!-- 组件的模板 -->
<template>
    <div class="car">
        <h1>父组件</h1>
        <back-header :pdata="{user:user,parentFun:parentFun}"></back-header>
    </div>
</template>

<!-- 组件的模型 -->
<script>
import share from './share'
export default {
    mixins:[share],
    data () {
        return {
            user:{
                name:'leiqiu',
                age:18
            }
        }
    },
    methods:{
        parentFun(that){
            // 这里写要执行的方法
            console.log('子组件调用父组件方法');
            console.log(that.ceshi);
            // 如果要用到子组件的this,这里面需要传个参数比如that,这个参数,在子组件调用的时候会把子组件的this传进来
        }
    }
}
</script>

这里我在子组件的props里面声明了一个对象pdata,把所有想传的变量和方法都写在里面,这样传值的时候看起来比较规整,不会那么乱,当然也可以不声明这个对象,直接把需要传的值写在pdata里面,注意格式尽量写成
name:
{
type:String,
default:""
}
类似这种,给个属性名,和默认值。

子组件

//子组件
<!-- 组件的模板 -->
<template>
    <div>
        <h1>(子组件)用户信息:</h1>
        <p>用户名:{{pdata.user.name}}</p>
        <p>年龄:{{pdata.user.age}}</p>
        <p>(子组件修改父组件变量)修改后的数据:</p>
        <p>用户名:{{childrenUser.name}}</p>
    </div>
</template>

<!-- 组件的模型 -->
<script>
export default {
    props:{
      pdata: {
            type: Object,
            default: function () {
              return {
                user: {},
                parentFun:null,
              }
            }
          },
    },
    data () {
        return {
            ceshi:'123456',
            childrenUser:{}
        }
    },
    mounted(){
        this.pdata.parentFun(this);

        //子组件不能直接修改父元素,如果想要修改父组件的数据,需要先把父组件的数据给子组件的一个变量
        // 在data里面声明一个变量,例如childrenUser,这里把父元素的user赋给childrenUser,然后修改childrenUser,
        // 不过要注意的是,修改这个变量,并不会影响到父组件的user
        this.childrenUser = this.pdata.user;
    }
}
</script>

<!-- 组件的样式 -->
<style scoped>

</style>

关于子组件修改父组件值:
子组件不能直接修改父元素,如果想要修改父组件的数据,需要先把父组件的数据给子组件的一个变量
在data里面声明一个变量,例如childrenUser,这里把父元素的user赋给childrenUser,然后修改childrenUser,不过要注意的是,修改这个变量,并不会影响到父组件的user,也就是说,props里面的值其实并没有被修改到

子组件传值给父组件 this.$emit

在这里插入图片描述

图为初始数据,点击按钮“添加人数”,人数会加1
子组件中:通过this.$emit传值
父组件中:通过 @传值名 接收值

代码奉上:
父组件

<!-- 组件的模板 -->
<template>
    <div class="parent">
        <h1>父组件</h1>
        父组件人数:{{childrenCount}}
        <p>--------------------------</p>
        <children-mode @childrenCount="getChildrenCount"></children-mode>
    </div>
</template>

<!-- 组件的模型 -->
<script>
import share from './share'
export default {
    mixins:[share],
    data () {
        return {
            childrenCount:0,
        }
    },
    methods:{
        getChildrenCount(val){
            this.childrenCount = val;
        }
    },
}
</script>

<!-- 组件的样式 -->
<style scoped>

</style>

父组件中的: <children-mode @childrenCount=“getChildrenCount”>
@后面跟传的变量名,然后里面的方法名随便起,主要是用来获取值,这样就可以实时获取参数的变化

子组件

<!-- 组件的模板 -->
<template>
    <div class="children">
        子组件
        <button @click="add">添加人数</button>
    </div>
</template>

<!-- 组件的模型 -->
<script>
export default {
    data () {
        return {
            count:10,
        }
    },
    methods:{
        add(){
            this.count +=1;
            this.$emit('childrenCount',this.count)
        }
    },
    mounted(){
        this.$emit('childrenCount',this.count)
    }
}
</script>

<!-- 组件的样式 -->
<style scoped>

</style>

总结:1.外部往内部传值 是通过属性 ;2.内部往外部传值 是通过$emit 向上发射

非父子组件传值 Bus

非父子组件传值 使用中央总线来传,创建一个Vue作为中央总线处理
bus.$on可监听事件
这里我们写一个中央总线Bus.js文件,然后在需要传值和接收值的文件引入Bus就可以了
Bus.js

//Bus.js
import Vue from "vue";
export default new Vue();

A组件
(1)先引入Bus.js
(2)在需要传值的地方写上Bus.$emit(‘name’,数据)

B组件
(1)先引入Bus.js
(2)在需要接收的地方写上Bus.$on(‘name’,(val)=>{ val就是传过来的值 })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值