设计模式 策略模式 场景Vue (技术提升)

策略模式 (建议复制编辑器查看更佳)

在给定的 Vue.js 组件代码中,根据optionKey的不同值,展示了不同的表单内容并定义了不同的表单验证规则。在这里,optionMap对象内部定义了不同的策略(addAccount、editAccount、editPassword),每个策略包含了不同的表单类型列表和表单验证规则。根据当前的optionKey值,页面会展示相应的表单内容,并应用相应的验证规则。这样的设计允许在不同的场景下使用不同的策略,而无需修改主要的逻辑。这种方式带来了可扩展性和易维护性,当您需要添加新的表单类型或不同的验证规则时,只需简单地往optionMap对象内添加新的策略即可。

应用场景: 我们可以先写好多个不同的表单类型和验证规则,然后根据不同的场景我们可以直接通过策略分配,通过组合不同的表单项目从而搭建不一样的表单集合,以及可以根据场景的不同调用不同的校验规则。

优点:这样的设计允许在不同的场景下使用不同的策略,而无需修改主要的逻辑。这种方式带来了可扩展性和易维护性,使得代码更具有扩展性和灵活性,当您需要添加新的表单类型或不同的验证规则时,只需简单地往optionMap对象内添加新的策略即可。

栗子

VueDOM结构

javascript 复制代码
    <!-- optionMap[optionKey].title:是标题 -->
    <!-- optionMap[optionKey].formRules:校验规则 -->
    <!-- optionMap[optionKey].formRules:校验规则 -->
    <!-- optionMap[optionKey].typeList: 是否显示对应的权限组 可以进行自由搭配-->

    <!-- 思路就是: 根据点击事件动态设置optionKey的状态 然后去取对应策略 -->
<el-dialog destroy-on-close v-model="dialogVisible" :title="optionMap[optionKey].title" width="500"
        @close="resetForm(formRef)">
        <el-form ref="formRef" style="max-width: 600px" :rules="optionMap[optionKey].formRules" :model="userForm"
            label-width="auto" class="demo-ruleForm">
            <el-form-item v-if="optionMap[optionKey].typeList.includes('姓名')" label="姓名" prop="nickName">
                <el-input v-model.trim="userForm.nickName" type="text" placeholder="请输入姓名" show-word-limit
                    maxlength="20" />
            </el-form-item>
            <el-form-item v-if="optionMap[optionKey].typeList.includes('账户')" label="账户" prop="userName">
                <el-input v-model.trim="userForm.userName" type="text" placeholder="请输入账户" show-word-limit
                    maxlength="20">
                    <template #prepend>
                    </template></el-input>
            </el-form-item>
            <el-form-item v-if="optionMap[optionKey].typeList.includes('新密码')" label="新密码" prop="password">
                <el-input v-model.trim="userForm.password" type="text" placeholder="请输入新密码" />
            </el-form-item>
            <el-form-item v-if="optionMap[optionKey].typeList.includes('确认密码')" label="确认密码" prop="conPassword">
                <el-input v-model.trim="userForm.conPassword" type="password" placeholder="请确认密码" />
            </el-form-item>
            <el-form-item v-if="optionMap[optionKey].typeList.includes('手机号')" label="手机号" prop="phonenumber">
                <el-input v-model.trim="userForm.phonenumber" type="iPhone" placeholder="请输入手机号" />
            </el-form-item>
            <el-form-item v-if="optionMap[optionKey].typeList.includes('备注')" label="备注" prop="remark">
                <el-input v-model.trim="userForm.remark" show-word-limit rows="4" resize="none" type="textarea"
                    maxlength="200" placeholder="请输入备注" />
            </el-form-item>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button class="butClass" @click="submitForm(formRef, optionMap[optionKey].title)">确定</el-button>
                <el-button @click="resetForm(formRef)">取消</el-button>
            </div>
        </template>
    </el-dialog>

JS策略

javascript 复制代码
  const optionKey = ref('addAccount');
    const optionMap: any = {
        addAccount: {
            title: '添加账户',
            typeList: ['姓名', '账户', '新密码', '手机号', '备注'],
            formRules: {
                userName: [{ required: true, message: '账户必填', trigger: 'blur' },
                { required: true, validator: validateAccount, trigger: 'blur' }
                ],
                nickName: [{ required: true, message: '姓名必填', trigger: 'blur' }],
                password: [{ required: true, message: '密码必填', trigger: 'blur' },
                { required: true, validator: validateInput, trigger: 'blur' }
                ],
                phonenumber: [{ required: true, message: '手机号必填', trigger: 'blur' },
                { required: true, validator: validatePhoneNumber, trigger: 'blur' }
                ],
            },
        },
        editAccount: {
            title: '修改账户',
            typeList: ['姓名', '账户', '手机号', '备注'],
            formRules: {
                userName: [{ required: true, message: '账户必填', trigger: 'blur' },
                { required: true, validator: validateAccount, trigger: 'blur' }
                ],
                nickName: [{ required: true, message: '姓名必填', trigger: 'blur' }],
                phonenumber: [{ required: true, message: '手机号必填', trigger: 'blur' },
                { required: true, validator: validatePhoneNumber, trigger: 'blur' }
                ],
            },
        },
        editPassword: {
            title: '修改密码',
            typeList: ['新密码', '确认密码'],
            formRules: {
                password: [{ required: true, message: '密码必填', trigger: 'blur' },
                { required: true, validator: validateInput, trigger: 'blur' }
                ],
                conPassword: [{ required: true, validator: validatePass, message: '两次密码不一样' }],
            },
        },
    };
相关推荐
一个处女座的程序猿O(∩_∩)O38 分钟前
完成第一个 Vue3.2 项目后,这是我的技术总结
前端·vue.js
重生之绝世牛码1 小时前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
GIS开发特训营2 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood3 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
一个处女座的程序猿O(∩_∩)O6 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
大圣数据星球7 小时前
Fluss 写入数据湖实战
大数据·设计模式·flink
思忖小下8 小时前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit
燃先生._.12 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
2401_8576009515 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js