关于vue3一些代码风格的探讨

123 阅读2分钟

前言

前段时间因为一些特殊原因,我换组了,也就是换部门,不过都是开发工作。当我开始参与新的团队开发工作时,发现了一个让我比较头秃的事情,我的部分代码风格竟然和他们有较大的差别。目前属于第二种风格,有可能俺见识少,考虑的不多,所以今天分享一下两种风格的写法,也希望能和大家交流交流。

代码风格例子

下面只是大致的对两种风格举个例子,不涉及业务

风格一

风格一的思路主要是通过父组件传参,子组件通过监听props值来打开对话框

父组件代码

<template>
    <el-button @click="open">打开</el-button>
    <formDialog v-model="visible"></formDialog>
</template>
<script setup lang="ts">
import formDialog from '@/views/test/form2.vue';

const visible = ref<boolean>(false);

function open() {
    // 通过父组件传参的方式通知子组件
    visible.value = true;
}

子组件代码

<template>
    <el-dialog v-model="visible">
        <el-form ref="formRef" :model="form">
            <el-form-item label="用户名" prop="userName">
                <el-input v-model="form.userName" clearable placeholder="请输入"></el-input>
            </el-form-item>
            <el-form-item label="密码" prop="password">
                <el-input v-model="form.password" clearable placeholder="请输入"></el-input>
            </el-form-item>
        </el-form>
    </el-dialog>
</template>

<script setup lang="ts">
const props = withDefaults(
    defineProps<{
        modelValue: boolean;
    }>(),
    { modelValue: false }
);

interface userInfo {
    userName: string;
    password: string;
}

// 也可以换成计算属性
watch(
    () => props.modelValue,
    (val) => {
        visible.value = val;
    }
);

const visible = ref<boolean>(false);

const form = ref<userInfo>({ userName: '', password: '' });

风格二

风格二的思路主要是通过子组件暴露的api进行打开对话框

父组件代码

<template>
    <el-button @click="open">打开</el-button>
    <formDialog ref="formDialogRef"></formDialog>
</template>
<script setup lang="ts">
import formDialog from '@/views/test/form-dialog.vue';

const formDialogRef = ref<InstanceType<typeof formDialog>>();

function open() {
    // 通过调用父组件暴露出来的open api打开组件
    formDialogRef.value?.open();
}
</script>

子组件代码

<template>
    <el-dialog v-model="visible">
        <el-form ref="formRef" :model="form">
            <el-form-item label="用户名" prop="userName">
                <el-input v-model="form.userName" clearable placeholder="请输入"></el-input>
            </el-form-item>
            <el-form-item label="密码" prop="password">
                <el-input v-model="form.password" clearable placeholder="请输入"></el-input>
            </el-form-item>
        </el-form>
    </el-dialog>
</template>

<script setup lang="ts">
interface userInfo {
    userName: string;
    password: string;
}

const visible = ref<boolean>(false);

const form = ref<userInfo>({ userName: '', password: '' });

function open(): void {
    visible.value = true;
}

defineExpose({ open });
</script>

客串产品经理、销售的角色

当我在思考两种风格的区别之时,我陷入了另一个思考,当我们在编写组件并且思考时,那么此时的我们是不是已经是个产品经理了,客串组件产品经理。我们开发组件初期,我们可以代入产品经理的角色,组件就是产品,我们如何设计能让客户接受,让客户用起来方便,且容易扩展。当我们在使用别人开发的组件时,我们是不是也可以理解为我们是客户。经过一番歪理,我们即客串当了产品经理,也客串当了客户。

总结

个人认为如果只是单单写业务组件的话,功能完成度是一样的时,大多数业务我们都在组件内部做了,我们把对话框的开启和关闭功能放在组件内部,对外只是暴露一个可以打开的api,当然也可以暴露关闭的api,按需索取,即方便使用也方便扩展。使用组件的人只需要会简单的api以及在外部写少量的代码即可达到复用效果。