mobile-workflow/components/form/CalcFormula.vue
2024-04-28 10:10:03 +08:00

82 lines
1.7 KiB
Vue

<template>
<view>
<text>{{formProps.placeholder || '计算结果:'}}</text>
<text>{{_value}}</text>
</view>
</template>
<script setup>
import { ref, computed, watch } from 'vue'
const props = defineProps({
formProps: {
type: Object,
default: () => {
return {}
}
},
formData: {
type: Object,
default: () => {
return {}
}
},
index: Number,
modelValue: Number,
readonly: Boolean
})
const _value = computed({
get() {
return props.modelValue
},
set(val) {
emits('update:modelValue', val)
}
})
const execute = ref(null)
const explainStr = computed(() => {
let explain = ''
execute.value = null
props.formProps.explain.forEach(item => {
const v = String(item.symbol || item)
if (/[0-9.]$/.test(v)) {
explain += v
} else {
explain += v + ' '
}
})
return explain
})
const emits = defineEmits(['update:modelValue'])
function doExc() {
try {
if (!(execute.value instanceof Function)) {
if (props.formProps.isPlus) {
const jsExplain = props.formProps.jsCode.replace(/\[\?\]/g, m => '[$_index]')
execute.value = new Function('formData',
`let $_index = ${props.index > 0 ? props.index - 1 : 0}; ${jsExplain} return execute(formData)`
)
} else {
execute.value = new Function('formData', `return ${explainStr.value}`)
}
}
let result = execute.value(props.formData)
_value.value = props.formProps.precision > 0 ? (Number.isNaN(result) ? NaN : parseFloat(result.toFixed(this
.precision))) : parseInt(result)
} catch (e) {
_value.value = NaN
}
}
watch(() => props.formData, () => {
doExc()
}, { deep: true })
</script>
<style>
</style>