在Vue开发项目中,当一个页面的代码量开始增加时,需要考虑到将部分业务抽成一个新的组件,这时候就涉及到两个组件之间传值以及影响问题,本文将介绍一下内容:
子组件的创建以及调用
父组件如何传值给子组件
子组件如何接收父组件传来的值
子组件如何影响父组件
子组件的创建就是新建一个新的Vue文件,并将需要的业务代码,如表格Table,抽屉Drawer,上传组件Upload等放在子组件中,在父组件中进行调用并传值。
这是子组件,子组件中放置了一个Element-UI的抽屉组件Drawer,由父组件传入drawerShow,让子组件中的抽屉Drawer显示出来
<template>
<el-drawer
title="抽屉"
:visible.sync="drawerShow"
direction="rtl">
el-drawer>
template>
<script>
export default {
name: "Drawer",
props: {
drawerShow: {
type: Boolean,
}
},
data() {
return {
drawerShow: false
}
}
watch: {
drawerShow: {
handler(newValue) {
this.drawerShow = newValue
}
}
},
}
script>
<style scoped>
style>
a. 上述中的props
props: {
drawerShow: {
type: Boolean,
}
},
props是接收父组件传值的写法,传送进来是drawerShow,接收类型是Boolean。
常用接收类型有:布尔型Boolean,整数型Integer,字符串String,数组Array,对象Object
b. 上述中的watch用于监控变量值的变化,它监控的变量需要在data中进行定义,其有handler、immediate、deep操作,handler是一个函数,在变量值发生变化时,会执行此方法。
watch特点:
watch: {
drawerShow: {
handler(newValue) {
this.drawerShow = newValue
},
immediate: true
}
},
data() {
return {
cityName: {
id: 1,
name: 'Guangzhou'
}
}
},
watch: {
cityName: {
handler(newName, oldName) {
},
immediate: true,
deep: true
}
},
在父组件中使用标签调用子组件,需要先将子组件import进来,然后声明component,再进行调用。
<template>
<Drawer>Drawer> // 此处调用子组件
template>
<script>
import Drawer from "./drawer/Drawer"; // 引入子组件
export default {
name: "FatherComponent",
components: { // 声明组件
Drawer
},
data() {
return {
drawerShow: false
}
}
}
script>
<style scoped>
style>
<Drawer :drawerShow="drawerShow">Drawer> // 此处调用子组件
在父组件中使用子组件的标签中,定义:drawerShow="drawerShow"
,冒号后定义的是在子组件对应的参数,子组件根据这个变量名称进行接收值,双引号时父组件传送的值。
子组件影响父组件的方法有很多种,这里列举出几种:
a. 子组件提交事务,父组件调用函数修改
<Drawer :drawerShow="drawerShow" @func="updateInfo"></Drawer> // 此处为父组件调用子组件,定义方法updateInfo
// 父组件定义方法:
methods: {
updateInfo() {
this.drawerShow = false // 更改值
}
}
// 子组件提交事务:
this.$emit("func", "请修改值") // func为父组件定义的方法识别名
b. 子组件提交事务,父组件双向绑定修改
<Drawer :drawerShow.sync="drawerShow"></Drawer> // 此处调用子组件,使用sync进行双向绑定
//相当于
<Drawer :drawerShow="drawerShow" @update:drawerShow="newVal"></Drawer>
// 子组件提交事务:
this.$emit("update:drawerShow", false) // 子组件提交更新事务,请求修改值为false