一、踩坑记录

使用vue的一个基本常识,父组件传递给子组件的数据,子组件通过props接受后,不能直接更改该值。这是因为:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。以下为错误示例:

父级组件parent.vue:

<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: {

// 接受父级组件的显示标记,用于被watch

showFlag: {

type: Boolean

}

},

data () {

return {

// 子组件自己的显示标记,用于真正切换dialog的显示/隐藏

dialogVisible: false

}

},

methods: {

/**

* 关闭弹出框事件,触发父级组件的closeChildDialog方法

*/

closeDialog () {

this.$emit('closeChildDialog')

}

},

watch: {

// 观察父级组件的showFlag,并将showFlag的最新值设置给dialogVisible

showFlag (newVal, oldVal) {

this.dialogVisible = newVal

}

}

}

</script>


正道的光终将来临,当太阳升起的时候,光芒总会普照大地温暖人间。些许的阴霾也终会有被阳光洒满的一天