elementui使用经验记录

ElementUI组件按需加载与表单验证
本文介绍如何在Vue项目中使用ElementUI组件按需加载,以减少项目体积,提高加载速度。同时,详细讲解了如何利用ElementUI进行表单验证,包括数字大小值、非必填项数字验证、自定义规则等,以及如何限制日期选择器的时间范围。
组件按需加载

首先,安装 babel-plugin-component:

npm install babel-plugin-component -D

然后,在项目根目录新增 .babelrc文件(如果根目录下有babel.config.js文件,把plugins里不同的配置复制过来并删除它,因为这两个文件的配置无法合并,只需要保留一个文件)

{
    "presets": [
        [ 
        	"@babel/preset-env",
        	//"@vue/cli-plugin-babel/preset", //或者用这个
         	{ "modules": false }
        ]
    ],
    "plugins": [
        [
            "component",
            {
                "libraryName": "element-ui",
                "styleLibraryName": "theme-chalk"
            }
        ]
    ]
}

最后,按需引用组件

import { Button, Select } from 'element-ui';
Vue.use(Button);
Vue.use(Select);
表单验证数字的大小值
<el-form :model="form" :rules="rules">
	<el-form-item  label="半径" prop="radius">
	    <el-input type="number" v-model.number="form.radius"></el-input>
	</el-form-item>
</el-form>

<script>
data() {
	return {
		form: {
			radius: 0
		},
		rules: {
			radius: [
		        {
		            required: true,
		            message: '圆形直径必须大于0',
		            trigger: 'change'
		        },
		        {
		            type: 'number',
		            min: 1,
		            max: 10000,
		            message: '半径有效值为1~10000',
		            trigger: 'change'
		        }
		    ]
		}
	}
}
</script>
验证非必填项,值为数字
rules: {
	age: [{
	  type: 'number',
	  trigger: 'blur',
	  required: false,
	  message: '年龄必须为数字值',
	  // 解决方案:在rules 中验证这个功能的时候,对填写的数值进行判断
	  transform (value) {
	    return _.toNumber(value)
	  }
	}]
}
自定义验证规则
rules: {
	postCode: [{
      validator: (rule, value, callback) => {
          if (typeof value !== 'number' || value.toString().length !== 6) {
              callback(new Error('邮编为6位纯数字'));
          } else {
              callback();
          }
      },
      trigger: 'blur'
  }]
}

验证非必填项,值为数字且值大于0
<el-form :model="form" :rules="rules">
	<el-form-item  label="半径" prop="radius">
	    <el-input type="number" v-model.number="form.radius"></el-input>
	</el-form-item>
</el-form>

<script>
data() {
	return {
		form: {
			radius: 0
		},
		rules: {
			radius: [
				{ 
					pattern:/^[1-9]{1}[0-9]*$/, 
					message: '半径有效值大于0', 
					trigger: 'blur' 
				}
			]
		}
	}
}
</script>


日期选择器限制可选时间范围为60天内
<el-date-picker
     v-model="dateTimeStart"
     type="datetime"
     placeholder="请选择开始时间"
     :picker-options="pickerOptions"
></el-date-picker>
<el-date-picker
     v-model="dateTimeEnd"
     type="datetime"
     placeholder="请选择结束时间"
     :picker-options="pickerOptions"
></el-date-picker>
<script>
data (){
   return {
       dateTimeStart:'',
       dateTimeEnd:'',
       pickerOptions: {
          disabledDate: time => {
              let maxDate = new Date().getTime(); //最大可选时间为当前时间
              let diffDate = 60 * 24 * 3600 * 1000; //相差时间60天
              let minDate = maxDate - diffDate; //最小可选时间为当前时间减去相差时间
              return (
                  time.getTime() > maxDate || time.getTime() < minDate
              );
          }
      }  
   }     
}    
</script>
给dropdown下拉菜单中item添加点击事件
<el-dropdown>
	<i class="el-icon-setting"></i>
	<el-dropdown-menu slot="dropdown">
	  <el-dropdown-item>个人资料</el-dropdown-item>
	  <el-dropdown-item @click.native="logout">退出</el-dropdown-item>
	</el-dropdown-menu>
 </el-dropdown>
render函数渲染按钮阻止事件冒泡
render(h) {
	 return (
	 	<el-button  on-click={ e => { e.stopPropagation(); }} > 测试按钮</el-button>
	 );
}
ElementUI el-tree 属性空间实现单选
<template>
    <div class="tree">     
    <el-tree :data="data2" show-checkbox node-key="id" default-expand-all   
    @check-change="handleClick" ref="treeForm" @node-click="nodeClick">
    </el-tree>
    </div>
</template>

<script>
    export default {
        data () {
            return {
                 data2: [{
                    id: 1,
                    label: '一级 1',
                    children: [{
                        id: 4,
                        label: '二级 1-1',
                        children: [{
                            id: 9,
                            label: '三级 1-1-1'
                        }, {
                            id: 10,
                            label: '三级 1-1-2'
                        }]
                    }]
                }, {
                    id: 2,
                    label: '一级 2',
                    children: [{
                        id: 5,
                        label: '二级 2-1',
                    }, {
                        id: 6,
                        label: '二级 2-2'
                    }]
                }, {
                    id: 3,
                    label: '一级 3',
                    children: [{
                        id: 7,
                        label: '二级 3-1'
                    }, {
                        id: 8,
                        label: '二级 3-2'
                    }]
                }],
                checkedId:null
            }
        },
        methods: {
            handleClick(data, checked, node){
                 if(checked == true){
                     this.checkedId = data.id;
                     this.$refs.treeForm.setCheckedNodes([data]);
                 }
            },
            nodeClick(data,checked,node){
                this.checkedId = data.id
                this.$refs.treeForm.setCheckedNodes([data]);
                
            }
        }
    }
</script>

<style scoped>

</style>
同路由跳转强制刷新该路由组件

1.在菜单的路由跳转上绑定一个随机query参数,例如时间戳或者随机数

this.$router.push({
    path:"/xxx",
    query:{
        t:Date.now(),
    },
});

2.在路由容器上绑定key值

<router-view :key="$route.path + $route.query.t"></router-view>
解决路由切换,页面不更新的实用方法

https://blog.youkuaiyun.com/w390058785/article/details/82813032

表单验证根据条件设置required

1.通过在标签上设置required属性
参考链接:
https://segmentfault.com/q/1010000016698073/a-1020000016698734
https://blog.youkuaiyun.com/akatsuki233/article/details/90607829

<el-form ref="form" :model="form" :rules="rules">
<el-form-item label="备注" prop="remark" :required="isBindUserRemark" >
    <el-input
        type="textarea"
        :rows="4"
        v-model="form.remark"
        placeholder="请输入备注"
        :required="isBindUserRemark"
    ></el-input>
</el-form-item>
</el-form>
<script>
data() {
	return {
		isBindUserRemark: true,
		form: {
			remark: ''
		},
		rules: { 
			remark: [
				{
				   validator: (rule, value, callback) => {
				       if (value === '') {
				           callback(new Error('请输入解绑用户原因'));
				       } else {
				           callback();
				       }
				   },
				   trigger: 'change'
				}
			}
		}
	}
},

watch: {
    isBindUserRemark(val) {
        this.$nextTick(() => {
            if (val) {
                this.$refs.form.validateField('remark');
            }
        });
    }
}
</script>

2.在标签上设置rules属性
参考链接
https://www.jianshu.com/p/b1f906f98cd1

<el-form-item label="是否及时任务:" prop="taskType">
  <el-switch
    v-model="taskForm.taskType"
   :disabled="ifEdit"   
   :active-value="1"     
   :inactive-value="2">
  </el-switch>
</el-form-item>

<el-form-item 
  label="任务启动时间:" 
  prop="startTime" 
  :rules="taskForm.taskType === 2?rules.startTime:[{ required: false, message: '请选择任务启动时间', trigger: 'blur' }]">
  <el-date-picker 
      v-model="taskForm.startTime" 
      type="datetime" :disabled="ifEdit || taskForm.taskType === 1" 
      placeholder="选择任务启动时间">
  </el-date-picker>
</el-form-item>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值