对于常规的计算属性,都是直接返回单个值,如:

 computed: {
result() {
return this.one + this.two
}
}

其实也可以返回一个方法。且看下面的代码:

<template>
<el-table :data="data" border fit highlight-current-row style="width: 100%;">
<el-table-column label="评价项">
<template slot-scope="scope">
<el-input v-model="scope.row.name" :autosize="{ minRows: 3, maxRows: 3}" readonly size="small" type="textarea"
placeholder="请输入" />
</template>
</el-table-column>
<el-table-column label="选择得分项" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.choiceScore" placeholder="请选择" size="small" style="width: 90%"
@change="setScoreMinAndMax($event, scope.row)">
<el-option v-for="item in scope.row.gradeList" :key="item.id" :label="item.scoreStr" :value="item.id" />
</el-select>
</template>
</el-table-column>
<el-table-column label="得分">
<template slot-scope="scope">
<el-input-number v-model="scope.row.score" :max="getMaxVal(scope.row)" :min="getMinVal(scope.row)"
:precision="2" clearable size="small" />
</template>
</el-table-column>
</el-table>
</template> <script> export default {
data() {
return {
data: [
{
id: 101,
name: '物流服务',
choiceScore: '',
score: 0,
gradeList: [{
id: 1,
scoreStr: '0-3分,不满意',
minVal: 0,
maxVal: 3
}, {
id: 2,
scoreStr: '4-6分,比较满意',
minVal: 4,
maxVal: 6
}, {
id: 3,
scoreStr: '7-9分,非常满意',
minVal: 7,
maxVal: 9
}, {
id: 4,
scoreStr: '10-10分,超级满意',
minVal: 10,
maxVal: 10
}]
},
{
id: 102,
name: '商家服务',
choiceScore: '',
score: 0,
gradeList: [{
id: 20,
scoreStr: '0-3分,不满意',
minVal: 0,
maxVal: 3
}, {
id: 21,
scoreStr: '4-6分,比较满意',
minVal: 4,
maxVal: 6
}, {
id: 22,
scoreStr: '7-10分,非常满意',
minVal: 7,
maxVal: 10
}]
},
{
id: 103,
name: '商品描述',
choiceScore: '',
score: 0,
gradeList: [{
id: 66,
scoreStr: '0-1分,描述不符合',
minVal: 0,
maxVal: 1
}, {
id: 67,
scoreStr: '1-2分,基本符合',
minVal: 1,
maxVal: 2
}, {
id: 68,
scoreStr: '3-5分,非常符合',
minVal: 3,
maxVal: 5
}]
}
], }
},
computed: {
//获取最大值
getMaxVal(row) {
return function (row) {
let val = Infinity //Infinity表示无限大
if (row.gradeList) {
if (row.maxVal) {
val = row.maxVal
} else {
if (row.score && row.choiceScore) {
for (var item of row.gradeList) {
if (item.minVal >= row.score && item.maxVal <= row.score) {
val = item.maxVal
break
}
}
} else {
val = row.gradeList[0].maxVal
}
}
}
return
val
}
}
,
//获取最小值
getMinVal(row) {
return function (row) {
let val = 0
if (row.gradeList) {
if (row.minVal) {
val = row.minVal
} else {
if (row.score && row.choiceScore) {
for (var item of row.gradeList) {
if (item.minVal >= row.score && item.maxVal <= row.score) {
val = item.minVal
break
}
}
} else {
val = row.gradeList[0].minVal
}
}
}
return val
}
}
},
methods: {
isBlankStr(str) {
if (str === undefined || str == null) {
return true
} else {
return false
}
},
setScoreMinAndMax(v, row) {
(row.gradeList).forEach(item => {
if (v === item.id) {
row.minVal = this.isBlankStr(item.minVal) ? 0 : item.minVal
row.maxVal = this.isBlankStr(item.maxVal) ? Infinity : item.maxVal
row.score = row.maxVal
}
})
},
}, } </script> <style scoped>
</style>

效果图如下:

业务说明:需要对不同的评价项选择不同的得分项,同时而在得分栏自动变成对应得分项的最大值。分数可以调整,但只能在得分项的范围内修改。

技术分析:对于得分这一栏,需要动态的根据得分项来获取最大值和最小值,不能使用简单的单个计算属性,需要使用方法计算最终值并返回。

因此在代码中,第一处红色的地方使用计算属性,第二处代码用来计算最值,其返回值是一个function,也就是方法。

Vue中计算属性是方法的更多相关文章

  1. vue中计算属性computed方法内传参

    vue中computed计算属性无法直接进行传参 如果有传参数的需求比如说做数据筛选功能可以使用闭包函数(也叫匿名函数)实现 例如: 在上篇博客vue安装使用最后的成绩表练习中的过滤功能的实现: &l ...

  2. 浅谈Vue中计算属性(computed)和方法(methods)的差别

    浅谈Vue中计算属性(computed)和方法(methods)的差别 源码地址 methods方法和computed计算属性,两种方式的最终结果确实是完全相同 计算属性是基于它们的响应式依赖进行缓存 ...

  3. vue中计算属性的get与set方法

    计算属性get set方法 在vue的计算属性中,所定义的都是属性,可以直接调用 正常情况下,计算属性中的每一个属性对应的都是一个对象,对象中包括了set方法与get方法 computed:{ ful ...

  4. vue的计算属性与方法的不同

    计算属性 vue的模板里可以使用表达式,但是它的设计初衷是用于简单计算,在模板中放入太多逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...

  5. Vue中计算属性、侦听、过滤、自定义指令、ref的操作

    1.计算属性 <div id="app"> <input type="text" v-model="x"> < ...

  6. Vue中计算属性(computed)和监听属性函数watch的比较

    1.计算属性适用的情形我们可能会有这样的需求,一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性.例如在下面这个例子中,如果我们使用监听函数,代码就会变得有点冗余. ...

  7. 浅谈Vue中计算属性computed的实现原理

    虽然目前的技术栈已由Vue转到了React,但从之前使用Vue开发的多个项目实际经历来看还是非常愉悦的,Vue文档清晰规范,api设计简洁高效,对前端开发人员友好,上手快,甚至个人认为在很多场景使用V ...

  8. Vue中计算属性与class,style绑定

    var vm=new Vue({ el:'#app', data:{ a:2, }, computed:{ //这里的b是计算属性:默认getter b:{ get:function(){ retur ...

  9. vue中计算属性中的set和get

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <body& ...

  10. vue中计算属性和侦听属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 统计的系统客观性与动态进化性•Freq频率与Bayes两大学派及争论•统计推断•Bayes学派及其基本观点与Bayes估计

    统计的系统客观性: 统计数据及其活动不是片面的,而是系统客观反映客观现象. 周期的做"总体统计" + 随机/按需/周期做"抽样统计": 统计的动态进化性: 统计 ...

  2. Linguistics-English-近义词: Occur VS. Happen VS. Take Place

    Linguistics-English-近义词: Occur VS. Happen VS. Take Place Conclusion In conclusion, occur is more for ...

  3. SciTech-Python-编译Python的C/C++扩展的setup.py使用pybind映射C/C++到Python库

    pybind:pybind11 - Seamless operability between C++11 and Python header-only library exposes C++ type ...

  4. SciTech-Mathematics-Probability+Statistics-Matlab(Mathworks Inc.): MATLAB官方文档就是非常好的教材

    SciTech-Mathematics-Probability+Statistics Probability Distributions: https://ww2.mathworks.cn/help/ ...

  5. SciTech-Math-Complex Analysis复分析: Complex复数 + De Moivre's Formula:帝魔服公式 + Euler's Formula:欧拉公式

    https://www.desmos.com/calculator/v1nugr08y5 https://mathvault.ca/euler-formula/ https://www.britann ...

  6. Unity开源搜索引擎

    https://unitylist.com/

  7. 13Java基础之final关键字、常量详解

    final关键字 final关键字是最终的意思,可以修饰(类.方法.变量) 修饰类:该类被称为最终类,特点是不能被继承了.例如工具类. 修饰方法:该方法被称为最终方法,特点是不能被重写了. 修饰变量: ...

  8. 超级计算 CST DC分布式作业模型已经完成,但一直没有返回数据

    问题:CST DC作业主要涉及到前端节点(登陆节点),主控制器,和求解器,也即是frontend(登陆节点)---DC maincontrol(MC节点)---DC Solver Servers(计算 ...

  9. MD5 + Base64 加密

    昨天做顺丰快递(丰桥API)的对接时,发现他们需要的签名是MD5+BASE64,而且需要转成UTF-8的编码.丰桥的例子是用JAVA做的,我尝试换成了DELPHI.并且有几种不同的方法. uses E ...

  10. MyEMS 4G 网关:打造高效协同的能源管理中枢

    在工业物联网与能源数字化管理加速融合的今天,MyEMS 4G 网关以其强大的兼容性与智能化设计,成为连接现场设备与云端管理系统的关键枢纽.这款专为 MyEMS 开源能源管理系统量身打造的工业级设备,不 ...