父子组件间的信息传输

151 阅读3分钟

子件和父组件之间难免会涉及到数据传输的问题,尤其是在父(根)组件通过ajax请求获取数据后,在传入子组件中得以显示时。传输方式便显得尤为重要。

Vue提供的传输方法

(父传子)props传输数据

这里,我们不妨将实例app当做父组件

//生成一个实例
const app = new Vue({
            el:"#app",
            data:{
                message:'我爱你',
                array:[1,2,3,4]
            },
            components:{
                cpn
            }
        })
//注册组件cpn
//需要注意的是我们在使用props传入数据时,需要在子组件外围设置一个根(一个包裹如div)
 <template id="cnp" >
<div>
        <h2>{{carray}}</h2>
        <p>{{cmessage}}</p>
</div>
    </template>

 const cpn={
            template:'#cnp',
//注册的组件的data必须是一个函数(用于返回对象)
            data(){
                return {
                    
                }
            },
//声明props
传入父组件数据
            props:{
                carray:Array,
                cmessage:{
                    type:String,
                    default:"我日你先人",
                    // 是否必须传值
                    // required:true
                }
            }
        }
<div id="app">
//使用v-bind语法糖

//将array中的值绑定到carray中
//将message中的值绑定到cmessage中
        <cpn :cArray="array" :cMessage="message"></cpn>
</div>

至此,最简单的传值操作就已经完成了

值得注意的是,v-bind语句不支持驼峰命名法,若在props中的元素使用驼峰命名法,则需要在绑定值时使用 -分割线

(子传父)自定义事件传递数据

父传子时是通过props属性来完成的,而当我们遇到子传父时,则需要注册自定义事件

一般情况下,子组件发生了某个事件,我们希望父组件根据该事件做出相应的一个调整与反映。

同样的我,我们先创建一个子组件

 <template id="cnp">
        <div>
            <button 
            v-for="item in categories"
            @click = 'itemClick(item)'
            >{{item.name}}</button>
        </div>
    </template>

<script>
        const cpn = {
            template: '#cnp',
                }
        const app = new Vue({
            el: "#app",

            components: {
                cpn
            }
        })
 </script>

子传父的应用场景比较多的是子组件中发生了某些事件,我们希望父组件知道并且作出反映。在此,我们模拟一个简单的传输过程。现将整个子组件丰富一下,然后在此我们将自定义事件在子组件中进行一个注册

 const cpn = {
            template: '#cnp',
            data() {
                return {
                    categories:[
                        {id:'111',name:'apple'},
                        {id:'112',name:'iphone'},
                        {id:'113',name:'ipad'},
                        {id:'114',name:'huawei'},
                        {id:'115',name:'xiaomi'}
                    ]
                }
            },
            methods:{
                itemClick(item){
                    // console.log(item);
                    // 发射(事件,参数)
                    this.$emit('item-click',item) 
                }
            }
        }
 <template id="cnp">
        <div>
            <button 
            v-for="item in categories"
            @click = 'itemClick(item)'

//注册点击事件
            >{{item.name}}</button>
        </div>
    </template>

子组件发射事件后,父组件需要对该事件进行监听,监听方式:在父组件的模板上使用v-on绑定事件。

 <div id="app">

//以前我们使用v-on绑定的事件都是默认注册好的事件,自定义事件注册后,便可以在其作用域(父组件)内进行监听、绑定
//监听的自定义事件的命名需要从驼峰命名法进行转化(使用脚手架可忽略)
//若在监听事件时没有传入参数(如cpnClick(item)传入参数),将会默认传入子组件发射的参数,在这里为item
        <cpn @item-click="cpnClick"></cpn>
        <div>我爱{{ things }}</div>
    </div>

在父组件中注册监听后,还需要在父组件内部注册事件

const app = new Vue({
            el: "#app",
            data: {
                message: '我爱你',
                array: [1, 2, 3, 4],
                things:"NONE"
            },
            methods:{
                cpnClick(item){
                    console.log(item.id);
                    this.things = item.name;
                }
            },
            components: {
                cpn
            }
        })

至此,我们完成了对父传子操作的全过程。运行截图如下: