Vuetify2.x学习笔记(肆):扩展面板(expansion panel)、菜单(menu)、对话框(dialog/popup)、表单(form)、日期选择器(date picker)【完结】

这篇博客详细介绍了Vuetify2.x中的扩展面板,包括如何控制其展开和折叠;菜单的创建与设置,如禁用、悬停展开等;对话框的属性配置,如宽度、可滚动性;表单的创建、校验规则及其操作;以及日期选择器的使用和集成。内容覆盖了Vuetify组件的多种交互和样式定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

▲扩展面板

该组件是一个信息栏 当点击展开后 能显示更多信息
在这里插入图片描述
使用<v-expansion-panels>标签创建一个扩展面板组 里面可以有很多独立的扩展面板项

  • 添加accordion手风琴效果 移除扩展面板打开后的边距(默认离其它扩展面板之间是有一些距离的)
  • 添加popout使面板以弹出的形式打开(默认是下拉方式打开)
  • 添加inset使面板以嵌入的形式打开(默认是下拉方式打开)
  • 添加multiple使面板能同时打开多个(默认是若打开一个后再打开另一个 则原来的会被折叠)
  • 添加disabled禁用整个扩展面板组
  • 添加readonly使扩展面板组为只读状态(即 只能看折叠的 但不能打开)
  • 添加focusable使当前打开的扩展面板有颜色加深效果
  • 添加flat移除所有扩展面板的阴影和边框
  • 添加hover当鼠标悬停在扩展面板上时 被悬停的扩展面板有颜色加深效果
  • 添加tile移除扩展面板组的边框圆角效果

在扩展面板组的区域里 使用<v-expansion-panel>标签创建每一个扩展面板

  • 添加disabled禁用整个扩展面板组
  • 添加readonly使扩展面板组为只读状态(即 只能看折叠的 但不能打开)

使用<v-expansion-panel-header>标签创建扩展面板的标题 即 当扩展面板折叠起来时显示的内容
使用<v-expansion-panel-content>标签创建扩展面板的内容 即 当扩展面板展开后显示的内容

  • 设置color属性修改背景颜色
<v-expansion-panels>
    <v-expansion-panel>
        <v-expansion-panel-header>Item</v-expansion-panel-header>
        <v-expansion-panel-content>
            <div class="font-weight-bold">测试</div>
            <div>内容内容内容内容内容内容内容内容内容内容内容内容内容</div>
        </v-expansion-panel-content>
    </v-expansion-panel>
</v-expansion-panels>
还可通过JS控制扩展面板的展开和折叠:

<v-expansion-panels>上用v-model控制
v-model绑定的是一个数组 其中 数组的下标即为展开的扩展面板项的下标(下标从0开始)

<v-expansion-panels multiple v-model="panel">
    <v-expansion-panel v-for="project in projects" :key="project.title">
        <v-expansion-panel-header>{{project.title}}</v-expansion-panel-header>
        <v-expansion-panel-content>
            <div class="font-weight-bold">{{project.status}}</div>
            <div>{{project.lorem}}</div>
        </v-expansion-panel-content>
    </v-expansion-panel>
</v-expansion-panels>

...


<script>
export default {
    data()
    {
        return {
            panel:[1,2], // 数组里只有1和2 那么第2和第3个扩展面板项将被默认展开
            projects:[
                {title:"标题3",person:"陈涛",weather:"晴",status:"Great",lorem:"  Lorem ipsum dolor sit amet consectetur adipisicing elit. Aspernatur minima quis impedit cum nemo suscipit ratione repellendus voluptatibus commodi, explicabo dolore aliquid quod autem eius voluptate mollitia? Quod, sequi minima!"},
                {title:"标题2",person:"张涛",weather:"暴雨",status:"Relax",lorem:"  Lorem ipsum dolor sit amet consectetur adipisicing elit. Aspernatur minima quis impedit cum nemo suscipit ratione repellendus voluptatibus commodi, explicabo dolore aliquid quod autem eius voluptate mollitia? Quod, sequi minima!"},
                {title:"标题1",person:"王涛",weather:"小雨",status:"Angry",lorem:"  Lorem ipsum dolor sit amet consectetur adipisicing elit. Aspernatur minima quis impedit cum nemo suscipit ratione repellendus voluptatibus commodi, explicabo dolore aliquid quod autem eius voluptate mollitia? Quod, sequi minima!"},
                {title:"标题4",person:"李涛",weather:"阴",status:"Great",lorem:"  Lorem ipsum dolor sit amet consectetur adipisicing elit. Aspernatur minima quis impedit cum nemo suscipit ratione repellendus voluptatibus commodi, explicabo dolore aliquid quod autem eius voluptate mollitia? Quod, sequi minima!"},
                {title:"标题5",person:"陈涛",weather:"晴",status:"Great",lorem:"  Lorem ipsum dolor sit amet consectetur adipisicing elit. Aspernatur minima quis impedit cum nemo suscipit ratione repellendus voluptatibus commodi, explicabo dolore aliquid quod autem eius voluptate mollitia? Quod, sequi minima!"}

            ]
        }
    }
}
</script>

▲菜单

当点击菜单按钮 即可弹出一个下拉框 展示出里面所有的条目
在这里插入图片描述
使用<v-menu>标签创建一个菜单

  • 添加disabled 使菜单被禁用(可以点击 但点击无作用 点击后无法展开)
  • 添加open-on-hover 当鼠标悬停在菜单按钮时即展开菜单
  • 使用close-on-click属性 设置点击菜单外部能否使菜单折叠(值为true/false 默认true)
  • 使用close-on-content-click属性 设置点击菜单中的列表项时能否使菜单折叠(值为true/false 默认true)
  • 添加offset-x 使展开后的菜单不遮挡按钮 而是在按钮的x轴方向的旁边(默认展开菜单后会遮挡按钮)
  • 添加offset-y 使展开后的菜单不遮挡按钮 而是在按钮的y轴方向的旁边(默认展开菜单后会遮挡按钮)

<template v-slot:activator="{on}">标签创建菜单按钮区
<v-btn>创建菜单按钮(必须添加v-on="on"属性)

  • 不仅是按钮 菜单组件可以放入几乎任何组件 例如图标(icon)或是文本 且也需要添加v-on="on"属性

在<template>标签下方用<v-list>创建下拉列表

<v-menu offset-x>
    <!-- 菜单按钮 -->
    <template v-slot:activator="{on}">
        <v-btn v-on="on">
            <v-icon left>expand_more</v-icon>
            <span>menu</span>
        </v-btn>
    </template>
    <!-- 下拉列表 -->
    <v-list>
        <v-list-item v-for="link in links" :key="link.text" router :to="link.route">
            <v-list-item-title>{{link.text}}</v-list-item-title>
        </v-list-item>
    </v-list>
</v-menu>

...

<script>
export default {
    data(){
        return {
            drawer:false,
            links:[
                { text: 'Homepare', icon: 'home',route:"/"},
                { text: 'Story', icon: 'book',route:"/story"},
                { text: 'about', icon: 'face',route:"/about"},
            ]
        }
    }
}
</script>

▲对话框/弹出框

使用<v-dialog>标签创建对话框

  • 添加disabled 使弹出框被禁用(可以点击 但点击无作用 点击后无法弹出)
  • 使用width属性 设置弹出框的宽度
  • 使用max-width属性 设置弹出框的最大宽度
  • 使用overlay-color属性 设置弹出框的遮罩层颜色
  • 使用overlay-opacity属性 设置弹出框的遮罩层透明度
  • 添加persistent 使弹出框只有点击弹出框内部的按钮才可被隐藏(默认是点击弹出框外部遮罩层也能使弹出框隐藏)
  • 使用value属性 控制弹出框的显示和隐藏(值为true/false)
  • 添加scrollable 使弹出框可滚动(还需给内部的<v-card-text>设置高度)

<template v-slot:activator="{on}">标签创建对话框按钮区
<v-btn>创建对话框按钮(必须添加v-on="on"属性)

  • 不仅是按钮 对话框组件可以放入几乎任何组件 例如图标(icon)或是文本 且也需要添加v-on="on"属性

在<template>标签下方用<v-card>创建弹出的对话框的内容

<v-dialog max-width="600px">
    <!-- 弹出框按钮 -->
    <template v-slot:activator="{ on }">
        <v-btn outlined class="success" v-on="on">Add new story</v-btn>
    </template>
    <!-- 弹出内容 -->
    <v-card>
        <v-card-title>
            <h2>Add a New Story</h2>
        </v-card-title>
    </v-card>
</v-dialog>
可滚动的对话框
<v-dialog scrollable max-width="300px" v-model="dialog">
  <template v-slot:activator="{ on }">
    <v-btn color="primary" dark v-on="on">可滚动的对话框</v-btn>
  </template>
  <v-card>
    <v-card-text style="height: 300px;"> <!--必须设置高度height-->
      <v-radio-group v-model="dialogm1" column>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
        <v-radio label="内容" value="1"></v-radio>
      </v-radio-group>
    </v-card-text>
    <v-divider></v-divider>
    <v-card-actions>
      <v-btn @click="dialog = false">Close</v-btn>
    </v-card-actions>
  </v-card>
</v-dialog>

...

<script>
export default {
    data()
    {
        return {
            dialog: false
        }
    }
}
</script>

▲表单

使用<v-form>标签创建一个表单区域

使用<v-text-field>标签创建文本输入框(即<input type="text>)
在这里插入图片描述

  • 使用label属性为输入框设置提示标题
    默认标题在输入框中 当输入框获得焦点 标题会缩小并移动到输入框上方
<v-text-field label="标题" v-model="title"></v-text-field>

在这里插入图片描述
在这里插入图片描述

  • 使用prepend-icon属性为输入框的前面添加一个小图标
<v-textarea label="详细信息" v-model="content" prepend-icon="edit"></v-textarea>

在这里插入图片描述
在这里插入图片描述
使用<v-textarea>标签创建文本输入域(即<textarea></textarea>)
也有label属性和prepend-icon属性

<v-textarea label="详细信息" v-model="content" prepend-icon="edit"></v-textarea>
表单校验

使用rules属性设置表单校验规则(rules属性必须用v-bind绑定)
然后在JS里进行配置规则 规则是数组类型的 可以有多个校验规则
当不符合某一条校验规则 那么会在表单上显示对应的返回值

在数组里 v代表了输入框中的值 可用正则表达式及其它逻辑运算符自定义校验规则

<v-text-field label="标题" v-model="title" prepend-icon="folder" :rules="titleRules"></v-text-field>

...

<script>
export default {
    data()
    {
        return {
            title: "",
            // 标题校验规则
            titleRules:[
                v => !!v || "标题不能为空",
                v => (v && v.length <= 10) || "标题不能超出10个字符",
            ],
            // 邮箱校验规则
            emailRules: [
                v => !!v || "邮箱不能为空",
                v => /.+@.+\..+/.test(v) || "请输入邮箱格式",
            ],
        }
    }
}
</script>

在这里插入图片描述

还可校验表单的提交
  • 使用validate()验证表单内所有输入是否有效
  • 使用reset()清空表单内所有输入值并重置校验失败提示语
  • 使用resetValidation()仅重置校验失败提示语 而不清空输入值

使用时 需要在表单标签上添加ref属性 将表单注册到父组件的$refs上

<v-form ref="form">
...

<v-btn @click="submit">保存</v-btn>
</v-form>

...

<script>
export default {
    methods: {
        submit()
        {
            if (this.$refs.form.validate())
            {
            	// 校验成功
                ...
            }
        }
    }
}
</script>

▲日期选择器

使用<v-date-picker>标签创建一个日期选择器

  • 使用color属性和header-color属性设置颜色
    在这里插入图片描述
也可将日期选择器集成在菜单中

可给<v-text-field>加上readonly属性 以避免手误输入不符合规范的日期数值

<v-menu min-width="290px">
    <template v-slot:activator="{ on }">
        <v-text-field laber="日期" prepend-icon="event" v-on="on" v-model="date" readonly></v-text-field>
    </template>
    <v-date-picker v-model="date"></v-date-picker>
</v-menu>

...

<script>
export default {
    data()
    {
        return {
            date:null
        }
    }
}
</script>

<think>好的,我现在要解决用户在Java中遇到的`java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result`异常问题。这个问题通常出现在使用`BigDecimal`进行除法运算时,当结果是一个无限不循环小数,而没有指定舍入模式的情况下。我需要仔细分析原因,并提供有效的解决方案。 首先,用户的问题是关于非终止小数扩展导致的异常。我应该回忆一下`BigDecimal`的除法运算方法。记得`BigDecimal.divide()`方法有多个重载版本,其中必须指定舍入模式(RoundingMode)的情况,尤其是在结果无法精确表示时。如果用户没有提供舍入模式,就会抛出这个异常。比如,当进行1除以3这样的运算,结果无限循环,无法精确表示,这时候如果不指定如何舍入,就会出错。 接下来,我需要考虑如何正确使用`divide()`方法。正确的做法是在调用方法时,除了传入除数,还要指定舍入模式和精度。例如,使用`RoundingMode.HALF_UP`这样的常见舍入方式。另外,可能还需要设置结果的精度,比如使用另一个重载方法,同时指定小数位数和舍入模式。 然后,我需要给出具体的代码示例,说明如何避免这个异常。比如,展示正确使用`divide()`方法的代码,以及如何处理不同的情况,如已知结果可能是无限小数的情况,或者需要精确控制小数位数的情况。 此外,可能还需要提醒用户注意其他可能引发类似异常的场景,比如在使用`divideAndRemainder()`方法时,如果没有正确设置舍入模式,也可能导致问题。不过,用户当前的问题主要集中在`divide()`方法上,所以重点应放在这里。 最后,总结解决方案,强调必须指定舍入模式,并提供不同的应用场景示例,确保用户能够根据实际需求选择合适的处理方式。同时,可能需要解释为什么这个异常会发生,帮助用户理解背后的原理,从而更好地避免类似问题。</think>在Java中,`java.lang.ArithmeticException: Non-terminating decimal expansion`异常通常发生在使用`BigDecimal`进行除法运算时,结果无法精确表示为有限小数且未指定舍入模式。以下是逐步解决方案: --- ### 1. 问题原因分析 当使用`BigDecimal.divide()`进行除法运算时,若结果是无尽小数(如$1/3 = 0.\overline{3}$),且未定义舍入规则,Java会抛出此异常[^1]。 --- ### 2. 核心解决方法 使用`divide()`方法时**必须指定舍入模式**(`RoundingMode`)和精度: ```java BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("3"); BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 保留2位小数,四舍五入 ``` --- ### 3. 不同场景的解决方案 #### 场景1:已知结果为无限小数 ```java // 明确设置小数位数和舍入模式 BigDecimal result = a.divide(b, 4, RoundingMode.HALF_EVEN); ``` #### 场景2:需要完全精确计算 ```java // 使用MathContext定义总精度 MathContext mc = new MathContext(10, RoundingMode.CEILING); BigDecimal result = a.divide(b, mc); ``` #### 场景3:整数除法要求余数 ```java BigDecimal[] results = a.divideAndRemainder(b); System.out.println("商:" + results[0] + " 余数:" + results[1]); ``` --- ### 4. 关键注意事项 - `RoundingMode`包含多种模式:`HALF_UP`(四舍五入)、`CEILING`(向正无穷舍入)、`FLOOR`(向负无穷舍入)等 - 精度设置需结合业务需求,如金融计算常用`HALF_EVEN`(银行家舍入法) --- ### 代码示例 ```java public static void safeDivision() { try { BigDecimal numerator = new BigDecimal("10"); BigDecimal denominator = new BigDecimal("3"); BigDecimal result = numerator.divide(denominator, 5, RoundingMode.HALF_UP); System.out.println("安全计算结果:" + result); // 输出3.33333 } catch (ArithmeticException e) { System.out.println("异常已正确处理"); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值