vue计算属性和监听器区别

区别

  • 计算属性可以简化差值表达式写法
  • 计算属性变量定义在computed中,可以直接使用在{}中的,跟methods中函数类似,只不过有利于缓存,性能更好
  • 计算属性可以防止监听属性的滥用,但一些异步请求,计算属性做不到,还得watch来完成。

例如:解决element-ui分页中删除页面最后一条数据时,currentPage没有减一,页面列表为空问题时,就可以用到监听属性

监听页面的总条数,并对总条数进行判断。从而刷新列表

<el-pagination
    layout="prev, pager, next"
    @current-change="changePageNum"
    :current-page="currentPage"
    :page-size="pageSize"
    :total="total">
</el-pagination>
watch:{
      total(){
        if(this.total==(this.currentPage-1)*this.pageSize&& this.total!=0){
          this.currentPage-=1;
          getDiscountList(this);//获取列表数据
        }
      }
    }

要使用分页,返回部分数据时,可以使用计算属性

    computed: {
      limitData() {
        let data = [...this.table1Datas];
        return data;
      },
      // 因为要动态计算总页数,所以还需要一个计算属性来返回最终给 Table 的 data
      dataWithPage() {
        const data = this.limitData;
        const start = this.current * this.size - this.size;
        const end = start + this.size;
        return [...data].slice(start, end);
      },
      //替换数据中的回车符
      content: function(msg) {
        return msg.replace('\n', '<br>');
      },

    },

计算属性和监听属性结合起来用

结合使用效果更佳

  • 需求:根据公积金比率和员工工资,计算公积金数
<Form ref="form" :model="data" :rules="rules" label-position="top" class="ivu-mt">

<Card :bordered="false" dis-hover title="五险一金信息">
    <Row :gutter="24">
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="养老金基数:">
                <Input :readonly="true" v-model="data.pensionBase" placeholder="自动计算"/>
            </FormItem>
        </Col>

        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="养老金比率:" prop="pensionPer" label-for="pensionPer">
                <Input :readonly="true" v-model="data.pensionPer" placeholder="请输入"
                       element-id="pensionPer"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="医疗基数:">
                <Input :readonly="true" v-model="data.medicalBase" placeholder="自动计算"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="医疗保险比率:" prop="medicalPer" label-for="medicalPer">
                <Input :readonly="true" v-model="data.medicalPer" placeholder="请输入"
                       element-id="medicalPer"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="失业保险基数:">
                <Input :readonly="true" v-model="data.unempBase" placeholder="自动计算"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="失业保险比率:">
                <Input :readonly="true" v-model="data.unempPer"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="工伤保险基数:">
                <Input :readonly="true" v-model="data.injuryBase"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="工伤保险比率:">
                <Input :readonly="true" v-model="data.injuryPer"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="生育保险基数:">
                <Input :readonly="true" v-model="data.bithinsuranceBase"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="生育保险比率:">
                <Input :readonly="true" v-model="data.bithinsurancePer" placeholder="请输入"/>
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="公积金基数:">
                <Input  v-model="data.accumulationFundBase" placeholder="不填则自动计算"
                />
            </FormItem>
        </Col>
        <Col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
            <FormItem label="公积金比率:">
                <Input v-model="data.accumulationFundPer" placeholder="不填则自动计算"
                />
            </FormItem>
        </Col>
    </Row>
</Card>
</Form>
         
通过监听属性监听数据的变化,结合计算属性,计算出相应值,然后返回即可
data() {
   return {
	data: {
	nickName:'',
	deptName: '',
	account: '',
	basicSalary: '',
	bonus: '0',
	lunchSalary: '0',
	leaveDel: '0',
	overworkAdd: '0',
	attendanceDel: '0',
	allSalary: '0',
	shouldSalary: '',
	createDate: '',
	//五险一金
	pensionBase: '',//养老金基数
	pensionPer: '0.08',//养老金比率
	medicalBase: '',//医疗基数
	medicalPer: '0.08',//医疗保险比率
	unempBase: '',//失业保险基数
	unempPer: '0.01',//失业保险比率
	injuryBase: '0',//工伤保险基数
	injuryPer: '0',//工伤保险比率
	bithinsuranceBase: '0',//生育保险基数
	bithinsurancePer: '0',//生育保险比率
	accumulationFundBase: '',//公积金基数
	accumulationFundPer: '',//公积金比率
	},
   }
   },
           computed: {
            labelWidth() {
                return this.isMobile ? undefined : 140;
            },
            labelPosition() {
                return this.isMobile ? 'top' : 'left';
            },
            //计算养老金基数
            newPensionBase() {
                return this.data.pensionPer * this.data.basicSalary;
            },
            //计算医疗基数
            newmedicalBase() {
                return this.data.medicalPer * this.data.basicSalary;
            },
            //计算失业保险基数
            newunempBase() {
                return this.data.unempPer * this.data.basicSalary;
            },
            //计算公积金比率
            newaccumulationFundPer() {
                let basicSalary = this.data.basicSalary
                if (basicSalary != null) {
                    switch (true) {
                        /*1、工资范围在1-5000元之间的,包括百5000元,适用个人所得税税率为0%。 速算扣除数(元)0*/
                        case basicSalary < 5000:
                            this.data.accumulationFundPer = 0;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*2、工资范围在5000-8000元之间的,包括度8000元,适用个人所得税税率为3%。 速算扣除数(元)105*/
                        case basicSalary >= 5000 && basicSalary <80000:
                            this.data.accumulationFundPer = 0.03;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*3、工资范围在8000-17000元之间的,包括17000元,适用个人所得税税率为10%。速算扣除数(元)555*/
                        case basicSalary >8000 && basicSalary <= 17000:
                            this.data.accumulationFundPer = 0.1;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*4、工资范围在17000-30000元之间的,包括30000元,适用个人所得税税率为20%。速算扣除数(元)1005*/
                        case basicSalary > 17000 && basicSalary <= 30000:
                            this.data.accumulationFundPer = 0.2;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*5、工资范围在30000-40000元之间的,包括40000元,适用个人所得税税率为25%。速算扣除数(元)2755*/
                        case basicSalary >30000 && basicSalary <= 40000:
                            this.data.accumulationFundPer = 0.25;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*6、工资范围在40000-60000元之间的,包括60000元,适用个人所得税税率为30%。速算扣除数(元)5505*/
                        case basicSalary >40000 && basicSalary <= 60000:
                            this.data.accumulationFundPer = 0.3;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        /*7、工资范围超过60000的,适用个人所得税税率为45%。速算扣除数(元)13505*/
                        case basicSalary >60000:
                            this.data.accumulationFundPer = 0.45;
                            return this.data.basicSalary * this.data.accumulationFundPer;
                            break;
                        default:
                            break;
                    }
                }

            }
        },
        watch: {

            //养老金基数
            newPensionBase(val) {
                this.data.pensionBase = val;
            },
            //医疗基数
            newmedicalBase(val) {
                this.data.medicalBase = val;
            },
            //失业保险基数
            newunempBase(val) {
                this.data.unempBase = val;
            },
            //公积金基数
            newaccumulationFundPer(val) {
                this.data.accumulationFundBase = val;
            }
        },

效果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,计算属性监听器都是响应数据变化的方式,但是它们的用法和作用略有不同。 计算属性是基于响应式数据计算而来的属性,当计算属性所依赖的数据发生变化时,计算属性会自动重新计算。计算属性的特点是可以缓存结果,只有在计算属性所依赖的数据发生变化时才会重新计算。计算属性通常用于需要依赖多个数据计算得出的值,或者需要对数据进行处理后返回一个新的值的情况。 ```html <template> <div> <p>{{ fullName }}</p> </div> </template> <script> export default { data() { return { firstName: 'John', lastName: 'Doe' } }, computed: { fullName() { return `${this.firstName} ${this.lastName}` } } } </script> ``` 在上面的示例中,`fullName`是一个计算属性,它依赖于`firstName`和`lastName`两个响应式数据,当`firstName`或`lastName`发生变化时,`fullName`会自动重新计算。 监听器是用于监听某个数据的变化,当该数据发生变化时,监听器会执行指定的回调函数。监听器的特点是不能缓存结果,每次数据变化时都会执行回调函数。监听器通常用于需要在数据变化时执行一些异步操作的情况。 ```html <template> <div> <p>Name: {{ name }}</p> </div> </template> <script> export default { data() { return { firstName: 'John', lastName: 'Doe' } }, computed: { name() { return `${this.firstName} ${this.lastName}` } }, watch: { name(newName, oldName) { console.log(`Name changed from ${oldName} to ${newName}`) } } } </script> ``` 在上面的示例中,`name`是一个计算属性,它依赖于`firstName`和`lastName`两个响应式数据,当`firstName`或`lastName`发生变化时,`name`会自动重新计算。同时,我们定义了一个监听器监听`name`的变化,当`name`发生变化时,回调函数会被执行。注意,监听器的回调函数接受两个参数,分别是新值和旧值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值