一种是直接在父页面写代码,这样不涉及到通讯,但是父页面会比较大,且无法复用。所以这里选择了第二种。
一种是在父页面加载子组件,进行通讯,这是这个笔记的来源。
首先需要知道的是 vue
中通讯函数中, 父组件使用动态变量传递到子组件
x
<ChildDemo :dialog-Show="dialogShow" />
当需要使用函数通讯时,使用 @ 传递
x
<ChildDemo @close-dialog="closeDialog" />
子组件使用父组件传递参数:
x
<script>
export default defineComponent({
//这种写法也可以,不过不推荐,还是建议定义类型
// props: ["logId","dialogShow","dialogTitle"],
props: {
logId: Number,
dialogShow: Boolean,
dialogTitle: String
},
emits: ["closeDialog"],
setup(props, {emit}) {})
})
</script>
如果使用语法糖 setup
之后,使用的是 defineProps
defineEmits
这两个函数来替代。为了保持团队统一,我们没有使用语法糖。
需要注意一点就是当弹窗子组件做完事情之后,他自身的属性还是保留的。
举个例子:父组件是用户列表,子组件是新增用户。点击新增按钮,在子组件新增完用户完,再点新增按钮进来的属性还是上次提交的信息,所以我们需要给子组件添加属性
:key
,当变更key
的值时,子组件会重新生成。
例子:
xxxxxxxxxx
<!-- FatherDemo.vue -->
<template>
<div style="border: 1px solid #0960bd;width: 300px;">
<h2>父组件内容</h2>
dialogShow :
<br/>
dialogTitle :
<br/>
logId:
<br/>
<button @click="changeDialogShow">修改 dialogShow</button>
<button @click="changeLogId">修改 logId</button>
</div>
<div style="border: 1px solid #1B8F7A;width: 300px;">
<!--
这里设置了3个属性和一个函数,定义参数的时候官方建议是 中横线转换成小驼峰,如 a-b="c" ,子组件接受就是 aB
dialogShow 判断子组件的弹窗是否显示
dialogTitle 设置子组件弹窗的标题
logId 设置关联参数
close-dialog 函数,子组件函数传递值到父组件
-->
<ChildDemo
:dialog-Show="dialogShow"
:dialog-title="dialogTitle"
:log-id="logId"
:key="componentKey"
@close-dialog="closeDialog"
/>
</div>
</template>
<script>
// 为了方便统一风格 我们没有使用 setup 语法糖,所以使用方式略微不一样
import {defineComponent, ref} from 'vue'
import ChildDemo from "@/components/test/ChildDemo.vue";
export default defineComponent({
// 启用子组件
components: {
ChildDemo,
},
setup() {
const dialogShow = ref(false)
const dialogTitle = ref("hello vue3")
const logId = ref(0)
const componentKey = ref(0)
const changeLogId = () => {
logId.value++
}
const closeDialog = (result) => {
console.log("接受到子组件信息:" + result)
dialogShow.value = false
dialogTitle.value = result
console.log("接受到子组件信息后修改dialogShow的值,关闭弹窗,如果子组件是表单,还需要重置下")
componentKey.value++
}
const changeDialogShow = () => {
dialogShow.value = !dialogShow.value
}
return {
dialogShow, dialogTitle, logId, componentKey,
closeDialog, changeLogId, changeDialogShow
}
},
})
</script>
子组件
x
<!-- ChildDemo.vue -->
<template>
<h2>子组件内容</h2>
dialogShow :
<br/>
dialogTitle :
<br/>
logId:
<br/>
<button @click="handle">发送</button>
</template>
<script>
import {defineComponent, onMounted} from 'vue'
export default defineComponent({
//这种写法也可以,不过不推荐,还是建议定义类型
// props: ["logId","dialogShow","dialogTitle"],
props: {
logId: Number,
dialogShow: Boolean,
dialogTitle: String
},
emits: ["closeDialog"],
setup(props, {emit}) {
const getDetail = () => {
console.log("获取详情")
}
const handle = () => {
console.log("给父组件通讯,发送:hello,FatherDemo")
emit("closeDialog", "hello,FatherDemo")
}
onMounted(() => {
if (props.logId) {
getDetail()
}
})
return {
handle
}
},
})
</script>
效果:
以上是个人使用中的笔记。可能存在内容不全或者错误,请知悉。
参考文档:
上一篇: 推荐一款windows的小工具...
下一篇: MySql 触发器...