组件:
<dialog-show :showParam="showParam" @closeShow="closeDetails" @formData="submitData" />methods: {closeDetails(){this.form={};// 在父组件关闭弹窗this.show=false;},submitData(data){// data 为 this.$emit('formData',this.form) 传出的值this.form=data;}
}
- ':' 参数传递 父组件->子组件
props: ['showParam']
- '@' 结果传递接收是方法 子组件->父组件
this.$emit('closeShow')
---> 传递方法本身this.$emit('formData',this.form)
---> 传递值
使用vue的一个基本常识,父组件传递给子组件的数据,子组件通过props接受后,不能直接更改该值。这是因为:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。以下为错误示例:
<template><child :showFlag="showFlag"></child>
</template><script>
export default {name: 'parent',props:[],data () {return {showFlag: false}}
}
</script>
子组件child.vue:
<template><el-dialog title="子组件弹出框" :visible.sync="showFlag"></el-dialog>
</template>
<script>
export default {name: 'child',props: {showFlag: {type: Boolean}}
}
</script>
实际测试,浏览器不会报错,但是会给出提示,但是程序可能会出现难以预料的bug。
解决办法
父级组件parent.vue:
<template><!-- 按钮,点击设置showFlag为true,即打开弹出框 --><el-button @click="showFlag = true"></el-button><!-- 将showFlag传递给子组件 --><child :showFlag="showFlag" @closeChildDialog="closeChildDialog"></child>
</template><script>
export default {name: 'parent',props:[],data () {return {showFlag: false}},methods: {/*** 接受子组件调用的关闭弹出框方法*/closeChildDialog () {this.showFlag = false}}
}
</script>
子组件child.vue:
<template><el-dialog title="子组件弹出框" :visible.sync="dialogVisible" @close="closeDialog"><div slot="footer"><el-button @click="closeDialog">取 消</el-button><el-button type="primary" @click="closeDialog">确 定</el-button></div></el-dialog>
</template>
<script>
export default {name: 'child',props: {// 接受父级组件的显示标记,用于被watchshowFlag: {type: Boolean}},data () {return {// 子组件自己的显示标记,用于真正切换dialog的显示/隐藏dialogVisible: false}},methods: {/*** 关闭弹出框事件,触发父级组件的closeChildDialog方法*/closeDialog () {this.$emit('closeChildDialog')}},watch: {// 观察父级组件的showFlag,并将showFlag的最新值设置给dialogVisibleshowFlag (newVal, oldVal) {this.dialogVisible = newVal}}
}
</script>
源文章地址:
https://blog.csdn.net/masonqiang/article/details/115673625