从同事写的代码中,学习如何写代码4之Proxy

30 阅读1分钟

现在有一个下拉组件,后端接收的参数类型是String,参数名roleCode

解决方案1(不考虑异常情况)
<template>
    <el-modal :visible="visibleProxy" @ok="onSubmit" @cancel="onCancel"> 
        <el-select
            v-model="roleCodeProxy"
            :option="roleList"
        />
    </el-modal>

</template>

<script>
export default {
    props: {
        visible: {
            type: Boolean,
            required: true
        },
        roleCode: {
            type: String,
            required: true
        }
    },
    data() {
        return {
            visibleProxy: this.visible,
            roleCodeProxy: this.roleCode.split(','),
            roleList: []
        }
    },
    watch: {
        visibleProxy(val) {
            this.$emit('update:visible', val)
        }
    },
    methods: {
        onSubmit() {
            this.$emit('update:roleCode', this.roleCodeProxy.join())
        }
    }
}
</script>
代码谈不上好用 更谈不上优雅
解决方案2(不考虑异常情况)
<template>
    <el-modal :visible="visibleProxy" @ok="onSubmit" @cancel="onCancel"> 
        <el-select
            v-model="roleCodeProxy"
            :option="roleList"
        />
    </el-modal>

</template>

<script>
export default {
    props: {
        visible: {
            type: Boolean,
            required: true
        },
        roleCode: {
            type: String,
            required: true
        }
    },
    computed: {
        visibleProxy: {
            get() {
                return this.visible
            },
            set(val) {
                this.$emit('update:visible', val)
            }
        },
        roleCodeTmpProxy: {
            get() {
                try {
                    return this.roleCodeTmp
                        .split(',')
                        .filter(Boolean)
                } catch(e) {
                    console.log(e)
                }
                return []
            },
            set(val) {
                this.roleCodeTmp = val.join(',')
            }
        },
    },
    data() {
        return {
            roleCodeTmp: this.roleCode || '',
            roleList: []
        }
    },
    watch: {
        visibleProxy(val) {
            this.$emit('update:visible', val)
        }
    },
    methods: {
        onSubmit() {
            this.$emit('update:roleCode', this.roleCodeTmp)
        }
    }
}
</script>
将中间过程交给Proxy,我们只关注直观的业务逻辑、代码依赖关系