iview的菜单组件Mune 点击不高亮的解决办法 vue

本文介绍了如何使用Vue和vue-router解决导航条点击后不立即高亮的问题,通过使用router-link的active-class和exact属性实现精确匹配和样式高亮。

前言: 在项目中,我用到了vue +iview + vue-router 开发; 然后导航条就使用了iview的Menu组件,结果发觉导航条的内容点击一次之后不会显示高亮样式,而是先跳转了,我再点击一次,才会高亮显示。

在看了vue-router的文档之后,发觉有一个很好用的东西,就是router-link的属性: active-classexact

为什么要使用router-link? 官网上说明了这几点好处:
组件支持用户在具有路由功能的应用中(点击)导航。 通过 to 属性指定目标地址,默认渲染成带有正确链接的 a 标签,可以通过配置 tag 属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名。

比起写死的 <a href="..."> 会好一些,理由如下:

无论是 HTML5 history 模式还是 hash 模式,它的表现行为一致,所以,当你要切换路由模式,或者在 IE9 降级使用 hash 模式,无须作任何变动。

在 HTML5 history 模式下,router-link 会守卫点击事件,让浏览器不再重新加载页面。

当你在 HTML5 history 模式下使用 base 选项之后,所有的 to 属性都不需要写(基路径)了。

首先, active-class可以指定一个高亮时的样式, 比如我定义一个白色粗体的样式:

    color: #fff;
    font-weight: bold;
    }

然后,就是exact,文档介绍是这样的
exact

类型: boolean

默认值: false

“是否激活” 默认类名的依据是 inclusive match (全包含匹配)。 举个例子,如果当前的路径是 /a 开头的,那么 也会被设置 CSS 类名。

按照这个规则,每个路由都会激活!想要链接使用 “exact 匹配模式”,则使用 exact 属性:

<!-- 这个链接只会在地址为 / 的时候被激活 -->
<router-link to="/" exact>

在考虑到Menu组件的默认css可能会影响我的导航栏,所以我果断不用Menu组件,然后使用ul标签;最后,我的代码长这样:

<ul>
<li>
<router-link to="/" active-class="active" > 首页</roouter-link>
</li>
</ul>

然后,官网上还可以这样玩:
“`

    <router-link to="/" active-class="active" tag="li" ><a>首页</a></roouter-link>
    
      </ul>
    ```
    
    <think>我们正在讨论iview DatePicker组件的表单校验问题,特别是当日期类型为一段区间(type="daterange")时,表单校验生效的情况。根据引用内容,我们可以总结出以下关键点: 1. 当使用daterange类型时,v-model绑定的值是一个数组,例如`[startDate, endDate]`。 2. 在页面挂载后,初始值可能是`['', '']`(两个空字符串),这会导致校验规则匹配。 3. 针对数组类型的值,iview的表单校验规则需要使用`fields`属性来分别校验数组的每个元素。 引用[1]中给出了一个解决方案: - 设置`validDate`的校验规则为`type: 'array'`,然后使用`fields`属性分别定义索引0和索引1的校验规则,每个元素都设置为`type: 'date'`,并且`required: true`。 引用[2]则提供了另一种思路,即使用数组校验,而是将开始日期和结束日期拆分成两个字段,然后分别设置校验规则。 因此,针对DatePicker组件表单校验生效的问题,我们可以提出两种解决方法: **方法一:使用数组校验规则(适用于绑定一个数组的情况)** 在表单规则中,将prop对应的规则设置为数组类型,并使用`fields`属性分别校验数组的两个元素。 ```javascript formRules: { validDate: [ { type: 'array', required: true, fields: { 0: { type: 'date', required: true, message: '请选择开始日期', trigger: 'blur' }, 1: { type: 'date', required: true, message: '请选择结束日期', trigger: 'blur' } } } ] } ``` **方法二:拆分字段(推荐)** 将开始日期和结束日期拆分成两个独立的字段,然后分别绑定到两个DatePicker(类型为date)上,或者使用一个daterange的DatePicker但在on-change事件中拆分成两个字段,然后分别校验。 步骤: 1. 在formData中定义两个字段,例如`startDate`和`endDate`。 2. 使用daterange类型的DatePicker,在on-change事件中将数组拆分成两个字段赋值。 3. 分别设置这两个字段的校验规则。 示例代码: ```html <template> <Form ref="form" :model="formData" :rules="formRules"> <FormItem label="有效期" required> <Row> <Col span="11"> <FormItem prop="startDate"> <DatePicker type="date" placeholder="选择开始日期" v-model="formData.startDate" ></DatePicker> </FormItem> </Col> <Col span="2" style="text-align: center">至</Col> <Col span="11"> <FormItem prop="endDate"> <DatePicker type="date" placeholder="选择结束日期" v-model="formData.endDate" ></DatePicker> </FormItem> </Col> </Row> </FormItem> </Form> </template> <script> export default { data() { return { formData: { startDate: '', endDate: '' }, formRules: { startDate: [ { type: 'date', required: true, message: '请选择开始日期', trigger: 'blur' } ], endDate: [ { type: 'date', required: true, message: '请选择结束日期', trigger: 'blur' } ] } } } } </script> ``` 或者,如果你仍然想使用一个daterange选择器,可以这样: ```html <template> <Form ref="form" :model="formData" :rules="formRules"> <FormItem label="有效期" prop="validDate"> <DatePicker type="daterange" v-model="formData.validDate" @on-change="handleDateChange" style="width: 100%" ></DatePicker> </FormItem> <!-- 注意:这里我们实际上校验的是两个隐藏的字段,也可以绑定在表单上,而是用自定义校验 --> <FormItem prop="startDate" style="display: none;"></FormItem> <FormItem prop="endDate" style="display: none;"></FormItem> </Form> </template> <script> export default { data() { return { formData: { validDate: [], // 用于绑定日期选择器 startDate: '', // 实际开始日期 endDate: '' // 实际结束日期 }, formRules: { startDate: [ { type: 'date', required: true, message: '请选择开始日期', trigger: 'change' } ], endDate: [ { type: 'date', required: true, message: '请选择结束日期', trigger: 'change' } ] } }; }, methods: { handleDateChange(dates) { this.formData.startDate = dates[0]; this.formData.endDate = dates[1]; } } } </script> ``` 但是,第二种方法中隐藏的表单项可能会引起一些必要的麻烦(比如表单布局)。因此,更推荐第一种拆分字段并分别显示的方法,或者使用自定义校验规则。 **额外建议:自定义校验函数** 如果以上方法都适合,还可以使用自定义校验函数。 ```javascript formRules: { validDate: [ { validator: (rule, value, callback) => { if (!value || value.length !== 2 || !value[0] || !value[1]) { callback(new Error('请选择完整的有效日期区间')); } else { callback(); } }, trigger: 'blur' } ] } ``` 总结: - 方法一(数组校验)直接适用于绑定数组的情况,但要注意数组元素的校验规则。 - 方法二(拆分字段)更直观,易于管理,推荐使用。 - 自定义校验函数灵活,但需要手动编写校验逻辑。 请根据具体需求选择合适的方法。 </think>### iView DatePicker 组件表单校验生效的解决方案 根据引用内容,当使用 `type="daterange"` 日期区间选择器时,表单校验失效通常是因为值类型处理当。以下是三种经过验证的解决方案: --- #### **解决方案 1:使用数组校验规则(推荐)** 修改表单校验规则为数组类型,并通过 `fields` 属性分别校验每个元素: ```javascript formRules: { validDate: [{ type: 'array', // 声明为数组类型 required: true, fields: { // 分别校验数组元素 0: { // 第一个元素(开始日期) type: 'date', required: true, message: '请选择开始日期', trigger: 'blur' }, 1: { // 第二个元素(结束日期) type: 'date', required: true, message: '请选择结束日期', trigger: 'blur' } } }] } ``` **关键点**: - `type: 'array'` 声明绑定的值 `formData.validDate` 是数组 - `fields` 属性对数组元素分别校验 - 每个元素校验规则需指定 `type: 'date'` [^1] --- #### **解决方案 2:拆分为独立字段** 将日期区间拆分为两个独立字段分别校验: ```javascript data() { return { formData: { startDate: null, // 独立开始日期字段 endDate: null // 独立结束日期字段 }, formRules: { startDate: [{ // 单独校验开始日期 type: 'date', required: true, message: '请选择开始日期', trigger: 'blur' }], endDate: [{ // 单独校验结束日期 type: 'date', required: true, message: '请选择结束日期', trigger: 'blur' }] } }; }, methods: { handleDateChange(dates) { this.formData.startDate = dates[0]; this.formData.endDate = dates[1]; } } ``` 模板中绑定: ```html <DatePicker type="daterange" @on-change="handleDateChange" /> ``` --- #### **解决方案 3:使用正则表达式校验** 针对空值问题,用正则强制校验非空: ```javascript formRules: { validDate: [{ required: true, pattern: /.+/, // 正则确保非空 message: '请选择完整日期范围', trigger: 'blur' }] } ``` **适用场景**:简单校验非空,但无法区分开始/结束日期[^2]。 --- ### **常见问题排查** 1. **初始化值类型错误** `formData.validDate` 必须初始化为数组:`validDate: []` 2. **校验触发时机** `trigger: 'blur'` 需配合输入框失焦操作,可改为 `trigger: 'change'` 3. **表单重置问题** 重置表单时需将值重置为空数组: ```javascript this.$refs.form.resetFields(() => { this.formData.validDate = []; // 显式重置数组 }); ``` --- ### 相关问题 1. 如何在 iView 中自定义日期校验规则(如结束日期需大于开始日期)? 2. 使用 `DatePicker` 时,为什么 `trigger: 'blur'` 有时触发校验? 3. iView 表单动态校验的实现方法有哪些? [^1]: iview DatePicker 校验规则配置要点 [^2]: iview 表单正则校验替代方案
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值