关于elementui 切换中英文的时候,检验不实时更新的问题解决

1.系统在做中英文切换的时候,发现一个现象就是,文本类的能直接切换过来,但是,如果是从js中获取的就不会实时更新,比如form中的校验,但是将页面重新刷新的话就可以更新过来了

打开代码查看找原因,

 

 

 

 

原因:就是页面在登录的时候就加载好了获取中英文校验的js,切换中英文的时候没有重新进行获取js文件,导致还是上一次的翻译的检验,但是重新将页面刷新的话就能更新过来

分析原因:

js中导入的是一个对象,对象是引用的关系

解决办法:

 

1.首先将js里面的对象修改成函数的形式

原来的写法(rule.js):

import i18n from '@common/langs/i18n'
import common from '@frameworks/assets/js/Common'

const requirMsg = common.getI18n(i18n.t('message.app_message_required')) // 此处为必填项
const validPhoneMsg = common.getI18n(i18n.t('message.app_message_validPhone')) // 请输入正确的手机号码
const correctPhoneAndLandlineMsg = common.getI18n(i18n.t('message.app_message_correctPhoneAndLandline')) // 请输入正确的手机号码或座机号码
const emailFormatErrorMsg = common.getI18n(i18n.t('message.app_message_emailFormatError')) // 邮箱格式不正确
const IntMsg = common.getI18n(i18n.t('message.app_message_integer')) // 只能输入正整数
const IntegerMsg = common.getI18n(i18n.t('message.app_message_int')) // 只能输入0和正整数


export default {
    requiredBlur:{ required: true, message: requirMsg, trigger: ['blur'],name:'requiredBlur'}, // 资产管理模块,新增时会直接显示校验结果,因此加多一个必填校验
    required:{ required: true, message: requirMsg, trigger: ['blur','change'],name:'required'},
    telephone: { pattern: /^1[3456789]\d{9}$/, message: validPhoneMsg, trigger: ['blur','change'],name:'telephone'},
    call: { pattern: /^(1[3456789]\d{9})|(\d{3}-\d{8}|\d{4}-\d{7})$/, message: correctPhoneAndLandlineMsg, trigger: ['blur','change'],name:'call'},
    email:{pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, message: emailFormatErrorMsg, trigger: ['blur','change'],name:'email'},
    int: { pattern: /^\d+$/, message: IntMsg, trigger: ['blur','change'],name:'int'},
    integer: { pattern: /^\d+$/, message: IntegerMsg, trigger: ['blur','change'],name:'integer'},
    float: { pattern: /^(-)?\d+(\.\d+)?$/, message: FigureMsg, trigger: ['blur','change'],name:'float'}
}
</script>

修改后的写法 函数(_rule.js)

import i18n from '@common/langs/i18n'
import common from '@frameworks/assets/js/Common'

export default {
    required:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_required'))}},
    telephone:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_validPhone'))}},
    call:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_correctPhoneAndLandline'))}},
    email:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_emailFormatError'))}},
    int:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_integer'))}},
    integer:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_int'))}},
    float:(params)=>{ return {...params, message: common.getI18n(i18n.t('message.app_message_figure'))}},
}

2.然后再在表单验证中(selfForm.js)中做修改,当中英文变化的时候重新调用获取校验的函数

原来的selfForm.js

<self-form>
    :ref="formInfos.name"
    :label-width="`${formInfos.labelWidth}px`"
    :model="fields"
    :name="formInfos.name"
    :rules="typeof formInfos.rules==='function'?formInfos.rules(fields):formInfos.rules"
    :inline="formInfos.inline"
    :size="formInfos.size"
</self-form>

 

修改后的selfForm.js(部分代码)

<template>
    <div>
        <el-form 
            :ref="formInfos.name"
            :label-width="`${formInfos.labelWidth}px`"
            :model="fields" 
            :name="formInfos.name"
            :rules="rules"
            :inline="formInfos.inline" 
            :label-position="formInfos.name=='searchForm'?'left':'right'" 
            :size="formInfos.size"
            :validate-on-rule-change="false"
            @submit.native.prevent 
            :class="[{'demo-form-inline':formInfos.inline},'demo-ruleForm','self-form',formInfos.className,formInfos.name]"
            :style="formInfos.style"
        >
        </el-form>
    </div>
</template>
<script>
import { mapGetters } from 'vuex'
import Vue from 'vue'
import _rules from '@frameworks/assets/js/_Rules'
export default {
    name: 'self-form',
    computed:{
        ...mapGetters(['base_lang']),
        computedRules(){
           return typeof this.formInfos.rules === 'function'?this.formInfos.rules(this.fields):this.formInfos.rules
        },
        rules(){
            for(let key in this.computedRules){
                const rules = [];
                for(let item of this.computedRules[key]){
                    if(typeof(item) == 'object' && item.name && _rules[item.name]){
                        rules.push(_rules[item.name].call(null,item));
                    }else{
                        rules.push(item);
                    }
                }
                this.computedRules[key] = rules;
            }
            return this.computedRules;
        }
    },
}
</script>

因为切换中英文this.formInfos.rules会变化

完美解决

posted @ 2022-02-25 11:01  人在路途  阅读(839)  评论(0编辑  收藏  举报